Вопрос по java – com.sun.xml.internal.ws.client не существует

18

Я пытаюсь перехватить 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

Если я добавлю @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 тоже может его увидеть.

Может кто-нибудь объяснить такое поведение и возможное решение для этого?

Спасибо, @Jesper, я уже читал эту статью вthis question но это говорит о том, что яshouldn't use it но все же я могу. К сожалению, мне нужно поймать это исключение, вызванное наследием нашего проекта Alexander Zhugastrov
Увидетьstackoverflow.com/questions/860187/… Может быть, это поможет. tibtof
Вы не можете пойматьjavax.xml.ws.WebServiceException вместо? artbristol
Спасибо, я читаю это прямо сейчас, но я вижу только одну реализацию ClientTransportException в моем проекте. Alexander Zhugastrov

Ваш Ответ

7   ответов
19

Согласно этомуЧасто задаваемые вопросы плохой практикой является прямое обращение к «солнцу»; пакеты. Когда я столкнулся с той же проблемой, она была исправлена путемjavax.xml.ws.WebServiceException вместо этого (как предложено artbristol).

1

Даже я столкнулся с той же проблемой в моем проекте Maven. Я импортировал import com.sun.xml.internal.ws.client.ResponseContext; в одном из файлов класса, но это не было в использовании. Я просто прокомментировал строку в моем файле класса, и ошибка прекратилась, и я смог успешно запустить свой проект Maven.

15

Вы можете избавиться от этой ошибки, используя:

javac -XDignore.symbol.file=true

Это аргумент для передачи javac для использования rt.jar вместо ct.sym (ct.sym используется по умолчанию и требуется для компиляции в целевую более старую версию)

ct.symне содержит все классы из rt.jar. Потому что используяsun.* классы не должны использоваться, заглушка класса для них может не присутствовать вct.sym компиляция не удалась

Удаление звонков наsun.* следует удалить эту проблему. (Это плохая практика использовать пакеты Sun)

References :

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

The truth of the matter is that there's something called "ct.sym" in the JDK. When javac is compiling code, it doesn't link against rt.jar. Instead, it uses a special symbol file lib/ct.sym with class stubs. Internal JDK classes are not put in that symbol file, since those are internal classes. You shouldn't want to use them, at all.

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

This is not a compiler issue. javac is behaving correctly, according to the information provided in ct.sym. The issue belongs with those who decide what should be available with (and what should be hidden by) ct.sym I cannot as yet determine the correct category for this bug. This is intentional. Perhaps the package name "com.sun.xml.internal...." might be seen as a hint. Users should not write code that depends on internal JDK implementation classes. Such classes are internal implementation details of the JDK and subject to change without notice.

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

For JDK N and --release M, M < N, signature data of the documented APIs of release M of the platform is needed. This data is stored in the $JDK_ROOT/lib/ct.sym file, which is similar, but not the same, as the file of the same name in JDK 8. The ct.sym file is a ZIP file containing stripped-down class files corresponding to class files from the target platform versions. For JDK N and --release N,the JDK's own image is used as the source of the class files to compile against. The list of observable modules is limited, however, to the documented modules and the jdk.unsupported module.


NOTE

В этом случае было бы лучше не использоватьClientTransportException класс и заменил егоjavax.xml.ws.WebServiceExceptionв соответствии с предложениемartbristol.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

Даже в 2015 году я обнаружил много проектов, в которых используется эта плохая практика импорта.com.sun.* пакеты.

Если вы (как и я) не можете изменить классы, импортирующие эти пакеты, добавьтеrt.jar чтобы ваш classpath должен сделать свое дело.

Обратите внимание, что сказалrt.jar обычно находится под<jdk_home>/jre/lib папка.

1

импортировать эту зависимость в pom.xml

   <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>2.1.4</version>
   </dependency>
-1

Вы не должны использовать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";
}
3

Системная библиотека Jre ограничивает доступ некоторых пакетов к компилятору, в то время как они доступны для JDK. В этом случае в коде не будет ошибок, но при компиляции он покажет ошибки, такие как класс не найден или пакет не найден.

В этом случае есть две практики. 1) добавлятьrt.jar изjre system library к вашему пути сборки для компиляции и сборки. 2) Добавитьjaxws-rt.jar на вашем пути сборки.

Второй вариант является хорошим вариантом, поскольку он позволит избежать добавления дубликатов библиотек в путь сборки.

Error: User Rate Limit Exceeded

Похожие вопросы