Ich muss in meinem Projekt einen Webservice nutzen. Ich benutze NetBeans, also habe ich mit der rechten Maustaste auf mein Projekt geklickt und versucht, einen neuen "Web Service Client" hinzuzufügen. Beim letzten Mal habe ich einen Web-Service-Client erstellt. Es ergab sich jedoch ein AssertionError, der lautete:
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; Zeilennummer: 52; Spaltennummer: 88; schema_reference: Lesen des Schemadokuments ' xjc.xsd ' fehlgeschlagen, da der Dateizugriff aufgrund der durch die accessExternalSchema -Eigenschaft festgelegten Einschränkung nicht zulässig ist.
Die Standard-Java-Plattform für NetBeans war JDK8 (die offizielle Version von Oracle). Wenn ich also meine netbeans.conf-Datei änderte und JDK7 (ebenfalls von Oracle) als Standardeinstellung verwendete, funktionierte alles einwandfrei. Ich denke, das Problem liegt bei JDK8. Hier ist meine Java -version
-Ausgabe:
Java-Version "1.8.0"
Java (TM) SE-Laufzeitumgebung (Build 1.8.0-b132)
Java HotSpot (TM) 64-Bit-Server VM (Build 25.0-b70, gemischter Modus)
Im Moment behalte ich JDK7 als meine Standard-Java-Plattform. Wenn es eine Möglichkeit gibt, JDK8 zum Laufen zu bringen, teilen Sie es bitte mit.
Nun, ich habe die Lösung gefunden. (basierend auf http://docs.Oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )
Erstellen Sie unter jaxp.properties
eine Datei mit dem Namen /path/to/jdk1.8.0/jre/lib
(falls diese nicht vorhanden ist) und schreiben Sie dann diese Zeile hinein:
javax.xml.accessExternalSchema = all
Das ist alles. Genießen Sie JDK 8.
Keine tatsächliche Antwort, sondern mehr als Referenz.
Wenn Sie das jaxws Maven-Plugin verwenden und dieselbe Fehlermeldung erhalten, fügen Sie die erwähnte Eigenschaft zur Plugin-Konfiguration hinzu:
...
<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>
Ich führe Ant-Builds in Eclipse IDE (4.4, Luna, unter Windows 7 x64) aus. Anstatt die installierte JRE-Bibliothek oder Ant-Skripts zu ändern (ich habe mehrere Projekte, die XJC in ihren Builds enthalten), ziehe ich es vor, die Eclipse-Einstellungen "External Tools Configurations" zu ändern und den Argumenten VM des Ant Folgendes hinzuzufügen Build-Konfiguration:
-Djavax.xml.accessExternalSchema=all
Die folgenden Funktionen für wsimport 2.2.9 sind in jdk 1.8.0_66 enthalten:
wsimport -J-Djavax.xml.accessExternalSchema=all ....
Hier ein Hinweis Hinweis für Benutzer ohne Administratorrechte: Fügen Sie diese Zeile zu Ihrer jaxb-Aufgabe hinzu:
System.setProperty('javax.xml.accessExternalSchema', 'all')
es wird so aussehen:
jaxb {
System.setProperty('javax.xml.accessExternalSchema', 'all')
xsdDir = "${project.name}/xsd"
xjc {
taskClassname = "com.Sun.tools.xjc.XJCTask"
args = ["-npa", "-no-header"]
}
}
In meinem Fall füge ich hinzu:
javax.xml.accessExternalSchema = all
zu jaxp.properties funktionierte nicht, ich muss hinzufügen:
javax.xml.accessExternalDTD = all
Meine Umgebung ist Linux Mint 17 und Java 8 Oracle.
Ich habe dies für Version 2.4 von artefakt org.codehaus.mojo getestet und das hat funktioniert ~
<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>
Wenn Sie dieses Problem beim Konvertieren von wsdl in jave mit dem cxf-codegen-plugin erhalten, können Sie es lösen, indem Sie das Plugin in fork konfigurieren und die zusätzliche Option "-Djavax.xml.accessExternalSchema = all" JVM angeben .
<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>
Ich habe auch einen ähnlichen Fehler in Eclipse beim Testen eines Webservice-Programms auf Glassfish 4.0-Webserver erhalten: 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.
Ich habe javax.xml.accessExternalSchema = All
in jaxp.properties
hinzugefügt, funktioniert aber nicht für mich.
Ich habe hier jedoch eine Lösung gefunden, die für mich geeignet ist: Für GlassFish Server muss ich den domain.xml
des GlassFish, -Pfads: <path>/glassfish/domains/domain1
oder domain2/config/domain.xml
) ändern und unter dem <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
-Tag <Java-config>
hinzufügen
....
<Java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</Java-config>
... und starten Sie den GlassFish-Server neu
Zugriff auf externes Schema ermöglichen
Sie müssen IDE und den GlassFish-Server aktivieren, um auf ein externes Schema zugreifen zu können, um die WSDL-Datei des Webdienstes zu analysieren. Um den Zugriff zu ermöglichen, müssen Sie die Konfigurationsdateien von IDE und des GlassFish-Servers ändern. Weitere Informationen finden Sie unter FAQ. So aktivieren Sie das Analysieren von WSDL mit einem externen Schema? Konfigurieren der IDE
Um einen Web-Service-Client in der IDE aus einem Web-Service oder einer WSDL-Datei zu generieren, müssen Sie die IDE -Konfigurationsdatei (netbeans.conf) ändern, um den folgenden Schalter zu netbeans_default_options hinzuzufügen.
-J-Djavax.xml.accessExternalSchema=all
Weitere Informationen zum Suchen und Ändern der Konfigurationsdatei netbeans.conf finden Sie unter Netbeans Conf FAQ . Konfigurieren des GlassFish-Servers
Bei der Bereitstellung auf dem GlassFish-Server müssen Sie die Konfigurationsdatei des GlassFish-Servers (domain.xml) ändern, damit der Server auf externe Schemas zugreifen kann, um die WSDL-Datei zu parsen und den Testclient zu generieren. Um den Zugriff auf externe Schemas zu ermöglichen, öffnen Sie die GlassFish-Konfigurationsdatei (GLASSFISH_INSTALL/glassfish/domains/domain1/config/domain.xml) und fügen Sie das folgende JVM-Optionselement (in Fettdruck) hinzu. Sie müssen den Server neu starten, damit die Änderung wirksam wird.
</Java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</Java-config>
Für diejenigen, die die ANT-Task wsimport
verwenden, besteht die folgende Möglichkeit, die von @CMFly vorgeschlagene und in der documentation angegebene Option zu übergeben:
<wsimport
<!-- ... -->
fork="true"
>
<jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
Wenn Sie Maven mit IntelliJ IDE verwenden, können Sie unter JVM-Optionen für Maven Build Tools Runner-Konfiguration-Djavax.xml.accessExternalSchema=all
zur Maven-Einstellung hinzufügen. _
Dies funktioniert an jdk1.8.0_65
wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
Es ist jetzt in Version 2.5 (veröffentlicht in jul/17) behoben. https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .
Für die 2.4.x-Versionen gibt es eine Problemumgehung (wie in https://github.com/mojohaus/jaxws-maven-plugin/issues/4 beschrieben):
<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>
Ich habe es mit einem regulären maven - Projekt verwendet und es wurde mit dieser Plugin-Abhängigkeitskonfiguration für die Ausführung des xjc plugin
gelöst:
<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>
Eine andere Lösung für die Adressierung: wiki.netbeans.org
Der Web Service Client-Assistent in IDE analysiert die WSDL-Datei, wenn ein Web Service-Client aus einem Web Service oder einer WSDL-Datei generiert wird. Sie müssen die IDE Konfigurationsdatei (netbeans.conf) ändern, um den folgenden Schalter zu den netbeans_default_options hinzuzufügen. Sie müssen IDE neu starten, damit die Änderung wirksam wird.
-J-Djavax.xml.accessExternalSchema=all
Bei der Bereitstellung bei GlassFish müssen Sie den Zugriff auf ein externes Schema aktivieren, um einen Testclient für einen Webdienst zu generieren. Um den Zugriff zu aktivieren, müssen Sie die Konfigurationsdatei des GlassFish-Servers (GLASSFISH_INSTALL/glassfish/domains/domain1/config/domain.xml) ändern und das folgende JVM-Optionselement hinzufügen. Sie müssen den Server neu starten, damit die Änderung wirksam wird.
</Java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</Java-config>
Wenn Sie ant verwenden, können Sie Ihren Java-Aufrufen einen Jvmarg hinzufügen:
<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
Eine weitere Referenz: Wenn Sie den maven-jaxb2-plugin
vor Version 0.9.0 verwenden, können Sie die beschriebene Problemumgehung in diesem Problem verwenden, bei der dieses Verhalten das Plugin beeinflusst hat.
NetBeans aktualisieren ihr Tutorial für JDK8 und diese Ausgabe:
Erste Schritte mit JAX-WS Web Services -> Zugriff auf externes Schema ermöglichen
Eine andere Alternative ist das Aktualisieren des Shell-Skripts wsimport.sh, indem Folgendes hinzugefügt wird:
Die Datei wsimport.sh befindet sich in diesem Verzeichnis:
jaxws-ri.2.2.28/bin
exec "$ Java" $ WSIMPORT_OPTS -Djavax.xml.accessExternalSchema = Alle-Jar "$ JAXWS_HOME/lib/jaxws-tools.jar" "$ @"
Eine sehr einfache tragbare Lösung wäre, die folgende Codezeile irgendwo in einem wichtigen Teil Ihres Codes zu platzieren, von dem Sie sicher sind, dass er ausgeführt wird (zum Beispiel direkt in der Hauptmethode):
System.setProperty("javax.xml.accessExternalDTD", "all");
Dadurch wird die benötigte Systemeigenschaft programmgesteuert festgelegt, ohne dass komplizierte Änderungen von maven pom.xml vorgenommen werden müssen (was aus irgendeinem Grund für mich nicht funktionierte).
Ich habe gerade versucht, dass, wenn Sie SoapUI (5.4.x)
verwenden und das Apache CXF
-Tool zum Generieren von Java-Code verwenden, javax.xml.accessExternalSchema = all
in die YOUR_JDK/jre/lib/jaxp.properties
-Datei auch funktioniert.