1

我正在尝试使用 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.jarwhenfork设置为 true 进行编译(正如这个答案所建议的那样),我仍然不知道。

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

4

2 回答 2

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>
于 2017-09-21T13:18:06.223 回答
0

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

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

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

于 2013-01-20T20:03:45.363 回答