Ant java任务在rt.jar中找不到类,但是来自控制台的java成功(并且正确设置了JAVA_HOME)

时间:2013-01-19 22:29:37

标签: java ant

我正在尝试使用Ant执行一些JAX-WS代码,虽然 javac 目标成功,但 java 目标失败并显示以下内容:

java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl

现在,如果我明确地将以下 jar 添加到 java 任务使用的类路径中:

/usr/lib/jvm/java-1.7.0-openjdk-i386/jre/lib/rt.jar

...然后执行成功,但由于 JAVA_HOME 已正确设置,因此不应该这样做:

$ echo $JAVA_HOME
/usr/lib/jvm/java-7-openjdk-i386

此外,我回应了Ant正在使用的 java 版本,我得到了:

ant.java.version=1.7

以下是我的Ant 运行 任务的相对部分:

<echo message="ant.java.version=${ant.java.version}" />
<java classname="${project.MainClass.name}">                    
   <classpath refid="run.classpath"/>           
</java>

最后,如果我从命令行运行代码(而不是从Ant中运行),执行也会成功,而不必明确地将 rt.jar 添加到 CLASSPATH 。 / p>

更新和解决方案

查看已接受的答案我认为这是与使用内部Sun类相关的更广泛类问题的实例。如此answer中所述,要针对内部Sun类显式编译,必须设置javac -XDignore.symbol.file标志。这是因为javac默认情况下不会链接到rt.jar文件,而是针对包含许多(但不是全部)Sun类的类存根的特殊符号文件lib/ct.sym。在类路径中明确添加rt.jar也解决了问题的原因完全相同,但我认为使用javac -XDignore.symbol.file更清晰。至于为什么当rt.jar设置为true时,Ant显然会针对fork进行编译(如建议的by this answer),我仍然不知道。

回想起来,我认为javac在CLASSPATH中不包含rt.jar是有意义的。

2 个答案:

答案 0 :(得分:1)

添加编译器参数:

<compilerarg value="-XDignore.symbol.file" /> 

这对我有用:

 <javac srcdir="src" destdir="build_output" source="1.7" target="1.7">
  <compilerarg value="-XDignore.symbol.file" />
  <classpath>
    <pathelement location="lib/......jar"/>
    <pathelement location="lib/....jar"/>
  </classpath>
</javac>

答案 1 :(得分:0)

解决方案是将 java 的Ant任务 fork 属性设置为“true”:

<java classname ="${project.MainClass.name}" fork="true">
    <classpath refid="run.classpath"/>
</java>

fork 设置为“true”时,rt.jar不必显式出现在 run.classpath 中。