我有一个项目,比如说 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应用程序运行正常。
请帮忙。
答案 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 )然后我的问题解决了。