【发布时间】: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