Ошибка создания клиента WebService с JDK8

Мне нужно использовать веб-службу в моем проекте. Я использую NetBeans, поэтому щелкнул правой кнопкой мыши свой проект и попытался добавить новый «Клиент веб-службы». В прошлый раз, когда я проверял, это был способ создания клиента веб-службы. Но это привело к AssertionError, говоря:

java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: jar: file: /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 "1.8.0"
Среда выполнения Java (TM) SE (сборка 1.8.0-b132)
64-разрядная серверная виртуальная машина Java HotSpot (TM) (сборка 25.0-b70, смешанный режим)

На данный момент я использую JDK7 в качестве платформы Java по умолчанию. Если есть способ заставить JDK8 работать, поделитесь.


person a.b    schedule 11.04.2014    source источник
comment
У меня возникла проблема в Eclipse, что источники jaxb не создавались при использовании m2eclipse и jdk1.8. В представлении маркеров я увидел аналогичную ошибку о accessExternalSchema. Когда я применил выбранное ниже решение, перезапустил eclipse и очистил проект, исходники были сгенерированы!   -  person Jonas Berlin    schedule 18.03.2015


Ответы (23)


Что ж, я нашел решение. (на основе 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.

person a.b    schedule 11.04.2014
comment
Сработало для меня, но мне нужно было перезапустить Netbeans, чтобы он работал. - person Akira Yamamoto; 22.07.2014
comment
Пробовал это. У меня это не сработало. Использование NetBeans 8.0.2, JRE 1.8.0_25, JDK 1.8.0_25 и Java EE 7. Я использую 64-разрядную версию Windows 7 - person Max West; 19.12.2014
comment
@Max West, Странно, у меня это сработало, у меня те же конфигурации, что и у вас, за исключением того, что я запускаю win 8.1 - person bluelabel; 03.02.2015
comment
Также работает для intelliJ. - person Mafro34; 17.02.2015
comment
У меня также была та же проблема, что и у Max West, но я последовал ответу @Debashish Barik, и теперь он отлично работает для меня. - person Matt Williams; 04.03.2015
comment
Работает, как рекламируется, только что подтверждено. Некоторые сведения о платформе: maven = 3.3.1 JDK = 1.8.0_40 OS = OSX 10.10.3 - person wojtek_z; 13.05.2015
comment
Я могу подтвердить, что это решение также работает для сборки maven в eclipse с maven и jaxb-plugin. Может кто-нибудь объяснить, почему вам не нужно это свойство для Java7? - person Danny Lo; 20.05.2015
comment
@DannyLo, потому что java 7 скоро подходит к концу, поэтому ...;) - person vikingsteve; 21.05.2015
comment
Благодаря тонну! Это работает для Java 1.8, но не для 1.7. - person Stark07; 15.01.2016
comment
У меня это сработало, но мне пришлось поместить файл в /path/to/jdk1.8.0/lib, а не в дальнейший каталог jre. - person Zephyr; 17.03.2016
comment
Это не очень удобно. Вам нужно будет настроить локальную установку JDK на машине каждого разработчика, который пытается собрать проект. - person Natix; 15.06.2016
comment
Спасибо, брат, это сработало как шарм ... большое спасибо за то, что поделился им :) - person Thomas; 12.07.2016
comment
это не работает для меня, сработало следующее: javax.xml.accessExternalDTD = all, Также я могу установить это в коде, и он работает: System.setProperty (javax.xml.accessExternalDTD, все); - person qartal; 19.07.2016
comment
@Natix Согласен, см. Мой ответ о переносном решении, которое не требует модификации JDK или глобальных флагов JDK - person Dave B; 28.09.2016
comment
Есть ли способ установить это свойство в другом месте, если папка JDK доступна только для чтения из-за политики компании? - person Sorin Postelnicu; 26.10.2017
comment
@SorinPostelnicu эту конфигурацию jvm также можно выполнить в pom.xml - person bbaassssiiee; 19.01.2019
comment
Добавляется ли это к экземпляру jenkins или nexus? Я создал файл в обоих и безуспешно добавил упомянутое свойство. Вот моя ошибка. Nexus Repository Manager 3.x connection failed javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 123; External DTD: Failed to read external DTD 'xhtml1-transitional.dtd', because 'http' access is not allowed due to restriction set by the accessExternalDTD property.] Любая помощь чрезвычайно ценится. - person Mihado; 12.09.2020

Не фактический ответ, а скорее справочная информация.

Если вы используете плагин 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>
person jassuncao    schedule 17.03.2015
comment
Значение accessExternalSchema=all устанавливается по умолчанию, если вы используете более поздние версии (например, 0.12.3) плагина org.jvnet.jaxb2.maven2:maven-jaxb2-plugin. - person Jon Onstott; 27.05.2015
comment
Вышеупомянутое не сработало для меня. В этой версии: ‹plugin› ‹groupId› org.codehaus.mojo ‹/groupId› ‹artifactId› jaxws-maven-plugin ‹/artifactId› ‹version› $ {version.jaxws.plugin} ‹/version› ‹configuration› ‹configuration› ‹ ! - Требуется с JAXP 1.5 - ›‹vmArgs› ‹vmArg› -Djavax.xml.accessExternalSchema = all ‹/vmArg› ‹/vmArgs› ‹/configuration› ‹/plugin› - person Dr4gon; 04.10.2016
comment
@JonOnstott: у вас установлена ​​последняя версия 2.4.1, и по умолчанию она не работает. Пришлось добавить это, как в ответе. - person Robert Niestroj; 31.05.2017

