我做了以下测试:
public class FooMain {
public static void main(String args[]) throws ClassNotFoundException {
Class klass = Class.forName("com.sun.xml.internal.ws.spi.ProviderImpl");
}
}
echo $CLASSPATH
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jar:.
jar tvf /usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jar | grep com.sun.xml.internal.ws.spi.ProviderImpl
1742 Wed Oct 24 18:52:52 EEST 2012 com/sun/xml/internal/ws/spi/ProviderImpl$1.class
1349 Wed Oct 24 18:52:52 EEST 2012 com/sun/xml/internal/ws/spi/ProviderImpl$2.class
12412 Wed Oct 24 18:52:52 EEST 2012 com/sun/xml/internal/ws/spi/ProviderImpl.class
所以所寻求的课程是在$ CLASSPATH。
然而,使用Ant的 java 任务运行上述代码并将 fork 设置为“false”会失败,只有 fork <才能成功/ strong>设置为“true”。
然而,这与pg中记载的ANT in Action book中的内容相反。 152基本Ant的java任务使用Ant类路径运行,其中包括“CLASSPATH环境变量中的所有内容”。
那么为什么当 fork 设置为“false”时,Ant的 java 任务不能找到所需的类,只有当 fork 设置为“true”吗?
答案 0 :(得分:4)
使用fork="false"
<java>
任务使用一个特殊的“隔离”类加载器,它从任务自己的类路径(classpathref
属性或{{}加载仅类 1}}嵌套元素),除了specific set of hard-coded package prefixes之外,如果在任务自己的类路径中找不到它们,它将尝试从父加载器加载。由于<classpath>
不在此硬编码列表中,因此不会将其委托给父级,因此会为您提供com.sun.xml
。
答案 1 :(得分:2)
manual page对java任务的操作有以下解释:
在正在运行的(Apache Ant)VM中执行Java类,或者在指定时分叉另一个VM。
如果在运行此任务时出现奇怪的问题,请设置fork =&#34; true&#34;使用新的JVM。
我强烈建议你总是分叉JVM并利用ANT类路径管理工具:
<path id="runtime.path">
<fileset dir="lib/runtimejars" includes="*.jar"/>
</path>
<java classname="???" fork="true" classpathref="runtime.path">
<arg line="arg1 arg2 arg3"/>
</java>
为什么呢?如果将构建移植到另一台机器,则无法确定CLASSPATH变量的设置方式是否相同。
减少对CLASSPATH变量的依赖的另一种方法是创建一个可执行jar。以下答案演示了如何使用manifestclasspath任务创建一个类路径,您可以将其嵌入到jar的清单中: