无法使用ant从jar启动main()

时间:2013-10-22 10:21:54

标签: java eclipse ant build jar

我有一个项目,比如说 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-&gt;运行方式 - &gt; Java应用程序运行正常。

请帮忙。

2 个答案:

答案 0 :(得分: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必须包含主类和类路径。

有关详细信息,请参阅以下答案:

答案 1 :(得分:0)


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

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

忽略类路径。

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

然后我尝试使用新策略:

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

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