23

当我运行“清理并构建”时.jar,正在创建的文件仅在lib文件夹位于文件的同一文件夹时运行.jar

所以如果我把jar文件移动到桌面,把lib文件夹留在文件dist夹里,jar文件会给我一个异常。

我该如何处理这个问题?

4

12 回答 12

23

我通过只创建一个包含所有库的 jar 文件解决了这个问题,将以下内容添加到 NetBeans 中的 build.xml 文件中:

<target name="-post-jar">
  <jar jarfile="dist/Combined-dist.jar">
    <zipfileset src="${dist.jar}" excludes="META-INF/*" />
    <zipfileset src="lib/commons-io-1.4.jar" excludes="META-INF/*" />
    <zipfileset src="lib/ninja-utils-3.2.jar" excludes="META-INF/*" />
    <zipfileset src="lib/unicorn-1.0.jar" excludes="META-INF/*" />
    <manifest>
        <attribute name="Main-Class" value="com.example.mypackage.Main"/>
    </manifest>
  </jar>
</target>

这将创建一个 jar 文件 (Combined-dist.jar),它是 dist jar 和指定的库 jar(在本例中为 commons-io-1.4.jar、ninja-utils-3.2.jar 和 unicorn-1.0.jar)的组合。罐)。您必须确保为新的 jar 文件指定主类包,否则当您尝试打开它时它不会运行。

于 2013-02-14T16:53:02.423 回答
13

如果您将 jar 复制到源代码目录中,它们将在您的最终 jar 中。尽管如此,我不确定这是否会 100% 有效。

java-forum上有一篇很棒的帖子,内容如下:

除了少数几种情况,最适合我的是手动合并文件。.jar 基本上是一个带有组织内容的 .zip,您可以在几乎任何支持 .zip 的存档程序中打开它们(我只使用 gnome 的标准存档器 File Roller,它工作得很好)。备份您的 jar 文件并在您选择的存档器中打开它,并对库目录中的每个库 jar 执行相同的操作。将每个库中的工作文件夹(IE,除了 META-INF 目录之外的所有内容)拖放到 jar 的根路径中(与 META-INF 和应用程序的根包一起)。现在将 META-INF/MANIFEST.MF 文件从 jar 拖到桌面或任何其他文件夹。打开它,擦除 Class-Path 和 X-COMMENT 行。不要忘记在文件末尾留一个空白换行符!保存新的清单文件并将其拖回 jar 的 META-INF 目录,覆盖旧的。测试罐子。

于 2012-05-31T13:41:55.370 回答
9

将每个依赖库 (*.jar) 打包到一个 myProject.jar 中真的很容易。

只需按照这些步骤,您最终会将每个依赖库打包到单个 jar 中。如果您使用的是 NetBeans,那么您可以完全按照,否则您需要在项目文件中找到您的build.xml文件。

按照以下步骤编辑build.xml

1) 单击Files tabNetBeans 中项目面板左侧的 。

2)双击build.xml文件并在行前添加这些</project>

 <target name="package-for-store" depends="jar">
    <property name="store.jar.name" value="myProject"/>
    <property name="store.dir" value="store"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
    <delete dir="${store.dir}"/>
    <mkdir dir="${store.dir}"/>
    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>
        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>
    <zip destfile="${store.jar}">
        <zipfileset src="${store.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>
    <delete file="${store.dir}/temp_final.jar"/>
</target>

3)根据您的项目名称更改value代码的第二行

<property name="store.jar.name" value="myProject"/> //<---Just value not name

4) 保存并右键单击build.xml并选择Run TargetOther Targets最后单击Package-for-store

5) 到此,你就完成了。现在你可以像dist文件夹一样去检查,会有一个store文件夹包含你最终的完整jar,包括你所有的依赖库。现在,每当您想更改/添加更多库时,只需按照第 4 步操作即可。

步骤 4 的图片

在此处输入图像描述

于 2014-11-08T08:38:51.013 回答
5

从 1.7 版开始,您可以使用 Apache Ant 来构建 JAR,而所需的库仅包含在一个文件中。你可以有一个配置文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="buildJar">
    <target name="buildJar">
        <!-- Name of jar -->
        <jar destfile="C:/MyJar.jar" filesetmanifest="mergewithoutmain">
            <manifest>
                <!-- Your class with the main method -->
                <attribute name="Main-Class" value="myPackage.MyClass"/>
                <!-- Path in the jar -->
                <attribute name="Class-Path" value="."/>
            </manifest>
            <!-- Dir of compiled class -->
            <fileset dir="C:/NetBeansProjects/MyProject/bin"/>
            <!-- Include required jars -->
            <zipfileset excludes="META-INF/*.SF" 
                src="C:/NetBeansProjects/MyProject/lib/library1.jar"/>
            <zipfileset excludes="META-INF/*.SF" 
                src="C:/NetBeansProjects/MyProject/lib/library2.jar"/>
        </jar>
    </target>
</project>

在 Netbeans 中,将 XML 文件放在您的项目中并使用上下文菜单运行它。

在Apache Ant 用户手册中查看更多信息。

于 2012-05-31T13:54:26.813 回答
3

如果您要将您的应用分发到另一台电脑

您只需将 .jar 与 lib 文件夹一起压缩。

如果想从你电脑的任何地方运行你的应用程序

