【问题标题】:Ant buildfile not able to put jar file in classpath when running other jar file运行其他 jar 文件时,Ant buildfile 无法将 jar 文件放在类路径中
【发布时间】:2011-07-05 10:48:34
【问题描述】:

我是 Ant 构建文件的新手,我已经成功地设置了构建文件来创建构建目录结构、编译所有文件并将它们 jar 到一个带有正确指定主类的清单的 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 文件中。我尝试使用与为实际编译设置类路径相同的方法来设置运行 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,但是如果是这样的话,我仍然不确定如何解决它。任何人都可以提供一些指导吗?

【问题讨论】:

    标签: java ant jar classpath


    【解决方案1】:

    java 任务的行为可能与 java 命令行相同。当同时给出 jar 和 classpath 选项时,classpath 将被忽略,而 jar 应包含列出所需库的清单。我建议删除 jar 属性,将两个 jar 都指定为类路径元素,并将 classname 属性添加到带有主类名称的 java 任务中。

    【讨论】:

    • 是的,这绝对解决了问题。不知道java命令在指定jar文件的时候会忽略classpath,所以我猜你每天都会学到新东西吧?
    • 查看这里的 java 任务文档:ant.apache.org/manual/Tasks/java.html
    【解决方案2】:

    或者,您也可以将类路径的 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>
    

    如果您的路径中只有一个文件,则不需要&lt;pathconvert&gt;,但可以直接在&lt;attribute&gt; 中添加。不过,路径必须与主 jar 文件的位置相对。

    【讨论】:

    • 啊,好吧,这是我不知道的另一种好方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2014-06-24
    • 2023-04-09
    • 2013-05-18
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多