gpt4 book ai didi

java - Ant java 任务无法在 rt.jar 中找到类,但控制台中的 java 成功(且 JAVA_HOME 已正确设置)

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:22 25 4
gpt4 key购买 nike

我正在尝试使用 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 run 任务的相关部分:

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

最后,如果我从命令行(而不是从 Ant 内部)运行代码,执行也会成功,而无需显式地将 rt.jar 添加到 CLASSPATH 中。

更新和解决

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

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

最佳答案

添加编译器参数:

<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>

关于java - Ant java 任务无法在 rt.jar 中找到类,但控制台中的 java 成功(且 JAVA_HOME 已正确设置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14419576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com