考虑 Maven 这样做的方式 - 创建本地存储库,例如。C:\libs 您的库将存在的位置,并且 .jar 以后可以从您电脑中的任何位置访问它们。

或者你可以只使用 Maven。有一个关于分发具有所有依赖项(库)的应用程序的讨论:Java:如何构建基于 Maven 的项目的独立分发?.

于 2012-05-31T13:35:08.040 回答
3

将该 jar 文件复制到:

C:\Program Files\Java\jdk\jre\lib\ext

C:\Program Files\Java\jre\lib\ext

您应该能够在 Netbeans 和手动导入中使用它,就像标准导入一样。

于 2012-07-07T09:04:22.130 回答
2

我在这里找到了解决这个问题的最简单的方法。您只需复制build.xml项目文件夹中文件末尾的下一个代码片段。

<target name="-post-jar">

    <!-- Change the value to the name of the final jar without .jar -->
    <property name="store.jar.name" value="MyJarName"/>

    <!-- don't edit below this line -->
    <property name="store.dir" value="dist"/>
    <property name="temp.dir" value="temp"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

    <delete dir="${temp.dir}"/>
    <mkdir dir="${temp.dir}"/>

    <jar destfile="${temp.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>

        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>

    <delete dir="${store.dir}"/>

    <zip destfile="${store.jar}">
        <zipfileset src="${temp.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>

    <delete dir="${temp.dir}"/>

</target>
  1. 转到项目根目录中的 build.xml 并在</project>最后的标记之前添加代码。

  2. 现在更改注释的第一个属性字段的值并保存更改。

  3. 从现在开始,每次清理和构建项目时,都会在项目 dist 文件夹中生成带有依赖项的完整 jar

于 2015-05-11T16:23:59.620 回答
1

这对我有用:

我在我的项目中内置了 excel 导出功能。我用于此目的的 2 个外部 .jar 是 jxl.jar end sx.jar

使用 7-Zip 将这 2 个 jar 解压到一个文件夹(java 类)中,无需任何 META 文件。将您的项目 jar 解压到包含 META 文件的同一文件夹中。

使用 JARMaker 重新打包整个 java 类文件夹,在其原始分发文件夹中重新创建您的 Project .jar ......然后就可以了......完整的 excel 功能。

于 2013-04-11T13:08:37.783 回答
1

user1016588 的解决方案对我有用。有一个错字:这一行应该是 zipfileset src="dist/lib/commons-io-1.4.jar" excludes="META-INF/*"

于 2013-04-17T19:33:52.067 回答
1

试试这个 - 在 Netbeans IDE 中:

  1. 转到工具 --> 库
  2. 在对话框中,在左下角单击“新建库”,命名
  3. 在右侧,单击“添加 JAR/文件夹”
  4. 点击右下角的确定
  5. 重新启动IDE并检查。
于 2013-12-27T16:38:14.180 回答
0

请遵循以下步骤:- 1. 右键单击​​在 netbeans 编辑器中打开的项目 2. 选择属性 3. 选择库 4. 添加 jar 5. 单击确定

于 2014-04-16T09:52:28.223 回答
0

您也可以使用它(当库不在“dist/lib”中时),使用 NetBeans 和 ant-contrib 进行测试:

	<target name="-post-jar">
		<taskdef resource="net/sf/antcontrib/antlib.xml">
		  <classpath>
			<!-- Path to ant-contrib -->
			<pathelement location="../../Libs/ant-contrib-1.0b3.jar"/>
		  </classpath>
		</taskdef>

		<!-- Change the value to the name of the final jar without .jar -->
		<property name="store.jar.name" value="${application.title}"/>

		<!-- don't edit below this line -->
		<property name="store.dir" value="dist"/>
		<property name="temp.dir" value="temp"/>
		<property name="temp.libs.dir" value="temp/libs"/>
		<property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

		<echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
		
		<fileset id="store.jars.absolute" dir="${store.dir}" includes="*.jar"/>		
		<pathconvert property="store.jars.relative" refid="store.jars.absolute" dirsep="/">
			<map from="${basedir}/" to=""/>
		</pathconvert>
		
		<for list="${store.jars.relative}" param="item">
			<sequential>
				<echo message="Adding @{item} into single JAR at ${store.jar}"/>
			</sequential>
		</for>

		<delete dir="${temp.dir}"/>
		<mkdir dir="${temp.dir}"/>
		
		<for list="${javac.classpath}" param="item" delimiter=":">
			<sequential>
				<echo message="Adding @{item} into single JAR at ${store.jar}"/>
				<copy file="@{item}" todir="${temp.libs.dir}" overwrite="true" />
			</sequential>
		</for>

		<jar destfile="${temp.dir}/temp_final.jar" filesetmanifest="skip">
			<zipgroupfileset dir="${store.dir}" includes="*.jar"/>
			<zipgroupfileset dir="${temp.libs.dir}" includes="*.*"/>

			<manifest>
				<attribute name="Main-Class" value="${main.class}"/>
			</manifest>
		</jar>

		<delete dir="${store.dir}"/>

		<zip destfile="${store.jar}">
			<zipfileset src="${temp.dir}/temp_final.jar" excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
		</zip>

		<delete dir="${temp.dir}"/>

	</target>

于 2017-06-12T11:43:22.343 回答