【问题标题】:What is on Ant's classpath for the default java task (fork set to "false")默认 java 任务的 Ant 类路径上有什么(fork 设置为“false”)
【发布时间】:2013-01-03 22:26:27
【问题描述】:

我做了以下测试:

代码

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 设置为 "true"

然而,这与ANT in Action book 中所写的内容背道而驰,它在 pg 中注明。 152 基本 Ant 的 java 任务使用 Ant 类路径运行,其中包括“CLASSPATH 环境变量中的所有内容”。

那么为什么Ant的java任务在fork设置为“false”并且只有fork才成功的情况下找不到要找的类> 即使在这两种情况下类都在 $CLASSPATH 上,也设置为“true”?

【问题讨论】:

    标签: java ant


    【解决方案1】:

    对于fork="false"<java> 任务使用特殊的“隔离”类加载器从任务自己的类路径(classpathref 属性或<classpath> 嵌套元素)加载类,除了对于specific set of hard-coded package prefixes,如果在任务自己的类路径中找不到它们,它将尝试从父加载器加载。由于com.sun.xml 不在此硬编码列表中,因此不会将其委托给父级,因此会给您一个ClassNotFoundException

    【讨论】:

    • 有没有办法在保持fork="false的同时关闭“隔离”?我发现自己需要使用当前的 ant 类路径并添加几个额外的 jar 来执行 java 任务。或者是否有一种方法可以通过将当前的 ant 类路径与我需要的 jar 连接来组装新的类路径?
    【解决方案2】:

    manual page对java任务的操作有如下解释:

    在正在运行的 (Apache Ant) 虚拟机中执行 Java 类,或者在指定时分叉另一个虚拟机。

    如果在运行此任务时出现奇怪的问题,请设置 fork="true" 以使用新的 JVM。

    使用 ANT 管理类路径

    我强烈建议您始终 fork 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 清单中的类路径:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多