Я запускаю сборки муравьев в Eclipse IDE (4.4, Luna, в Windows 7 x64). Вместо того, чтобы изменять установленную библиотеку JRE или какие-либо сценарии ant (у меня есть несколько проектов, которые включают XJC в свои сборки), я предпочитаю изменить параметры Eclipse «Конфигурации внешних инструментов» и добавить следующее к аргументам виртуальной машины для конфигурации сборки Ant:

-Djavax.xml.accessExternalSchema=all
person gb96    schedule 15.07.2014
comment
Я использую wsdl2java.bat из Apache CXF. Поэтому я просто вставил опцию JVM в этот BAT-файл. Оно работает. - person ka3ak; 11.03.2015
comment
Я мог бы также добавить, что если мы включим эту опцию в качестве параметра ant, все другие включения, упомянутые здесь, будут чрезмерными. Но не наоборот! Так что это лучшее решение. +1 (конечно, пользователи Maven должны внести соответствующие изменения в параметры Maven) - person Gangnus; 14.12.2015
comment
У меня была аналогичная проблема, когда я пытался запустить mvn clean install, я просто добавил этот флаг выше, и он был успешно развернут. Спасибо - person Spear A1; 18.04.2019

Для wsimport 2.2.9, включенного в jdk 1.8.0_66, работает следующее:

wsimport -J-Djavax.xml.accessExternalSchema=all ....
person tanderson    schedule 22.12.2015
comment
У меня это работает. Я пробовал использовать jdk 1.8.0_65, но это не сработало, поэтому убедитесь, что вы используете jdk 1.8.0_66 или новее. - person jabe; 18.05.2016
comment
Это правильный ответ при прямом использовании wsimport. - person Christopher Schultz; 14.07.2016

В моем случае добавление:

javax.xml.accessExternalSchema = all

чтобы jaxp.properties не работал, я должен добавить:

javax.xml.accessExternalDTD = all

Моя среда - linux mint 17 и java 8 oracle. Я помещу его туда как ответ для людей с той же проблемой.

person moretti.fabio    schedule 28.01.2016
comment
Это зависит от того, хотите ли вы разрешить доступ к внешнему DTD или к XML-схеме (XSD). DTD является предшественником XML-схемы. Также могут быть случаи, когда вам нужно установить оба! - person Philip Helger; 05.05.2017

Я тестировал это для версии 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>
person Mehdi    schedule 27.02.2016
comment
Возможно, именно vmArgs -Djavax.xml.accessExternalSchema=all настроен в объявлении вашего плагина. Это обсуждается в Netbeans Ошибка 244891 - person kosgeinsky; 21.03.2016

Вот подсказка Подсказка для пользователей 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"]
    }
}
person Java_Waldi    schedule 07.04.2016

Если у вас возникает эта проблема при преобразовании wsdl в jave с помощью cxf-codegen-plugin, то вы можете решить эту проблему, настроив плагин на fork и предоставив дополнительную опцию JVM" -Djavax.xml.accessExternalSchema = all ".

        <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>
person pjklauser    schedule 20.11.2015
comment
Благодарность! все вышеперечисленные варианты не помогают и ваш мне подходит - person ludenus; 24.11.2015

Я также получал ошибку аналогичного типа в Eclipse во время тестирования программы веб-сервиса на веб-сервере 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

person Debashish    schedule 21.06.2014
comment
Я вижу два экземпляра ‹java-config classpath-suffix…› в файле domain.xml. В обоих есть разделы ‹jvm-options›. Я поместил строку выше (с тегами jvm-options) в оба раздела. По-прежнему не работает тестовая веб-служба. Я знаю, что проект работает, потому что вручную закодированный клиентский файл обращается к служебным файлам и выводит нужную информацию в консоль (из базы данных, связанной с служебными файлами). - person Max West; 19.12.2014
comment
‹P› Я закрыл проект, а клиентский проект вышел из NetBeans и подождал, пока Glassfish завершит свою работу (пока он завершает свою работу, он показывает индикатор выполнения). Затем я перезапустил Netbeans, перезагрузил проект веб-служб, перезагрузил файл клиента (это просто класс Java в отдельной / обычной папке проекта Java). Клиент распечатывает таблицы, которые показывают, что сервер и сервер базы данных работают, а также веб-службы и EJB-компоненты службы SOAP. Это просто не работает. Параметр accessExternalSchema где-то похоронен и не устанавливается должным образом в новом JDK. ‹/P› - person Max West; 19.12.2014

Включение доступа к внешней схеме

