ksm*_*001 23 java netbeans jar
当我运行"clean and build"时,.jar只有当lib文件夹位于.jar文件的同一文件夹时,才会运行正在创建的文件.
因此,如果我将jar文件移动到桌面并将lib文件夹保留在文件dist夹中,那么jar文件将给我一个例外.
我该如何处理这个问题?
Hem*_*ela 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>
Run Code Online (Sandbox Code Playgroud)
这将创建一个jar文件(Combined-dist.jar),它是dist jar和指定库jar的组合(在本例中为commons-io-1.4.jar,ninja-utils-3.2.jar和unicorn-1.0).罐).您必须确保为新的jar文件指定Main Class包,否则当您尝试打开它时它将不会运行.
rli*_*den 13
如果将jar复制到源代码目录中,它们将在最终的jar中.毫无疑问,我不确定这是否会100%有效.
在java-forum上有一篇很棒的文章说明如下:
除少数情况外,对我来说最有效的方法是手动合并文件..jar基本上是一个带有组织内容的.zip,您可以在几乎任何.zip功能的归档程序中打开它们(我只使用gnome的标准归档程序,File Roller,它运行良好).备份您的jar文件并在您选择的归档器中打开它,并对库目录中的每个库jar执行相同的操作.将每个库中的工作文件夹(IE,除META-INF目录之外的所有内容)拖放到jar的根路径中(与META-INF和应用程序的根程序包一起).现在将jar中的META-INF/MANIFEST.MF文件拖到桌面或任何其他文件夹中.打开它,擦除Class-Path和X-COMMENT行.不要忘记在文件末尾留下空白换行符!保存新的清单文件并将其拖回到jar的META-INF目录中,覆盖旧的清单文件.测试罐子.
将每个依赖库(*.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>
Run Code Online (Sandbox Code Playgroud)
3)value根据您的项目名称更改代码的第二行
<property name="store.jar.name" value="myProject"/> //<---Just value not name
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
在Netbeans中,将XML文件放在项目中并使用上下文菜单运行它.
查看更多在Apache Ant的用户手册.