我创建了一个带有Ant构建文件的Java应用程序,该文件包含从应用程序生成jar文件的jar-task任务。
<target name="jar-task" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="jar/guix.jar" basedir="${bin.dir}">
<fileset dir="${basedir}">
<include name="${basedir}/images/**/" />
</fileset>
<manifest>
<attribute name="Main-Class" value="IO.Deep.clk.GUI"/>
<attribute name="Class-Path" value="${basedir}/SPLASH-2.0.0.jar ${basedir}/lib/dist/* ${basedir}/user.properties"/>
</manifest>
<filelist dir="${basedir}" files="user.properties"/>
</jar>
</target>
当我在命令行上执行时,NoClassDefFoundError表示
Could not find the main class IO.Deep.clk.GUI. Program will exit.
现在,GUI文件正好在特定文件夹和同一个包中,我真的无法理解错误可能在哪里......任何人都可以帮忙吗?
答案 0 :(得分:1)
名称images
表明,jar文件只包含图像。但实际代码在哪里?
<fileset dir="${basedir}"> <include name="${basedir}/images/**/" /> </fileset>
这篇文章
<attribute name="Class-Path" value="${basedir}/SPLASH-2.0.0.jar ${basedir}/lib/dist/* ${basedir}/user.properties"/>
会将完整限定的路径名写入清单。确定,这是正确的吗?另请注意,通过将文件放在类路径上,代码将找不到user.properties
。类路径只能包含将在其中搜索类或其他内容的目录或jar文件。但是简单的文件不起作用。
我也不确定lib/*
部分。该目录中的一个jar文件中的类IO.Deep.clk.GUI
是什么?这将是一个提示,必须明确列出所有目录。如果这不是问题 - 好。
修改强>:
通过在调用manifestclasspath
之前添加任务jar
(Ant docs)并使用manifest
属性中生成的类路径值,可以避免类路径问题。概要:
<manifestclasspath property="jar.class.path" jarfile="jar/guix.jar">
<classpath>
<fileset dir="." includes="*.jar" />
<fileset dir="." includes="lib/*.jar" />
</classpath>
</manifestclasspath>
<echo message="Class-Path will be: ${jar.class.path}" />
<jar ....>
....
<attribute name="Class-Path" value="${jar.class.path}" />
答案 1 :(得分:0)
您确定jar任务中生成的文件包含您需要的所有文件吗?
对于调试,您可以使用从jar任务转换到文件集的路径并回显它,以便您可以确认您拥有正确的文件。如果这样可以,那么我的文件中没有其他错误,尽管我自己对jar任务的经验有限。