Ant构建文件无法在运行其他jar文件时将jar文件放入类路径中

6

我对Ant构建文件还不熟悉,但我已经成功设置了我的构建文件,创建了我的构建目录结构,编译了所有文件,并将它们打包到一个包含正确主类的jar文件中。

然而,我也正在尝试在构建文件中添加运行刚刚创建的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 文件中。相反,它包含在我的库文件夹 ./lib/ 中的另一个 jar 文件中。我尝试使用与实际编译设置 classpath 的相同方法来设置运行 jar 文件的 classpath,但似乎并没有起作用。
以下是构建文件的运行部分内容:
<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,但如果是这种情况,我仍然不确定如何修复它。有人可以提供一些指导吗?

2个回答

5

或者,您还可以将类路径中的jar(即resources.jar)添加到jar清单文件的Class-Path属性中。然后,您的jar文件也可以在ant外部使用-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文件所在的位置。

啊,好的,这是另一种我不知道的好方法。谢谢! - wibarr

5

Java任务的行为可能与Java命令行相同。当给出jar和classpath选项时,会忽略classpath,而是期望jar包含列出所需库的清单。我建议删除jar属性,将两个jar指定为classpath元素,并向Java任务添加classname属性,其中包含主类的名称。


是的,那绝对解决了问题。我不知道当指定一个jar文件时,java命令会忽略classpath,所以我想你每天都会学到新东西,对吧? - wibarr
请查看此处Java任务文档:http://ant.apache.org/manual/Tasks/java.html - Bruno Bieri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接