我正在尝试使用 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
此外,我回应了Java Ant 正在使用的版本,我得到:
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 ,执行也会成功。
更新和解决
查看已接受的答案,我认为这是与使用内部 Sun 类相关的更广泛问题的一个实例。如this answer中所述,要针对内部 Sun 类进行显式编译,必须设置javac -XDignore.symbol.file
标志。这是因为javac
默认情况下不链接到rt.jar
文件,而是链接到带有类存根的特殊符号文件lib/ct.sym
,该类存根包含许多(但不是全部)Sun 的类。出于完全相同的原因,在类路径中显式添加rt.jar
也可以解决问题,但我认为使用javac -XDignore.symbol.file
. 至于为什么 Ant 显然会针对rt.jar
whenfork
设置为 true 进行编译(正如这个答案所建议的那样),我仍然不知道。
回想起来,我认为javac
不包含rt.jar
在 CLASSPATH 中是有道理的。