我的jar在编译后将不会运行。我使用这个ant构建脚本
<project name="HelloWorld" basedir="." default="jar">
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="libsSrc" value="libs"/>
<property name="main-class" value="nat.ise.ApplicationStarter"/>
<path id="classpath">
<fileset dir="${libsSrc}" includes="*.jar"/>
</path>
<pathconvert property="mf.classpath" pathsep=" ">
<path refid="classpath"/>
<mapper>
<chainedmapper>
<flattenmapper/>
<globmapper from="*.jar" to="lib/*.jar"/>
</chainedmapper>
</mapper>
</pathconvert>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="." classpathref="classpath" destdir="${classes.dir}"/>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${ant.project.name}.jar">
<zipgroupfileset dir="${libsSrc}" includes="*.jar"/>
<fileset dir="${classes.dir}" includes="**/*.class"/>
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
<attribute name="Class-Path" value="${mf.classpath}"/>
</manifest>
</jar>
</target>
</project>
清单是正确的,我正在设法获得一些库,但当从cmd提示符运行时,我得到错误
java.io.FileNotFoundException
它所指的文件是JOGL库gluegen-rt-nactives-windowsamd64.jar
最初,我使用32位库从eclipse运行该项目,现在我已经将64位库包含在文件夹libs中,但它仍然告诉我找不到它们。
事实上,当我打开jar时,我现在可以看到所有.dll文件的两个副本(我只能假设这是一个来自JOGL的32位版本和一个来自64位版本)
难道没有办法让程序只使用32位库运行吗?我想减少分发的弹药数量。
我不认为我应该被否决,但嘿。
不管怎么说,问题是我引用了.jar中的.jar,我不认为这会是个问题,但事实确实如此。解决方案是将.jar(库)放在我编译的应用程序.jar旁边,并相应地更新清单。也可以在.jar中使用.jar,但需要使用另一组类才能做到这一点。Eclipse具有这一点,如果您从Eclipse中构建卓越的.jar,则可以在.jar中拥有.jar。