[英]How can I include external jar on my Netbeans project
当我运行“清理并生成”了.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文件指定Main Class包,否则当您尝试打开它时它将不会运行。
如果将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)单击NetBeans中项目面板左侧的“ Files tab
。
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用户手册中的更多内容
如果您要将应用程序分发到另一台PC
你只需将.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导出功能。 我用于此目的的两个外部.jars是jxl.jar end sx.jar
使用7-Zip将这2个罐子解压缩到一个文件夹(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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.