'无法在构建文件中找到主类错误'

时间:2011-10-07 21:55:54

标签: java apache ant

我创建了一个带有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文件正好在特定文件夹和同一个包中,我真的无法理解错误可能在哪里......任何人都可以帮忙吗?

2 个答案:

答案 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之前添加任务jarAnt 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任务的经验有限。