【问题标题】:Built jar with ant: Exception in thread "main" java.lang.NoClassDefFoundError用 ant 构建 jar:线程“main”java.lang.NoClassDefFoundError 中的异常
【发布时间】:2014-03-08 11:20:00
【问题描述】:

我正在开发一个 java 项目,该项目使用来自外部 jar 的类。当我用 ant 构建它时,它编译时没有任何错误。 但是当我运行 jar 时,我会得到一个“线程“main”java.lang.NoClassDefFoundError:data/representation/IPlayer 中的异常”。 IPlayer 类在外部 jar 中。

你能帮帮我吗?

我的蚂蚁文件

<?xml version="1.0"?>
<project name="KDL" default="main" basedir=".">
<!-- Sets variables which can later be used. -->
<!-- The value of a property is accessed via ${} -->
<property name="src.dir" location="${basedir}/neuerVersuch/version2/6.3/src" />
<property name="build.dir" location="${basedir}/bin" />
<property name="dist.dir" location="${basedir}/dist" />
<property name="doc.dir" location="${basedir}/doc" />
<property name="lib.dir" location="${basedir}/lib" />
<property name="images.dir" location="${basedir}/images" />


<path id="project.classpath">
    <fileset dir="${lib.dir}">
        <include name="*.jar" />
    </fileset>
</path>


<!-- Deletes the existing build, docs and dist directory -->
<target name="clean">
    <delete dir="${build.dir}" />
    <delete dir="${doc.dir}" />
    <delete dir="${dist.dir}" />
</target>

<!-- Creates the build, docs and dist directory -->
<target name="makedir">
    <mkdir dir="${build.dir}" />
    <mkdir dir="${doc.dir}" />
    <mkdir dir="${dist.dir}" />
</target>

<!-- Compiles the java code (including the usage of library for JUnit) -->
<target name="compile" depends="clean, makedir">
    <javac destdir="${build.dir}" includeantruntime="false">
        <compilerarg value="-Xlint:unchecked" />
        <src path="${src.dir}" />
        <classpath refid="project.classpath" />
    </javac>
</target>

<!-- Creates Javadoc -->
<target name="docs" depends="compile">
    <javadoc packagenames="src" sourcepath="${src.dir}" destdir="${doc.dir}">
        <!-- Define which files / directory should get included, we include all -->
        <fileset dir="${src.dir}">
            <include name="**" />
        </fileset>
    </javadoc>
</target>

<!--Creates the deployable jar file -->
<target name="jar" depends="compile">
    <copy todir="${build.dir}">
        <fileset dir="${src.dir}">
            <include name="**/*.*" />
        </fileset>
    </copy>
    <jar destfile="${dist.dir}/team1-kdl.jar" basedir="${build.dir}">
        <zipfileset dir="${lib.dir}" includes="*.jar" prefix="libs" />
        <zipfileset dir="${lib.dir}" includes="*.*" prefix="images" />

        <manifest>
            <attribute name="Main-Class" value="controller.GameStart" />
        </manifest>
    </jar>
</target>

<target name="main" depends="compile, jar, docs">
    <description>Main target</description>
</target>

</project>

在命令行上我这样做:

 ant
 java -jar dist/team1-kdl.jar

然后我收到以下错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: data/representation/IPlayer
    at controller.GameStart.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: data.representation.IPlayer
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 1 more

如果我在 Eclipse 中按下运行按钮,一切正常

编辑: 好的,有了 JB Nizet 的回答,这很容易。 只需添加

<attribute name="Class-Path" value="${lib.dir}/team2.jar" />

到 jar 目标中的 Manifest Tag,使其看起来像

<manifest>
    <attribute name="Main-Class" value="controller.GameStart" />
    <attribute name="Class-Path" value="${lib.dir}/team2.jar" />
</manifest>

一切都会好起来的

【问题讨论】:

  • IPlayer驻留在哪个jar中?
  • IPlayer在lib目录下的外部jarteam2.jar中

标签: java ant noclassdeffounderror


【解决方案1】:

看起来您正在创建一个包含其他 jar 的 jar,并希望 java 自动将所有这些嵌套的 jar 添加到应用程序的类路径中。这不是它的工作原理。当您使用java -jar foo.jar 启动应用程序时,类路径由

  • foo.jar
  • 在 Class-Path 清单条目中引用的 jar 列表,在 foo.jar 之外

阅读the tutorial

【讨论】:

    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多