web-dev-qa-db-fra.com

Erreur de génération de client de service Web avec JDK 8

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.

201
Abdullah Battal

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.

361
Abdullah Battal

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>
108
jassuncao

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
28
gb96

Les travaux suivants pour wsimport 2.2.9 inclus dans jdk 1.8.0_66:

wsimport -J-Djavax.xml.accessExternalSchema=all ....
22
tanderson

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"]
    }
}
14
Java_Waldi

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.

14
moretti.fabio

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>
14
Mehdi

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>
11
pjklauser

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>
5
Ashwin Patil

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>
4
Daniele Piccioni

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

4
Dexter Legaspi

Cela fonctionne sur jdk1.8.0_65

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

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>
3
DGardim

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>
2
EliuX

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>
2
Özgür Akıncı

Si vous utilisez ant, vous pouvez ajouter un jvmarg à vos appels Java:

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

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.

0
Niel de Wet

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

0
user3158918

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" "$ @"

0
Percy Williams

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é). 

0
R Hoekstra

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.

0
TGU