Вам необходимо включить IDE и GlassFish Server для доступа к внешней схеме для анализа файла WSDL веб-службы. Чтобы включить доступ, вам необходимо изменить файлы конфигурации IDE и GlassFish Server. Дополнительные сведения см. В разделе часто задаваемых вопросов. Как включить синтаксический анализ WSDL с помощью внешней схемы? Настройка IDE

Чтобы сгенерировать клиент веб-службы в среде IDE из файла веб-службы или WSDL, вам необходимо изменить файл конфигурации IDE (netbeans.conf), чтобы добавить следующий переключатель в netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

Дополнительные сведения о поиске и изменении файла конфигурации netbeans.conf см. В разделе часто задаваемых вопросов по Netbeans Conf. Настройка сервера GlassFish

При развертывании на сервере GlassFish необходимо изменить файл конфигурации сервера GlassFish (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>
person Ashwin Patil    schedule 10.10.2017

Создайте файл с именем jaxp.properties (если он не существует) по пути к вашей версии JDK / jre / lib, а затем добавьте в него следующую строку.

javax.xml.accessExternalSchema = all
person Gayan Mettananda    schedule 04.11.2019
comment
В MacOS: создайте файл jaxp.properties в /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib - person ederrafo; 28.11.2020

При использовании Maven с IntelliJ IDE вы можете добавить -Djavax.xml.accessExternalSchema=all в настройку Maven в разделе Параметры JVM для Maven Build Конфигурация Tools Runner

person Dexter Legaspi    schedule 15.01.2016
comment
Работает с Linux Mint 17.3, JDK 1.8.0.74 и Intellij IDEA 15. Thx. - person stuchl4n3k; 16.03.2016
comment
Отлично ! это также работает для меня, когда я использую mvn clean install -Djavax.xml.accessExternalSchema = все непосредственно на терминале независимо от IDE - person Tanorix; 05.08.2016

Это работает на jdk1.8.0_65

wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
person Stephen    schedule 25.11.2016

Для тех, кто использует задачу ANT wsimport, способ передачи параметра, предложенный @CMFly и указанный в документация:

<wsimport
   <!-- ... -->
   fork="true"
  >
  <jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
person Daniele Piccioni    schedule 09.12.2016

Теперь это исправлено в версии 2.5 (выпущена 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>
person DGardim    schedule 21.07.2017

Я использовал его с обычным проектом 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>
person EliuX    schedule 16.07.2015
comment
С помощью этого решения мне нужно было обновить jaxws-maven-plugin до 2.5, как указано в других ответах mojohaus. org / jaxws-maven-plugin / usage.html Но все же, лучший ответ в моем случае, спасибо! - person DependencyHell; 09.12.2019

Другое решение: wiki.netbeans.org

Мастер клиента веб-службы в среде IDE анализирует файл WSDL при создании клиента веб-службы из веб-службы или файла WSDL. Вам необходимо изменить файл конфигурации IDE (netbeans.conf), чтобы добавить следующий переключатель в netbeans_default_options. Вам потребуется перезапустить среду IDE, чтобы изменения вступили в силу.

-J-Djavax.xml.accessExternalSchema=all

При развертывании в GlassFish вам необходимо разрешить доступ к внешней схеме для создания тестового клиента для веб-службы. Чтобы включить доступ, вам необходимо изменить файл конфигурации сервера GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) и добавить следующий элемент параметра JVM. Вам нужно будет перезапустить сервер, чтобы изменения вступили в силу.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
person Özgür Akıncı    schedule 23.07.2014
comment
Простите, больше ничего не могу придумать. - person Özgür Akıncı; 08.04.2015

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

person TGU    schedule 19.04.2019

Если вы используете ant, вы можете добавить jvmarg к своим java-вызовам:

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
person CMfly    schedule 27.06.2014
comment
Не могли бы вы уточнить, куда поместить это в файл ant? - person John L; 25.10.2016

Очень простым переносимым решением было бы разместить следующую строку кода где-нибудь в важной части вашего кода, часть которой вы уверены, что она будет запущена (например, прямо в основном методе):

System.setProperty("javax.xml.accessExternalDTD", "all");

Это устанавливает необходимое системное свойство программно, без необходимости делать сложные изменения maven pom.xml (которые по какой-то причине у меня не сработали).

person R Hoekstra    schedule 07.07.2017

Другой альтернативой является обновление сценария оболочки wsimport.sh, добавив следующее:

Wsimport.sh находится в этом каталоге:

jaxws-ri.2.2.28 / bin

exec "$ JAVA" $ WSIMPORT_OPTS -Djavax.xml.accessExternalSchema = all -jar "$ JAXWS_HOME / lib / jaxws-tools.jar" "$ @"

person Percy Williams    schedule 11.11.2014
comment
Я хотел бы попробовать ваше предложение, но, очевидно, jaxws-ri.2.2.28 / bin нигде на моей машине нет. - person Max West; 19.12.2014

Другая ссылка: если вы используете maven-jaxb2-plugin до версии 0.9.0, вы можете использовать описанный обходной путь по этой проблеме, в которой такое поведение повлияло на плагин.

person Niel de Wet    schedule 25.06.2015