当我运行“清理并构建”时.jar
,正在创建的文件仅在lib
文件夹位于文件的同一文件夹时运行.jar
。
所以如果我把jar文件移动到桌面,把lib
文件夹留在文件dist
夹里,jar文件会给我一个异常。
我该如何处理这个问题?
我通过只创建一个包含所有库的 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 文件指定主类包,否则当您尝试打开它时它不会运行。
如果您将 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 目录,覆盖旧的。测试罐子。
将每个依赖库 (*.jar) 打包到一个 myProject.jar 中真的很容易。
只需按照这些步骤,您最终会将每个依赖库打包到单个 jar 中。如果您使用的是 NetBeans,那么您可以完全按照,否则您需要在项目文件中找到您的build.xml文件。
按照以下步骤编辑build.xml
1) 单击Files tab
NetBeans 中项目面板左侧的 。
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 Target和Other Targets最后单击Package-for-store
5) 到此,你就完成了。现在你可以像dist
文件夹一样去检查,会有一个store
文件夹包含你最终的完整jar,包括你所有的依赖库。现在,每当您想更改/添加更多库时,只需按照第 4 步操作即可。
步骤 4 的图片
从 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 用户手册中查看更多信息。
如果您要将您的应用分发到另一台电脑
您只需将 .jar 与 lib 文件夹一起压缩。
如果想从你电脑的任何地方运行你的应用程序
考虑 Maven 这样做的方式 - 创建本地存储库,例如。C:\libs 您的库将存在的位置,并且 .jar 以后可以从您电脑中的任何位置访问它们。
或者你可以只使用 Maven。有一个关于分发具有所有依赖项(库)的应用程序的讨论:Java:如何构建基于 Maven 的项目的独立分发?.
将该 jar 文件复制到:
C:\Program Files\Java\jdk\jre\lib\ext
和
C:\Program Files\Java\jre\lib\ext
您应该能够在 Netbeans 和手动导入中使用它,就像标准导入一样。
我在这里找到了解决这个问题的最简单的方法。您只需复制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>
转到项目根目录中的 build.xml 并在</project>
最后的标记之前添加代码。
现在更改注释的第一个属性字段的值并保存更改。
从现在开始,每次清理和构建项目时,都会在项目 dist 文件夹中生成带有依赖项的完整 jar
这对我有用:
我在我的项目中内置了 excel 导出功能。我用于此目的的 2 个外部 .jar 是 jxl.jar end sx.jar
使用 7-Zip 将这 2 个 jar 解压到一个文件夹(java 类)中,无需任何 META 文件。将您的项目 jar 解压到包含 META 文件的同一文件夹中。
使用 JARMaker 重新打包整个 java 类文件夹,在其原始分发文件夹中重新创建您的 Project .jar ......然后就可以了......完整的 excel 功能。
user1016588 的解决方案对我有用。有一个错字:这一行应该是 zipfileset src="dist/lib/commons-io-1.4.jar" excludes="META-INF/*"
试试这个 - 在 Netbeans IDE 中:
请遵循以下步骤:- 1. 右键单击在 netbeans 编辑器中打开的项目 2. 选择属性 3. 选择库 4. 添加 jar 5. 单击确定
您也可以使用它(当库不在“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>