com.sun.xml.internal.ws.client不存在

我正在尝试捕获ClientTransportException,我的程序在编译阶段失败,出现以下exception

[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(“限制”),它将从Eclipse Maven插件编译,但不能从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 Idea也可以看到它。

有人可以解释这种行为和可能的解决方案吗?

根据这个FAQ ,直接调用’sun’包是不好的做法。 当我遇到同样的问题时,它通过捕获javax.xml.ws.WebServiceException来修复(由artbristol吸收)。

你可以使用以下方法摆脱这个错误:

 javac -XDignore.symbol.file=true 

这是传递给javac使用rt.jar而不是ct.sym的参数(默认情况下使用ct.sym并且需要编译到目标旧版本)

ct.sym不包含来自rt.jar的所有类。 因为不应该使用sun.*类,所以它们的类存根可能不会出现在ct.sym中, ct.sym使得编译失败。

删除对sun.*调用应删除此问题。 (使用防晒包是不好的做法)

参考文献:

https://blogs.oracle.com/geertjan/ctsym-steals-the-asm-class

问题的真相是JDK中有一个叫做“ct.sym”的东西。 当javac编译代码时,它不会链接到rt.jar。 相反,它使用带有类存根的特殊符号文件lib / ct.sym。 内部JDK类不会放在该符号文件中,因为它们是内部类。 根本不应该使用它们。

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6778491

这不是编译器问题。 根据ct.sym中提供的信息,javac表现正常。 这个问题属于那些决定应该提供什么(以及应该隐藏什么)的人ct.sym我还不能确定这个bug的正确类别。 这是故意的。 也许包名“com.sun.xml.internal ….”可能被视为提示。 用户不应编写依赖于内部JDK实现类的代码。 此类是JDK的内部实现细节,如有更改,恕不另行通知。

http://openjdk.java.net/jeps/247

对于JDK N和–release M,M


注意

在这种情况下,最好不要使用ClientTransportException类,并将其替换为artbistol建议的javax.xml.ws.WebServiceException

即使在2015年,我发现很多项目使用这种导入com.sun.*包的错误做法。

如果您(像我一样)无法更改导入这些包的类,则将rt.jar添加到类路径应该可以解决问题。

请注意,所述rt.jar通常位于/jre/lib文件夹下。

Jre System库限制某些包对编译器的访问,而JDK可以访问它们。 在这种情况下,代码中不会出现错误,但在编译时会显示错误,例如找不到类或找不到包。

在这种情况下,有两种做法。 1)jre系统库的 rt.jar添加到构建路径以进行编译和构建。 2)在构建路径中添加jaxws-rt.jar

第二个选项是一个很好的选择,因为它会避免在构建路径中添加重复的库。

即使我在我的maven项目中遇到同样的问题。 我导入了import com.sun.xml.internal.ws.client.ResponseContext; 在一个类文件中,但这没有被使用。 我只是评论了我的类文件中的行,错误停止了,我可以成功运行我的maven项目。

在pom.xml中导入此依赖项

   com.sun.xml.ws jaxws-rt 2.1.4  

你不应该使用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"; }