1

我有一个项目,比如A和一个包含在其构建路径中的 jar,比如. 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 应用程序它运行良好。

请帮忙。

4

2 回答 2

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 必须包含主类和类路径。

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

于 2013-10-23T17:01:20.720 回答
0


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

<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-10-24T15:07:52.787 回答