我正在尝试使用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
是有意义的。
答案 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 中。