Je dois utiliser un service Web dans mon projet. J'utilise NetBeans alors j'ai cliqué avec le bouton droit de la souris sur mon projet et essayé d'ajouter un nouveau "client de service Web". La dernière fois que j'ai vérifié, c'était le moyen de créer un client de service Web. Mais cela a abouti à une AssertionError, en disant:
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; numéro de ligne: 52; numéro de colonne: 88; référence_schema: Impossible de lire le document de schéma ' xjc.xsd ', car l'accès à 'fichier' n'est pas autorisé en raison d'une restriction définie par la propriété accessExternalSchema .
La plate-forme Java par défaut pour NetBeans était JDK8 (version officielle d'Oracle). Par conséquent, lorsque j'ai modifié mon fichier netbeans.conf et que j'ai utilisé JDK7 (également d'Oracle) par défaut, tout a bien fonctionné. Donc, je pense que le problème est avec JDK8. Voici ma sortie Java -version
:
Version Java "1.8.0"
Environnement d'exécution Java SE (version 1.8.0-b132)
Serveur 64 bits Java HotSpot (TM) VM (version 25.0-b70, mode mixte)
Pour le moment, je garde JDK7 comme plate-forme Java par défaut. S'il existe un moyen de faire fonctionner JDK8, merci de le partager.
Eh bien, j'ai trouvé la solution. (sur http://docs.Oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )
Créez un fichier nommé jaxp.properties
(s'il n'existe pas) sous /path/to/jdk1.8.0/jre/lib
et écrivez cette ligne:
javax.xml.accessExternalSchema = all
C'est tout. Profitez de JDK 8.
Pas une réponse réelle mais plus comme une référence.
Si vous utilisez le plugin jaxws Maven et que vous obtenez le même message d'erreur, ajoutez la propriété mentionnée à la configuration du plugin:
...
<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>
J'exécute des versions de fourmis dans Eclipse IDE (4.4, Luna, sous Windows 7 x64). Plutôt que de modifier la bibliothèque JRE installée ou des scripts ant installés (plusieurs projets intégrant XJC dans leurs versions), je préfère modifier les paramètres Eclipse "Configurations des outils externes" et ajouter les éléments suivants aux arguments VM de Ant construire la configuration:
-Djavax.xml.accessExternalSchema=all
Les travaux suivants pour wsimport 2.2.9 inclus dans jdk 1.8.0_66:
wsimport -J-Djavax.xml.accessExternalSchema=all ....
Voici un conseil pour les utilisateurs de gradle sans droits d’administrateur: ajoutez cette ligne à votre tâche jaxb:
System.setProperty('javax.xml.accessExternalSchema', 'all')
il ressemblera à ceci:
jaxb {
System.setProperty('javax.xml.accessExternalSchema', 'all')
xsdDir = "${project.name}/xsd"
xjc {
taskClassname = "com.Sun.tools.xjc.XJCTask"
args = ["-npa", "-no-header"]
}
}
Dans mon cas, ajouter:
javax.xml.accessExternalSchema = all
jaxp.properties n'a pas fonctionné, je dois ajouter:
javax.xml.accessExternalDTD = all
Mon environnement est linux mint 17 et Java 8 Oracle ..__ Je vais le mettre là comme une réponse pour les personnes ayant le même problème.
J'ai testé cela pour la version 2.4 de l'artefact org.codehaus.mojo et cela a fonctionné ~
<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>
Si vous rencontrez ce problème lors de la conversion de WSDL en jave avec cxf-codegen-plugin , vous pouvez le résoudre en configurant le plug-in en fork et en fournissant l'option supplémentaire "-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>
Activation de l'accès au schéma externe
Vous devez activer IDE et le serveur GlassFish pour accéder à un schéma externe afin d'analyser le fichier WSDL du service Web. Pour activer l'accès, vous devez modifier les fichiers de configuration de IDE et du serveur GlassFish. Pour plus de détails, voir la FAQ Comment activer l'analyse de WSDL avec un schéma externe? Configuration de l'EDI
Pour générer un client de service Web dans IDE à partir d'un service Web ou d'un fichier WSDL, vous devez modifier le fichier de configuration IDE (netbeans.conf) afin d'ajouter le commutateur suivant à netbeans_default_options.
-J-Djavax.xml.accessExternalSchema=all
Pour plus d'informations sur la localisation et la modification du fichier de configuration netbeans.conf, reportez-vous à la FAQ Netbeans Conf . Configuration du serveur GlassFish
Si vous déployez sur le serveur GlassFish, vous devez modifier le fichier de configuration du serveur GlassFish (domain.xml) pour permettre au serveur d'accéder à des schémas externes afin d'analyser le fichier wsdl et de générer le client de test. Pour permettre l'accès aux schémas externes, ouvrez le fichier de configuration GlassFish (GLASSFISH_INSTALL/glassfish/domain/domain1/config/domain.xml) et ajoutez l'élément d'option JVM suivant (en gras). Vous devrez redémarrer le serveur pour que les modifications prennent effet.
</Java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</Java-config>
Pour ceux qui utilisent la tâche ANT wsimport
, un moyen de transmettre l’option suggérée par @CMFly et spécifiée dans le documentation est le suivant:
<wsimport
<!-- ... -->
fork="true"
>
<jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
Lorsque vous utilisez Maven avec IntelliJ IDE, vous pouvez ajouter -Djavax.xml.accessExternalSchema=all
au paramètre Maven sous Options JVM pour Maven Build Tools Configuration du gestionnaire
Cela fonctionne sur jdk1.8.0_65
wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
Il est maintenant corrigé dans la version 2.5 (publiée en juillet/17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .
Pour les versions 2.4.x, il existe une solution de contournement (décrite dans 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>
Je l'ai utilisé avec un projet maven régulier et je l'ai résolu avec la configuration de dépendance de ce plugin pour exécuter le 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>
Une autre solution pour adresser: wiki.netbeans.org
L'assistant de client de service Web de IDE analyse le fichier WSDL lors de la génération d'un client de service Web à partir d'un service Web ou d'un fichier WSDL. Vous devez modifier le fichier de configuration IDE (netbeans.conf) pour ajouter le commutateur suivant à netbeans_default_options. Vous devrez redémarrer le IDE pour que les modifications prennent effet.
-J-Djavax.xml.accessExternalSchema=all
Lors du déploiement sur GlassFish, vous devez activer l'accès au schéma externe pour générer un client de test pour un service Web. Pour permettre l'accès, vous devez modifier le fichier de configuration du serveur GlassFish (GLASSFISH_INSTALL/glassfish/domain/domain1/config/domain.xml) et ajouter l'élément d'option JVM suivant. Vous devrez redémarrer le serveur pour que les modifications prennent effet.
</Java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</Java-config>
Si vous utilisez ant, vous pouvez ajouter un jvmarg à vos appels Java:
<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
Autre référence: Si vous utilisez le maven-jaxb2-plugin
, avant la version 0.9.0, vous pouvez utiliser la solution de contournement décrite pour ce problème , dans laquelle ce comportement a affecté le plug-in.
NetBeans met à jour son tutoriel pour JDK8 et ce problème:
Prise en main des services Web JAX-WS -> Activation de l'accès au schéma externe
Une autre alternative consiste à mettre à jour le script de shell wsimport.sh en ajoutant ce qui suit:
Le fichier wsimport.sh se trouve dans ce répertoire:
jaxws-ri.2.2.28/bin
exec "$ Java" $ WSIMPORT_OPTS -Djavax.xml.accessExternalSchema = all -jar "$ JAXWS_HOME/lib/jaxws-tools.jar" "$ @"
Une solution portable très simple consisterait à placer la ligne de code suivante quelque part dans une partie cruciale de votre code, une partie dont vous êtes sûr qu’elle sera exécutée (par exemple directement dans la méthode principale):
System.setProperty("javax.xml.accessExternalDTD", "all");
Ceci définit la propriété système nécessaire par programme, sans avoir à effectuer de modifications maven pom.xml délicates (qui, pour une raison quelconque, ne m'ont pas fonctionné).
Je viens d'essayer que si vous utilisez SoapUI (5.4.x)
et utilisez l'outil Apache CXF
pour générer du code Java, mettez javax.xml.accessExternalSchema = all
dans le fichier YOUR_JDK/jre/lib/jaxp.properties
fonctionne également.