我是Ant构建文件的新手,我已经设法构建我的构建文件来创建我的构建目录结构,编译我的所有文件,然后将它们装入一个jar,并使用清单正确指定主类。
但是,我也试图在buildfile中添加运行我刚刚创建的jar的功能。它会尝试运行,但我遇到了这个错误:
run:
[java] Exception in thread "main" java.lang.NoClassDefFoundError: edu/course/lab/pkg3/Lab31
[java] at edu.school.oad.lab.pkg1.Main.<init>(Unknown Source)
[java] at edu.school.oad.lab.pkg1.Main.main(Unknown Source)
[java] Caused by: java.lang.ClassNotFoundException: edu.course.antlab.pkg3.Lab31
[java] at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
[java] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
[java] ... 2 more
[java] Java Result: 1
所以我知道这意味着当我尝试运行jar文件时,jar文件结构正确并且清单设置正确,但它找不到类Lab31,因为它没有包含在该特定的jar文件中。相反,它包含在我的库文件夹中的另一个jar文件中./lib/。我尝试使用相同的方法设置运行jar文件的类路径,就像我为实际编译设置类路径一样,但这似乎不起作用。
这是我对构建文件的运行部分所拥有的:
<target name="run" depends="init, prepare">
<java jar="${build}/jar/AntLabRun.jar" fork="true">
<classpath>
<pathelement location="${lib}/resources.jar" />
</classpath>
</java>
</target>
我唯一的想法是jar文件认为resources.jar文件位于$ {build} / jar / $ {lib} /resources.jar而不仅仅是$ {lib} /resources.jar,但是如果是这样的话,我仍然不确定如何解决它。有人可以提供一些指导吗?
答案 0 :(得分:5)
java任务的行为可能与java命令行的行为相同。当给出jar和classpath选项时,将忽略类路径,而jar应该包含列出所需库的清单。我建议删除jar属性,将两个jar指定为classpath元素,并将classname
属性添加到具有主类名称的java任务中。
答案 1 :(得分:5)
或者,您也可以将类路径的jar(即resources.jar)添加到jar清单的Class-Path
属性中。然后你的罐子也可以在蚂蚁外面-jar
运行。
我在构建文件中有这样的东西:
<pathconvert property="server.libpath" refid="libpath" pathsep=" ">
<map from="${dir.libs}" to="../libs/"/>
</pathconvert>
<mkdir dir="${jars}" />
<jar destfile="${jars}/standalone.jar">
<!-- all the filesets -->
<manifest>
<attribute name="Built-By" value="${user.name}" />
<attribute name="Main-Class" value="de.fencing_game.gui.Lobby" />
<attribute name="Class-Path" value="${server.libpath}" />
</manifest>
</jar>
如果您的路径中只有一个文件,则不需要<pathconvert>
,但可以直接在<attribute>
中添加。但是,路径必须是相对于主jar文件的位置。