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 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"; }