我如何在我的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中:

  1. 转到工具 – >库
  2. 在对话框中,点击左下angular的“新库”,给出一个名字
  3. 在右侧,点击“添加JAR /文件夹”
  4. 点击右下angular的确定
  5. 重新启动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> 
  1. 转到您的build.xml,并在最后closures项目标记之前添加代码。

  2. 现在将第一个属性字段的值更改为注释

  3. 点击清理和生成,你的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>