Помилка генерації клієнта WebService з JDK8


227

Мені потрібно споживати веб-сервіс у своєму проекті. Я використовую 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; рядокNumber: 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-бітний сервер VM (збірка 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 в затемненні з Maven та jaxb-плагіном. Чи може хтось пояснити, чому вам не потрібна ця властивість для Java7?
Денні Ло

3
Це працювало для мене, але мені довелося помістити файл під /path/to/jdk1.8.0/libне під подальшим jreкаталогом.
Джефф

21
Це не дуже портативно. Вам потрібно налаштувати локальну установку JDK на машині кожного розробника, який намагається створити проект.
Натікс

7
це не працює для мене, працювало наступне: javax.xml.accessExternalDTD = все, також я можу встановити це в коді, і він працює: System.setProperty ("javax.xml.accessExternalDTD", "всі");
квартал

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>

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> $ {version.jaxws.plugin} </version> <configuration> < ! - Потрібно з JAXP 1.5 -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </vmArg> </vmArgs> </configuration> </plugin>
Dr4gon

@JonOnstott: мати останню версію 2.4.1 і вона не працює за замовчуванням. Довелося додати це як у відповідь.
Роберт Неєстрой

36

Я запускаю мурашині збірки в межах Eclipse IDE (4.4, Luna, в Windows 7 x64). Замість того, щоб змінювати встановлену вкладку JRE або будь-які сценарії мурашок (у мене є кілька проектів, які включають XJC у свої збірки), я вважаю за краще змінити параметри Eclipse "Конфігурації зовнішніх інструментів" та додати наступне до аргументів VM для конфігурації збірки Ant:

-Djavax.xml.accessExternalSchema=all

2
Я використовую wsdl2java.bat від Apache CXF. Тому я просто вставив варіант JVM у цей BAT-файл. Це працює.
ka3ak

1
Я також можу додати, ніж якщо ми включимо цей параметр як параметр мурашника, всі інші включені згадані тут надмірні. Але не навпаки! Тож це найкраще рішення. +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 ....

Це працює для мене. Я спробував з jdk 1.8.0_65, і це не спрацювало, тому переконайтеся, що ви використовуєте jdk 1.8.0_66 або пізнішої версії.
jabe

2
Це правильна відповідь при використанні wsimportбезпосередньо.
Крістофер Шульц

20

У моєму випадку додаю:

javax.xml.accessExternalSchema = all

щоб jaxp.properties не працювала, додам:

javax.xml.accessExternalDTD = all

Моє середовище - Linux mint 17 та java 8 oracle. Я викладу це як відповідь для людей з тією ж проблемою.


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

Ось підказка для користувачів 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"]
    }
}

12

Якщо у вас виникає ця проблема при перетворенні 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>

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: <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


Я бачу два екземпляри <java-config classpath-суфікс…> у файлі domain.xml. В обох є розділи <jvm-options> в них. Я розмістив рядок вище (з тегами jvm-options) в обох розділах. Це все ще не працює для запуску тестової веб-служби. Я знаю, що проект працює, тому що файл, кодований клієнтом, має доступ до службових файлів і виводить потрібну інформацію на консолі (з бази даних, пов’язаної з файлами служби).
Макс Вест

<p> Я закрив проект, і клієнтський проект, вийшов з NetBeans і чекав, коли Glassfish закриється (він показує метр прогресу під час його вимкнення). Потім я перезапустив Netbeans, перезавантажив проект Web Services, перезавантажив файл клієнта (це просто клас Java в окремій / звичайній папці Java Project). Клієнт виводить таблиці, на яких видно, що сервер і сервер баз даних працюють, а також сервіс SOAP Web Services & EJB. Це просто не працює. Параметр accessExternalSchema похований десь і не встановлюється належним чином у новому JDK. </p>
Max West,

7

Увімкнення доступу до зовнішньої схеми

Потрібно включити IDE та сервер GlassFish для доступу до зовнішньої схеми для розбору файлу WSDL веб-служби. Щоб увімкнути доступ, вам потрібно змінити файли конфігурації IDE та сервера GlassFish. Детальніше див. FAQ, як увімкнути розбір WSDL за допомогою зовнішньої схеми? Налаштування IDE

Щоб створити клієнт веб-сервісу в IDE з веб-служби або файлу WSDL, вам потрібно змінити файл конфігурації IDE (netbeans.conf), щоб додати наступний комутатор до netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

Докладніше про пошук та зміну файлу конфігурації netbeans.conf див. Поширені запитання щодо конфіденційності Netbeans. Налаштування сервера GlassFish

Якщо ви розгортаєте сервер GlassFish, вам потрібно змінити файл конфігурації сервера GlassFish (domain.xml), щоб сервер мав доступ до зовнішніх схем для розбору файлу wsdl та генерування тестового клієнта. Щоб дозволити доступ до зовнішніх схем, відкрийте файл конфігурації GlassFish (GLASSFISH_INSTALL / glassfish / domeins / domain1 / config / domain.xml) та додайте наступний елемент параметра JVM (напівжирним шрифтом). Вам потрібно буде перезапустити сервер, щоб зміни вступили в силу.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>

6

Під час використання Maven з ID ID IntelliJ ви можете додати -Djavax.xml.accessExternalSchema=allдо параметра Maven у розділі Параметри JVM для налаштування Maven Build Tools Runner.


Працює з Linux Mint 17.3, JDK 1.8.0.74 та Intellij IDEA 15. Thx.
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/isissue/8 .

Для версій 2.4.x існує рішення (як зазначено в https://github.com/mojohaus/jaxws-maven-plugin/isissue/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>

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>

За допомогою цього рішення мені потрібно було оновити 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 / domeins / domain1 / config / domain.xml) та додати наступний елемент параметра JVM. Вам потрібно буде перезапустити сервер, щоб зміни вступили в силу.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>

Вибачте, нічого іншого не можу думати.
Özgür Akıncı

1

Якщо ви використовуєте мурашник, ви можете додати jvmarg до своїх дзвінків Java:

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />

Чи можете ви бути більш конкретними, де ви помістите це у файл мурашок?
Джон Л

1

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

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

Це встановлює необхідну властивість системи програмно, без необхідності робити хитрі зміни в maven pom.xml (які чомусь не працювали для мене).


1

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


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 ніде не знаходиться на моїй машині.
Макс Вест,


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.