Ошибка генерации клиента WebService с JDK8

227

Мне нужно использовать веб-сервис в моем проекте. Я использую 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; номер строки: 52; номер столбца: 88; schema_reference: Не удалось прочитать документ схемы « xjc.xsd », поскольку доступ к «файлу» не разрешен из-за ограничений, установленных свойством accessExternalSchema .

Платформой Java по умолчанию для NetBeans была JDK8 (официальная версия Oracle), поэтому, когда я изменил свой файл netbeans.conf и сделал JDK7 (также из Oracle) своим стандартным, все работало нормально. Так что я думаю, что проблема с JDK8. Вот мой java -versionвывод:

Java-версия «1.8.0»
Java (TM) SE Runtime Environment (сборка 1.8.0-b132)
Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 25.0-b70, смешанный режим)

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

аб
источник
2
Я столкнулся с проблемой в Eclipse, что источники jaxb не генерировались при использовании m2eclipse и jdk1.8. В представлении маркеров я видел похожую ошибку о "accessExternalSchema". Когда я применил выбранное решение ниже, перезапустил затмение и очистил проект, источники были сгенерированы!
Йонас Берлин

Ответы:

403

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

аб
источник
12
Работает и для IntelliJ.
Mafro34
1
Я могу подтвердить это решение также как работу для сборки maven в eclipse с помощью maven и jaxb-plugin. Может кто-нибудь объяснить, почему вам не нужно это свойство для Java7?
Дэнни Ло
3
Это сработало для меня, но я должен был поместить файл в папку /path/to/jdk1.8.0/libне в следующем jreкаталоге.
Джефф
21
Это не очень портативно. Вам необходимо настроить локальную установку JDK на компьютере каждого разработчика, который пытается построить проект.
Натикс
7
у меня это не работает, сработало следующее: javax.xml.accessExternalDTD = all, также я могу установить это в коде, и это работает: System.setProperty ("javax.xml.accessExternalDTD", "all");
квартал
118

Не фактический ответ, а скорее как ссылка.

Если вы используете плагин 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>
jassuncao
источник
3
accessExternalSchema=allЗначение устанавливается по умолчанию , если вы используете более поздние версии (например , 0.12.3) из org.jvnet.jaxb2.maven2:maven-jaxb2-pluginплагина.
Джон Онстотт,
Вышеуказанное не сработало для меня. Эта версия сделала: <plugin> <groupId> org.codehaus.mojo </ groupId> <artifactId> jaxws-maven-plugin </ artifactId> <версия> $ {version.jaxws.plugin} </ version> <конфигурация> < ! - Требуется с JAXP 1.5 -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </ vmArg> </ vmArgs> </ configuration> </ plugin>
Dr4gon
@JonOnstott: последняя версия 2.4.1, и она не работает по умолчанию. Пришлось добавить это как в ответе.
Роберт Нестрой
36

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

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

Следующие работы для wsimport 2.2.9 включены в jdk 1.8.0_66:

wsimport -J-Djavax.xml.accessExternalSchema=all ....
tanderson
источник
Это работает для меня. Я попытался с jdk 1.8.0_65, и это не сработало, поэтому убедитесь, что вы используете jdk 1.8.0_66 или более поздней версии.
Джейб
2
Это правильный ответ при использовании wsimportнапрямую.
Кристофер Шульц
20

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

javax.xml.accessExternalSchema = all

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

javax.xml.accessExternalDTD = all

Моя среда - Linux Mint 17 и Java 8 Oracle. Я поставлю это как ответ для людей с такой же проблемой.

moretti.fabio
источник
2
Это зависит от того, хотите ли вы разрешить доступ к внешнему DTD или к XML-схеме (XSD). DTD является предшественником XML-схемы. Также могут быть случаи, когда вам нужно установить оба!
Филипп
17

Я проверил это для версии 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>
Мехди
источник
1
Возможно, именно vmArgs -Djavax.xml.accessExternalSchema=allнастроен в объявлении вашего плагина. Это обсуждается в Netbeans Bug 244891
kosgeinsky
15

Вот подсказка для пользователей без прав администратора: добавьте эту строку в вашу задачу 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"]
    }
}
Java_Waldi
источник
12

Если вы столкнулись с этой проблемой при преобразовании 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>
pjklauser
источник
1
Спасибо! все вышеперечисленные варианты не помогают и ваш работает на меня
ludenus
10

Я также получал похожий тип ошибок в 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 мне нужно изменить domain.xmlGlassFish, путь: <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

Debashish
источник
Я вижу два экземпляра <java-config classpath-суффикс…> в файле domain.xml. Оба имеют разделы <jvm-options> в них. Я поместил строку выше (с тегами jvm-options) в оба раздела. Он все еще не работает для запуска тестовой веб-службы. Я знаю, что проект работает, потому что кодированный клиентский файл обращается к служебным файлам и выводит правильную информацию в консоли (из базы данных, связанной с служебными файлами).
Макс Вест
<p> Я закрыл проект, и клиентский проект вышел из NetBeans и ждал, пока Glassfish отключится (на нем отображается индикатор прогресса во время завершения работы). Затем я перезапустил Netbeans, перезагрузил проект Web Services, перезагрузил файл Client (это просто класс Java в отдельной / обычной папке Java Project). Клиент распечатывает таблицы, которые показывают, что сервер и сервер базы данных работают, а также веб-службы и EJB-службы SOAP. Это просто не работает. Параметр accessExternalSchema где-то похоронен, и в новом JDK он не устанавливается должным образом. </ P>
Макс Вест
7

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

Вам нужно включить IDE и сервер GlassFish для доступа к внешней схеме для анализа файла WSDL веб-службы. Для обеспечения доступа вам необходимо изменить файлы конфигурации IDE и сервера GlassFish. Дополнительные сведения см. В разделе «Часто задаваемые вопросы». Как включить синтаксический анализ 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>
Эшвин Патил
источник
6

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

Декстер Легаспи
источник
Работает с Linux Mint 17.3, JDK 1.8.0.74 и Intellij IDEA 15. Спасибо.
stuchl4n3k
Ницца ! это также работает для меня, когда я использую "mvn clean install -Djavax.xml.accessExternalSchema = all" непосредственно на терминале независимо от IDE
Tanorix
5

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

wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
Стивен
источник
4

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

<wsimport
   <!-- ... -->
   fork="true"
  >
  <jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
Даниэле Пиччони
источник
4

Теперь это исправлено в версии 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>
DGardim
источник
3

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

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

javax.xml.accessExternalSchema = all
Гаян Меттананда
источник
2

Другое решение по адресу: 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>
Özgür Akıncı
источник
Извините, я не могу думать ни о чем другом.
Özgür Akıncı
1

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

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
CMfly
источник
Можете ли вы быть более конкретным, где вы положили это в файл муравья?
Джон Л
1

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

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

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

R Hoekstra
источник
1

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

TGU
источник
0

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

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

JAXWS-ri.2.2.28 / бен

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

Перси Уильямс
источник
Я хотел бы попробовать ваше предложение, но, очевидно, jaxws-ri.2.2.28 / bin не находится на моей машине.
Макс Вест
0

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

Ниль де Вет
источник