Ошибка генерации клиента WebService с помощью JDK8
Мне нужно использовать веб-сервис в моем проекте. Я использую NetBeans, поэтому я щелкнул правой кнопкой мыши по моему проекту и попытался добавить нового "клиента веб-службы". В прошлый раз, когда я проверил, это был способ создания клиента веб-сервиса. Но это привело к AssertionError, сказав:
java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: jar: файл:/path/to/glassfish/modules/jaxb-osgi.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: Не удалось прочитать документ схемы " xjc.xsd", поскольку доступ к "файлу" запрещен из-за ограничения, установленного свойством accessExternalSchema.
Стандартной платформой Java для NetBeans была JDK8 (официальная версия Oracle), поэтому, когда я изменил свой файл netbeans.conf и сделал JDK7 (от Oracle, а также) по умолчанию, все работало нормально. Поэтому я думаю, что проблема связана с JDK8. Вот мой вывод java -version
:
java version "1.8.0"
Java (TM) SE Runtime Environment (сборка 1.8.0-b132)
Java HotSpot (TM) 64-разрядная серверная VM (сборка 25.0-b70, смешанный режим)
В настоящее время я держу JDK7 в качестве платформы Java по умолчанию. Если есть способ заставить JDK8 работать, поделитесь им.
Ответы
Ответ 1
Ну, я нашел решение. (на основе http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA)
Создайте файл с именем jaxp.properties
(если он не существует) в /path/to/jdk1.8.0/jre/lib
, а затем напишите в нем следующую строку:
javax.xml.accessExternalSchema = all
Это все. Наслаждайтесь JDK 8.
Ответ 2
Не настоящий ответ, а больше как ссылка.
Если вы используете плагин jaxws Maven и получаете одно и то же сообщение об ошибке, добавьте указанное свойство в конфигурацию плагина:
...
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.3</version>
<configuration>
<!-- Needed with JAXP 1.5 -->
<vmArgs>
<vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
</configuration>
</plugin>
Ответ 3
Я запускаю ant сборки в Eclipse IDE (4.4, Luna, в Windows 7 x64). Вместо того, чтобы модифицировать установленные JRE lib или любые скрипты ant (у меня есть несколько проектов, которые включают XJC в их сборках), я предпочитаю изменять настройки Eclipse "Настройки внешних инструментов" и добавлять следующие аргументы VM для ant построить конфигурацию:
-Djavax.xml.accessExternalSchema=all
Ответ 4
Следующие действия для wsimport 2.2.9 включены в jdk 1.8.0_66:
wsimport -J-Djavax.xml.accessExternalSchema=all ....
Ответ 5
В моем случае добавление:
javax.xml.accessExternalSchema = all
to jaxp.properties не работает, я должен добавить:
javax.xml.accessExternalDTD = all
Моя среда - это linux mint 17 и java 8 oracle.
Я поставлю его там как ответ для людей с одинаковой проблемой.
Ответ 6
Я тестировал это для версии 2.4 артефакта org.codehaus.mojo и работал ~
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlDirectory>path/to/dir/wsdl</wsdlDirectory>
</configuration>
<id>wsimport-web-service</id>
<phase>generate-sources</phase>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>webservices-api</artifactId>
<version>${webservices-api-version}</version>
</dependency>
</dependencies>
<configuration>
<vmArgs>
<vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
<sourceDestDir>generated-sources/jaxws-wsimport</sourceDestDir>
<xnocompile>true</xnocompile>
<verbose>true</verbose>
<extension>true</extension>
<sei>/</sei>
</configuration>
</plugin>
</plugins>
Ответ 7
Вот подсказка для пользователей gradle без прав администратора: добавьте эту строку в свою jaxb-задачу:
System.setProperty('javax.xml.accessExternalSchema', 'all')
он будет выглядеть следующим образом:
jaxb {
System.setProperty('javax.xml.accessExternalSchema', 'all')
xsdDir = "${project.name}/xsd"
xjc {
taskClassname = "com.sun.tools.xjc.XJCTask"
args = ["-npa", "-no-header"]
}
}
Ответ 8
Если вы получаете эту проблему при преобразовании wsdl в jave с cxf-codegen-plugin, тогда вы можете решить его, настроив плагин на fork и предоставив дополнительную опцию "-Djavax.xml.accessExternalSchema = all" JVM.
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<fork>always</fork>
<additionalJvmArgs>
-Djavax.xml.accessExternalSchema=all
</additionalJvmArgs>
Ответ 9
Я также получал аналогичный тип ошибки в Eclipse во время тестирования программы webservice на веб-сервере glassfish 4.0:
java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: bundle://158.0:1/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: Failed to read schema document 'xjc.xsd', because 'bundle' access is not allowed due to restriction set by the accessExternalSchema property.
Я добавил javax.xml.accessExternalSchema = All
в jaxp.properties
, но не работает для меня.
Однако я нашел решение ниже, которое работает для меня:
Для GlassFish Server мне нужно изменить domain.xml
GlassFish,
путь: <path>/glassfish/domains/domain1
или domain2/config/domain.xml
) и добавьте <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
в тег <java-config>
....
<java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
... и затем перезапустите сервер GlassFish
Ответ 10
Включение доступа к внешней схеме
Вам нужно включить IDE и GlassFish Server для доступа к внешней схеме для анализа WSDL файла веб-службы. Чтобы включить доступ, вам необходимо изменить файлы конфигурации IDE и GlassFish Server. Дополнительные сведения см. В разделе "Вопросы и ответы". Как включить парсинг WSDL с внешней схемой?
Настройка среды IDE
Чтобы создать клиент веб-службы в среде IDE из веб-службы или WSDL файла, вам необходимо изменить файл конфигурации IDE (netbeans.conf), чтобы добавить следующий переключатель в netbeans_default_options.
-J-Djavax.xml.accessExternalSchema=all
Подробнее о поиске и изменении файла конфигурации netbeans.conf см. в разделе FAQ Netbeans Conf.
Настройка сервера GlassFish
Если вы развертываете сервер GlassFish, вам необходимо изменить файл конфигурации GlassFish Server (domain.xml), чтобы сервер мог получить доступ к внешним схемам для анализа файла wsdl и создания тестового клиента. Чтобы включить доступ к внешним схемам, откройте файл конфигурации GlassFish (GLASSFISH_INSTALL/glassfish/domains/domain1/config/domain.xml) и добавьте следующий элемент опции JVM (выделен жирным шрифтом). Вам нужно будет перезапустить сервер, чтобы изменения вступили в силу.
</java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Ответ 11
При использовании Maven с IntelliJ IDE вы можете добавить -Djavax.xml.accessExternalSchema=all
в настройку Maven в параметрах JVM для Конфигурация запуска Maven Build Tools
Ответ 12
Для тех, кто использует задачу ANT wsimport
, способ передачи опции, предложенный @CMFly и указанный в documentation:
<wsimport
<!-- ... -->
fork="true"
>
<jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
Ответ 13
Это работает на jdk1.8.0_65
wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
Ответ 14
Теперь он исправлен в версии 2.5 (выпущен в jul/17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8.
Для версий 2.4.x существует обходное решение (как описано в https://github.com/mojohaus/jaxws-maven-plugin/issues/4):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.4.1</version>
<dependencies>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-tools</artifactId>
<version>2.2.10</version>
</dependency>
</dependencies>
</plugin>
Ответ 15
Другое решение для адреса: wiki.netbeans.org
Мастер-клиент веб-службы в среде IDE анализирует файл WSDL при создании клиента веб-службы из веб-службы или файла WSDL. Вам необходимо изменить файл конфигурации IDE (netbeans.conf), чтобы добавить следующий переключатель в netbeans_default_options. Вам нужно будет перезапустить среду IDE, чтобы изменения вступили в силу.
-J-Djavax.xml.accessExternalSchema=all
При развертывании в GlassFish вам необходимо включить доступ к внешней схеме для создания тестового клиента для веб-службы. Чтобы включить доступ, вам необходимо изменить файл конфигурации GlassFish Server (GLASSFISH_INSTALL/glassfish/domains/domain1/config/domain.xml) и добавить следующий элемент опции JVM. Вам нужно будет перезапустить сервер, чтобы изменения вступили в силу.
</java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Ответ 16
Я использовал его с помощью обычного проекта maven и решил его решить с помощью этой конфигурации зависимостей плагина для запуска xjc plugin
:
<plugin>
<!-- Needed to run the plugin xjc en Java 8 or superior -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<executions>
<execution>
<id>set-additional-system-properties</id>
<goals>
<goal>set-system-properties</goal>
</goals>
</execution>
</executions>
<configuration>
<properties>
<property>
<name>javax.xml.accessExternalSchema</name>
<value>all</value>
</property>
<property>
<name>javax.xml.accessExternalDTD</name>
<value>all</value>
</property>
</properties>
</configuration>
</plugin>
Ответ 17
Если вы используете ant, вы можете добавить jvmarg к вашим java-вызовам:
<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
Ответ 18
Очень простым переносным решением было бы разместить следующую строку кода где-то в важной части вашего кода, частью которой вы уверены, что она будет запущена (например, прямо в основном методе):
System.setProperty("javax.xml.accessExternalDTD", "all");
Это задает необходимое системное свойство программно, без необходимости делать сложные изменения maven pom.xml(которые по какой-то причине не работали для меня).
Ответ 19
Другой вариант - обновить оболочку wsimport.sh script, добавив следующее:
wsimport.sh находится в этом каталоге:
JAXWS-ri.2.2.28/бен
exec "$ JAVA" $WSIMPORT_OPTS -Djavax.xml.accessExternalSchema = all -jar "$ JAXWS_HOME/lib/jaxws-tools.jar" "$ @"
Ответ 20
Другая ссылка:
Если вы используете maven-jaxb2-plugin
, до версии 0.9.0, вы можете использовать обходной путь, описанный в этой проблеме, в котором это поведение повлияло плагин.
Ответ 21
NetBeans обновляет свой учебник для JDK8 и этот выпуск:
Начало работы с веб-службами JAX-WS → Включение доступа к внешней схеме
Ответ 22
Я только что попробовал, что если вы используете SoapUI (5.4.x)
и используете инструмент Apache CXF
для генерации кода Java, поместите javax.xml.accessExternalSchema = all
в YOUR_JDK/jre/lib/jaxp.properties
также работает.