Java com.sun.xml.internal.ws.client不存在
我试图捕获ClientTransportException,我的程序在编译阶段失败,出现以下异常Java com.sun.xml.internal.ws.client不存在,java,Java,我试图捕获ClientTransportException,我的程序在编译阶段失败,出现以下异常 [ERROR]\workspace\rates\java\service\bundle1\src\main\java\com\connector\ws\TestClass1.java:[72,70] package com.sun.xml.internal.ws.client does not exist 据我所知,这个包来自rt.jar,存在于jre中 如果我添加@SuppressWarning
[ERROR]\workspace\rates\java\service\bundle1\src\main\java\com\connector\ws\TestClass1.java:[72,70] package com.sun.xml.internal.ws.client does not exist
据我所知,这个包来自rt.jar,存在于jre中
如果我添加@SuppressWarnings(“限制”),它将从EclipseMaven插件编译,但不会从IntelliJ Idea(通过Maven)或命令行编译
当我删除@SuppressWarnings时,Eclipse会显示以下警告
Access restriction: The type ClientTransportException is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar
我发现了类似的结果,但答案对我来说不够清楚,因为我可以在rt.jar中看到这个类,我的IntelliJ想法也可以看到它
有人能解释这种行为和可能的解决方法吗?您可以使用以下方法消除此错误:
javac -XDignore.symbol.file=true
这是传递给javac使用rt.jar而不是ct.sym的参数(默认情况下使用,编译到目标旧版本时需要)
ct.sym
不包含rt.jar中的所有类。由于不应使用sun.*
类,因此它们的类存根可能不在ct.sym中,从而导致编译失败
删除对sun.*
的调用应该会删除此问题。(使用sun软件包是一种不好的做法)
参考资料:
事实上,JDK中有一个叫做“ct.sym”的东西。当javac编译代码时,它不会链接到rt.jar。相反,它使用带有类存根的特殊符号文件lib/ct.sym。内部JDK类不放在该符号文件中,因为它们是内部类。你根本不应该想使用它们
这不是编译器问题。根据ct.sym中提供的信息,javac运行正常。
这个问题属于那些决定ct.sym应该提供什么(以及应该隐藏什么)的人
我还不能确定这个错误的正确类别。
这是故意的。也许包名“com.sun.xml.internal…”可以看作是一个提示。
用户不应该编写依赖于内部JDK实现类的代码。这些类是JDK的内部实现细节,如有更改,恕不另行通知
对于JDK N和--release M,M
注意
在这种情况下,最好不要使用ClientTransportException
类,而是用javax.xml.ws.WebServiceException
代替它,正如artbristol所建议的那样,根据这一点,直接调用“sun”包是一种不好的做法。当我遇到同样的问题时,它是通过捕获javax.xml.ws.webserviceeexception
来解决的(正如artbristol所建议的)。即使在2015年,我也发现许多项目使用这种导入com.sun.
包的糟糕做法
如果您(像我一样)无法更改导入这些包的类,那么将rt.jar
添加到类路径中就可以了
请注意,所述rt.jar
通常位于/jre/lib
文件夹下。jre系统库限制某些包对编译器的访问,而JDK可以访问这些包。在这种情况下,代码中不会有错误,但编译时会显示错误,如找不到类或找不到包
在这种情况下,有两种做法。
1)将jre系统库的rt.jar添加到编译和构建路径中。
2) 在构建路径中添加jaxws-rt.jar
第二个选项是一个很好的选项,因为它可以避免在构建路径中添加重复的库。即使我在maven项目中也遇到了同样的问题。我已经进口了
import com.sun.xml.internal.ws.client.ResponseContext代码>在一个类文件中,但该类文件未被使用。
我刚刚在类文件中注释了该行,错误停止了,我可以成功运行我的maven项目。您不应该使用com.sun.*
包。
我们可以使用自己的类来解决这个问题:
/**
* Copy of com.sun.xml.internal.ws.client.BindingProviderProperties since we're
* not allowed to use com.sun.* packages..
*/
public final class BindingProviderProperties {
public static final java.lang.String CONNECT_TIMEOUT = "com.sun.xml.internal.ws.connect.timeout";
public static final java.lang.String REQUEST_TIMEOUT = "com.sun.xml.internal.ws.request.timeout";
}
在pom.xml中导入此依赖项
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.1.4</version>
</dependency>
com.sun.xml.ws
jaxws-rt
2.1.4
解决方案非常简单:当您复制现成的代码或先编写代码,然后加载依赖项时,存在依赖项冲突com.sun.xml.*
包已经是JDK8的一部分,但是Maven在编译时没有看到它。因此,请确保使用来自mvn:repo:/…rt.jar而不是jdk*/…/rt.jar的包。对于maven build,添加以下插件将解决此问题
基本上是添加编译器参数来引用tools.jar的正确路径
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<bootclasspath>${java.home}/lib/rt.jar${path.separator}${java.home}/lib/jce.jar${path.separator}${java.home}/../lib/tools.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
org.apache.maven.plugins
maven编译器插件
3.8.1
1.8
1.8
${java.home}/lib/rt.jar${path.separator}${java.home}/lib/jce.jar${path.separator}${java.home}/./lib/tools.jar
看,也许会有帮助。谢谢,我现在正在阅读,但我在项目中只看到了ClientTransportException的一个实现。谢谢,@Jesper,我已经在中阅读了这篇文章,但它告诉我不应该使用它,但我仍然可以。不幸的是,我需要捕获此异常,它是由我们的ProjectLegacy引起的。您不能捕获javax.xml.ws.WebServiceException
吗?链接已断开…:-/@托马斯:是的,不幸的是,我记得这篇文章很长,所以我没有在文章中引用