我如何在我的Netbeans项目中包含外部jar
当我运行“clean and build”时,只有当lib
文件夹位于.jar
文件的同一文件夹时,才会运行正在创build的.jar
文件。
所以,如果我将jar文件移动到桌面上,并将dist
文件夹中的lib
文件夹保存在jar文件中,那么jar文件会给我一个例外。
我该如何处理这个问题呢?
如果你把你的jar文件复制到源代码目录中,它们将会在你的最终jar文件中。 Nevetheless,我不知道这是否会100%的时间。
在java论坛有一个伟大的职位,说明如下:
除了less数情况之外,最适合我的是手动合并文件。 .jar基本上是一个带有组织内容的.zip文件,几乎可以在任何.zip兼容的压缩文件(我只是使用gnome的标准压缩文件,File Roller,而且效果很好)中打开它们。 备份你的jar文件,并在你select的存档器中打开它,并对库目录中的每个库jar执行相同的操作。 将每个库中的工作文件夹(IE,除META-INF目录外的所有东西)拖放到jar的根path(与您的META-INF和您的应用程序的根包一起)。 现在将META-INF / MANIFEST.MF文件从您的jar拖到您的桌面或任何其他文件夹。 打开它,并删除Class-Path和X-COMMENT行。 不要忘记在文件末尾留下一个空白的换行符! 保存新的清单文件并将其拖回到jar的META-INF目录中,覆盖旧的。 testingjar子。
我通过创build一个包含所有库的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>
这会创build一个jar文件(Combined-dist.jar),它是dist jar和指定的库jar(在这里是commons-io-1.4.jar,ninja-utils-3.2.jar和unicorn-1.0)的组合。jar)。 您必须确保为新的jar文件指定您的Main Class软件包,否则当您尝试打开它时将无法运行。
将每个相关的库(* .jar)打包到一个myProject.jar文件中非常简单。
只要按照这些步骤,你会最终打包每个依赖库到单个jar子。 如果您使用的是NetBeans,那么您可以严格遵守,否则您需要在项目文件中find您的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,然后select运行目标 ,然后select其他目标 ,最后点击Package-for-store
5)在这里你完成了。 现在你可以像dist
文件夹一样检查是否有一个store
文件夹,它将包含你的最终完整的jar包括你所有的依赖库。 现在,只要你想改变/添加更多的库,只需按照第4步。
第4步的图片
您可以使用1.7版本以上的Apache Ant来构build带有所需库的JAR文件。 你可以有一个configuration文件如下:
<?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的方式做到这一点 – 创build本地存储库,例如。 C:\ libs你的库存在的地方,而且.jar可以在你的电脑的任何地方稍后访问它们。
或者你可以使用Maven。 有关于分发具有所有依赖关系(库)的应用程序的讨论: Java:如何构build基于Maven的项目的独立分发? 。
将该jar文件复制到:
C:\ Program Files \ Java \ jdk \ jre \ lib \ ext
和
C:\ Program Files \ Java \ jre \ lib \ ext
您应该可以在Netbeans和手动导入中使用它,就像标准导入一样。
这对我来说是有效的:
我build立了excel导出function到我的项目。 我为此使用的两个外部.jar文件是jxl.jar end sx.jar
使用7-Zip将这两个jar包解压到一个文件夹(java类)中,而不需要任何META文件。 将你的项目jar包解压到包含META文件的文件夹中。
使用JARMaker重新打包整个Java类文件夹,以在其原始分布文件夹中重新创buildProject .jar …并且您可以…完整的Excelfunction。
user1016588的解决scheme适用于我。 有一个错字:这行应该是zipfileset src =“dist / lib / commons-io-1.4.jar”excludes =“META-INF / *”
试试这个 – 在Netbeans IDE中:
- 转到工具 – >库
- 在对话框中,点击左下angular的“新库”,给出一个名字
- 在右侧,点击“添加JAR /文件夹”
- 点击右下angular的确定
- 重新启动IDE并检查。
我已经开发出了这个问题的最简单的解决scheme。 你只需要改变一行代码。 这些库都是自动发现的。
开始了:
<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,并在最后closures项目标记之前添加代码。
-
现在将第一个属性字段的值更改为注释
-
点击清理和生成,你的jar将在dist文件夹中
遵循这些:1.右键单击netbeans编辑器中打开的项目2.select属性3.select库4.添加jar 5.单击确定
你也可以使用这个(当库不在“dist / lib”中),用NetBeans和ant-contribtesting:
<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>