什么是Ant的默认java任务的类路径(fork设置为“false”)

时间:2013-01-20 20:30:05

标签: java ant

我做了以下测试:

代码

public class FooMain {
   public static void main(String args[]) throws ClassNotFoundException {
      Class klass = Class.forName("com.sun.xml.internal.ws.spi.ProviderImpl");
   }
}

$ CLASSPATH环境变量

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”吗?

2 个答案:

答案 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。

使用ANT管理类路径

我强烈建议你总是分叉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变量的设置方式是否相同。

可执行jar

减少对CLASSPATH变量的依赖的另一种方法是创建一个可执行jar。以下答案演示了如何使用manifestclasspath任务创建一个类路径,您可以将其嵌入到jar的清单中: