当我运行“clean and build”时,只有.jar
文件夹位于lib
文件的同一文件夹中时,才会运行正在创建的.jar
文件。
因此,如果我将jar文件移动到桌面并将lib
文件夹保留在dist
文件夹中,则jar文件会给我一个例外。
我该如何处理这个问题?
答案 0 :(得分: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>
这会创建一个jar文件(Combined-dist.jar),它是dist jar和指定库jar的组合(在本例中,是commons-io-1.4.jar,ninja-utils-3.2.jar和unicorn -1.0.jar)。您必须确保为新的jar文件指定Main Class包,否则当您尝试打开它时它将无法运行。
答案 1 :(得分:13)
如果您将罐子复制到源代码目录中,它们将在您的最终罐子中。毫无疑问,我不确定这是否会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目录中, 覆盖旧的。测试罐子。
答案 2 :(得分:7)
将每个依赖库(* .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 ,然后选择运行目标,然后选择其他目标,最后点击包换存储强>
5)在这里你完成了。现在您可以像dist
文件夹一样检查,会有一个store
文件夹,其中包含您的最终完整jar,包括所有依赖库。现在,无论何时想要更改/添加更多库,只需按照步骤4进行操作。
第4步的图片
答案 3 :(得分:5)
您可以从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 User Manual中查看更多内容。
答案 4 :(得分:3)
如果您要将应用分发到另一台电脑
你只需将.jar与lib文件夹一起压缩。
如果想从您电脑中的任何位置运行您的应用
接受考虑Maven的做法 - 创建本地存储库,例如。 C:\ libs您的库将存在,而.jar可以稍后从您的电脑中的任何位置访问它们。
或者你可以使用Maven。有关使用所有依赖项(库)分发应用程序的讨论:Java: How do I build standalone distributions of Maven-based projects?。
答案 5 :(得分:3)
将该jar文件复制到:
C:\ Program Files \ Java \ jdk \ jre \ lib \ ext
和
C:\ Program Files \ Java \ jre \ lib \ ext
您应该能够在Netbeans和手动导入中使用它,就像标准导入一样。
答案 6 :(得分:2)
我找到了解决此问题的最简单方法here。您只需要复制项目文件夹中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>
标记之前添加代码。
现在将第一个属性字段的值更改为已注释并保存更改。
从现在开始,每次清洁&amp;构建项目,将在项目dist文件夹
答案 7 :(得分:1)
这对我有用:
我在我的项目中内置了excel导出功能。我用于此目的的两个外部.jars是jxl.jar end sx.jar
使用7-Zip将这2个罐子解压缩到一个文件夹(java类)中,不带任何META文件。将项目jar解压缩到包含META文件的同一文件夹中。
使用JARMaker重新打包整个java类文件夹,在其原始分发文件夹中重新创建Project .jar ...然后你就可以了...完全的excel功能。
答案 8 :(得分:1)
user1016588的解决方案适合我。有一个错字:这一行应该是 zipfileset src =“dist / lib / commons-io-1.4.jar”excludes =“META-INF / *”
答案 9 :(得分:1)
试试这个 - 在Netbeans IDE中:
答案 10 :(得分:0)
请遵循以下规则: - 1.右键单击netbeans编辑器中打开的项目 2.选择属性 3.选择图书馆 4.加入罐子 5.单击确定
答案 11 :(得分:0)
您也可以使用它(当库不在“dist / lib”中时),使用NetBeans和ant-contrib进行测试:
colm1,colm2,colm3...colm159 from table;