【问题标题】:Unable to start main() from jar using ant无法使用 ant 从 jar 启动 main()
【发布时间】:2013-10-31 03:52:56
【问题描述】:

我有一个项目,比如 A 和一个包含在其构建路径中的 jar,比如 a。 jar 包含一个 main 方法,其类名在 Manifest 文件中提供。

A 的 build.xml 我使用如下代码调用 jar 文件:

<java jar="lib/a.jar" fork="true">
      <arg value="test param" />
</java>

清单文件指向:myframework.Startup

当我尝试运行 ant 文件时,我得到:

 [java] java.lang.NoClassDefFoundError: org/apache/log4j/Logger
 [java]     at myframework.Startup.<clinit>(Startup.java:40)
 [java] Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
 [java]     at java.net.URLClassLoader$1.run(Unknown Source)
 [java]     at java.security.AccessController.doPrivileged(Native Method)
 [java]     at java.net.URLClassLoader.findClass(Unknown Source)
 [java]     at java.lang.ClassLoader.loadClass(Unknown Source)
 [java]     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
 [java]     at java.lang.ClassLoader.loadClass(Unknown Source)
 [java]     at java.lang.ClassLoader.loadClassInternal(Unknown Source)
 [java]     ... 1 more
 [java] Could not find the main class: myframework.Startup. Program will exit.
 [java] Exception in thread "main" 
 [java] Java Result: 1

但是当我直接从我的编辑器 Eclipse 运行 jar 文件时,即 右键单击 a.jar-> 运行方式 -> Java 应用程序 它运行良好。

请帮忙。

【问题讨论】:

标签: java eclipse ant build jar


【解决方案1】:

你有两个选择。更改您的 java 任务以在类路径中包含 log4j:

<java classname="${jar.main.class}" fork="true">
  <classpath>
    <fileset dir="lib" includes="*.jar"/> 
  </classpath>
  <arg value="test param" />
</java>

或者更新 jar 的清单以包含“Class-Path”指令:

<jar destfile="${jar.file}" basedir="${classes.dir}">
    <manifest>
        <attribute name="Main-Class" value="${jar.main.class}" />
        <attribute name="Class-Path" value="lib/a.jar lib/log4j.jar .. .." />
    </manifest>
</jar>

可执行的 jar 必须同时包含主类和类路径。

有关更多信息,请参阅以下答案:

【讨论】:

    【解决方案2】:


    我试图从 Child Jar(a) 访问 Parent Project(A) 内容。根据 oracle 的规范 here 和 Ant 文档 here,在 java 任务中使用 jar 属性时会忽略 classpath 条目。

    <java jar="jarFile.jar">
         <classpath>
              ... ... ...
         </classpath>
    </java>
    

    类路径被忽略。

    当我试图调用 jarFile (a) 中的 main() 时,我在清单文件中指定了类名。 main() 需要使用项目中的类 (A),但不幸的是,这些类不符合 oracle 的标准。

    然后我尝试使用新策略:

    <unzip the jar file to project bin directory />
    <java classpath="jar file's main Class Name">
        ... ... ...
    </java>
    

    通过将 jar 文件内容解压缩到项目 bin/ 目录中,jar 文件 (a) 的类在主项目 (A) 中可用,然后我的问题解决了。

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      相关资源
      最近更新 更多