小编典典

当我的JAR位于类路径上时,为什么Ant会说“ NoClassDefFound”?

java

我正在使用Java 1.6,Eclipse和Ant。

以下是我创建和运行jar文件的目标:

    <!-- Settings -->
    <property file="build.properties" />
    <path id="classpath">
        <fileset dir="${lib.dir}" includes="**/*.jar" />
    </path>

    <!-- Compile -->
    <target name="compile">
        <mkdir dir="${classes.dir}" />
        <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false">
            <classpath refid="classpath" />
        </javac>
    </target>

    <!-- Package .jar -->
    <target name="jar">
        <mkdir dir="${jar.dir}" />
        <jar destfile="${jar.dir}/App.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="main.App" />
            </manifest>
        </jar>
    </target>

    <!-- Run .jar -->
    <target name="run">
        <java jar="${jar.dir}/App.jar" fork="true" />
    </target>

问题是,当我(通过Ant或命令行)运行此jar时,收到错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: net/xeoh/plugins/base/impl/PluginManagerFactory
     [java]     at plugins.PluginLoader.<clinit>(Unknown Source)

一些可能有用的知识:

  • 当我打印我的类路径时,它表明所有必需的JAR都在其中。它还显示了类路径的Eclipse GUI版本。

  • 我尝试清理项目(通过Eclipse和Ant)都无济于事。

  • 似乎缺少的库.jar 不是 .jar中的.jar(这似乎是一个常见问题)。

  • 这是唯一的错误。其他班级似乎都觉得图书馆不错…


阅读 267

收藏
2020-11-30

共1个答案

小编典典

您已经设置了编译类路径,但是App.jar不包括您的库(仅包含您编译的类)或清单类路径。

您需要执行以下操作:

<target name="jar">
    <mkdir dir="${jar.dir}" />
    <manifestclasspath property="manifest.classpath"
                       jarfile="${jar.dir}/App.jar">
      <classpath refid="classpath" />
    </manifestclasspath>
    <jar destfile="${jar.dir}/App.jar" basedir="${classes.dir}">
        <manifest>
            <attribute name="Main-Class" value="main.App" />
            <attribute name="Class-Path" value="${manifest.classpath}" />.
        </manifest>
    </jar>
</target>

另请参见ant
manifestclasspath任务

2020-11-30