Ошибка генерации клиента 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 работать, поделитесь им.

Ответ 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>

Ответ 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, вы можете использовать обходной путь, описанный в этой проблеме, в котором это поведение повлияло плагин.

Ответ 22

Я только что попробовал, что если вы используете SoapUI (5.4.x) и используете инструмент Apache CXF для генерации кода Java, поместите javax.xml.accessExternalSchema = all в YOUR_JDK/jre/lib/jaxp.properties также работает.