Error de generación de cliente de servicio web con JDK8

227

Necesito consumir un servicio web en mi proyecto. Utilizo NetBeans, así que hice clic derecho en mi proyecto e intenté agregar un nuevo "Cliente de servicio web". La última vez que lo comprobé, esta era la forma de crear un cliente de servicio web. Pero resultó en un AssertionError, diciendo:

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; número de línea: 52; columnNumber: 88; schema_reference: no se pudo leer el documento de esquema ' xjc.xsd ' porque el acceso a 'archivo' no está permitido debido a la restricción establecida por la propiedad accessExternalSchema .

La plataforma Java predeterminada para NetBeans era JDK8 (versión oficial de Oracle), así que cuando cambié mi archivo netbeans.conf e hice JDK7 (de Oracle, también) como mi predeterminado, todo funcionó bien. Así que creo que el problema es con JDK8. Aquí está mi java -versionsalida:

Java versión "1.8.0"
Java (TM) SE Runtime Environment (compilación 1.8.0-b132)
Java HotSpot (TM) VM de servidor de 64 bits (compilación 25.0-b70, modo mixto)

Por ahora, mantengo JDK7 como mi plataforma Java predeterminada. Si hay una manera de hacer que JDK8 funcione, por favor comparta.

ab
fuente
2
Experimenté un problema en Eclipse que las fuentes jaxb no se generaron al usar m2eclipse y jdk1.8. En la vista de marcadores, vi un error similar sobre "accessExternalSchema". Cuando apliqué la solución elegida a continuación, reinicié eclipse y limpié el proyecto, ¡se generaron las fuentes!
Jonas Berlin

Respuestas:

403

Bueno, encontré la solución. (basado en http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )

Cree un archivo llamado jaxp.properties(si no existe) debajo /path/to/jdk1.8.0/jre/liby luego escriba esta línea en él:

javax.xml.accessExternalSchema = all

Eso es todo. Disfruta JDK 8.

ab
fuente
12
Funciona también para intelliJ.
Mafro34
1
Puedo confirmar que esta solución también funciona para la compilación de maven en eclipse con maven y jaxb-plugin. ¿Alguien puede explicar por qué no necesita esta propiedad para Java7?
Danny Lo
3
Esto funcionó para mí, pero tuve que poner el archivo en /path/to/jdk1.8.0/libno debajo del jredirectorio adicional .
Geoff
21
Esto no es muy portátil. Debería modificar una instalación local de JDK en una máquina de cada desarrollador que intente construir el proyecto.
Natix
77
esto no funciona para mí, lo siguiente funcionó: javax.xml.accessExternalDTD = all, también puedo configurar esto en código y funciona: System.setProperty ("javax.xml.accessExternalDTD", "all");
qartal
118

No es una respuesta real, sino más como una referencia.

Si está utilizando el complemento jaxws Maven y obtiene el mismo mensaje de error, agregue la propiedad mencionada a la configuración del complemento:

...
<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
fuente
3
El accessExternalSchema=allvalor se establece de forma predeterminada si utiliza versiones posteriores (como 0.12.3) del org.jvnet.jaxb2.maven2:maven-jaxb2-plugincomplemento.
Jon Onstott
Lo anterior no funcionó para mí. Esta versión hizo: <plugin> <groupId> org.codehaus.mojo </groupId> <artifactId> jaxws-maven-plugin </artifactId> <version> $ {version.jaxws.plugin} </version> <configuration> < ! - Necesario con JAXP 1.5 -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </vmArg> </vmArgs> </configuration> </plugin>
Dr4gon
@JonOnstott: tiene la última versión 2.4.1 y no funciona de manera predeterminada. Tuve que agregar esto como en la respuesta.
Robert Niestroj
36

Ejecuto construcciones de hormigas dentro de Eclipse IDE (4.4, Luna, en Windows 7 x64). En lugar de modificar la biblioteca JRE instalada o cualquier script ant (tengo varios proyectos que incluyen XJC en sus compilaciones), prefiero cambiar la configuración de Eclipse "Configuraciones de herramientas externas" y agregar lo siguiente a los argumentos de VM para la configuración de compilación Ant:

-Djavax.xml.accessExternalSchema=all
gb96
fuente
2
Yo uso wsdl2java.bat de Apache CXF. Así que acabo de insertar la opción JVM en este archivo BAT. Funciona.
ka3ak
1
También podría agregar, que si incluimos esta opción como parámetro ant, todas las demás inclusiones mencionadas aquí son excesivas. ¡Pero no al revés! Entonces esta es la mejor solución. +1 (por supuesto, los usuarios de Maven deberían hacer el cambio apropiado en las opciones de Maven)
Gangnus
1
Tuve un problema similar cuando intenté ejecutar mvn clean install, acabo de agregar este indicador anterior y se implementó con éxito. Gracias
Spear A1
30

Lo siguiente funciona para wsimport 2.2.9 incluido en jdk 1.8.0_66:

wsimport -J-Djavax.xml.accessExternalSchema=all ....
Tanderson
fuente
Esto funciona para mi. Intenté con jdk 1.8.0_65 y eso no funcionó, así que asegúrese de estar usando jdk 1.8.0_66 o posterior.
jabe
2
Esta es la respuesta correcta cuando se usa wsimportdirectamente.
Christopher Schultz
20

En mi caso agregando:

javax.xml.accessExternalSchema = all

a jaxp.properties no funcionó, debo agregar:

javax.xml.accessExternalDTD = all

Mi entorno es linux mint 17 y java 8 oracle. Lo pondré allí como respuesta para las personas con el mismo problema.

moretti.fabio
fuente
2
Depende de si desea permitir el acceso a DTD externo o al Esquema XML (XSD). DTD es el predecesor del esquema XML. ¡También puede haber casos en los que necesite configurar ambos!
Philip Helger
17

Probé esto para la versión 2.4 del artefacto org.codehaus.mojo y funcionó ~

<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>
Mehdi
fuente
1
Quizás son los vmArgs los -Djavax.xml.accessExternalSchema=allque están configurados en su declaración de complemento. Se discute en Netbeans Bug 244891
kosgeinsky
15

Aquí hay una pista Sugerencia para usuarios de gradle sin derechos de administrador: agregue esta línea a su tarea jaxb:

System.setProperty('javax.xml.accessExternalSchema', 'all')

se verá así:

jaxb {
    System.setProperty('javax.xml.accessExternalSchema', 'all')
    xsdDir = "${project.name}/xsd"
    xjc {
        taskClassname = "com.sun.tools.xjc.XJCTask"
        args = ["-npa", "-no-header"]
    }
}
Java_Waldi
fuente
12

Si tiene este problema al convertir wsdl a jave con el plugin cxf-codegen-plugin , puede resolverlo configurando el plugin en fork y proporcionando la opción JVM adicional "-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>
pjklauser
fuente
1
¡Gracias! todas las opciones anteriores no ayudan y la tuya está funcionando para mí
ludenus
10

También recibí un tipo de error similar en Eclipse durante la prueba de un programa de servicio web en el servidor web 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.

He añadido javax.xml.accessExternalSchema = Allen el jaxp.properties, pero el trabajo doesnot para mí.

Sin embargo, encontré una solución aquí debajo que funciona para mí: para GlassFish Server, necesito modificar domain.xmlGlassFish, ruta: <path>/glassfish/domains/domain1o domain2/config/domain.xml) y agregar, <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>debajo de la <java-config>etiqueta

....

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> ... y luego reinicie el servidor GlassFish

Debashish
fuente
Veo dos instancias de <java-config classpath-suffix ...> en el archivo domain.xml. Ambos tienen secciones de <jvm-options> en ellos. Coloqué la línea arriba (con las etiquetas jvm-options) en ambas secciones. Todavía no funciona para ejecutar el servicio web de prueba. Sé que el proyecto está funcionando porque el archivo de cliente codificado a mano accede a los archivos de servicio e imprime la información correcta en la consola (desde la base de datos asociada con los archivos de servicio).
Max West
<p> Cerré el proyecto, y el proyecto del cliente, salí de NetBeans y esperé a que Glassfish se apagara solo (muestra un medidor de progreso mientras se está cerrando). Luego, reinicié Netbeans, volví a cargar el proyecto de Servicios Web, volví a cargar el archivo del Cliente (es solo una clase de Java en una carpeta de Proyecto Java separada / normal). El cliente imprime las tablas, lo que muestra que el servidor y el servidor de la base de datos están funcionando, así como los servicios web y los EJB del servicio SOAP. Simplemente no está funcionando. La configuración accessExternalSchema está enterrada en algún lugar y no se está configurando correctamente en el nuevo JDK. </p>
Max West
7

Habilitación del acceso al esquema externo

Debe habilitar el IDE y el servidor GlassFish para acceder al esquema externo para analizar el archivo WSDL del servicio web. Para habilitar el acceso, debe modificar los archivos de configuración del IDE y el servidor GlassFish. Para obtener más detalles, consulte las preguntas frecuentes ¿Cómo habilitar el análisis de WSDL con un esquema externo? Configurando el IDE

Para generar un cliente de servicio web en el IDE desde un servicio web o un archivo WSDL, debe modificar el archivo de configuración IDE (netbeans.conf) para agregar el siguiente modificador a netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

Para obtener más información sobre cómo localizar y modificar el archivo de configuración netbeans.conf, consulte las Preguntas frecuentes sobre Netbeans Conf. Configurar el servidor GlassFish

Si está implementando en GlassFish Server, debe modificar el archivo de configuración de GlassFish Server (domain.xml) para permitir que el servidor acceda a esquemas externos para analizar el archivo wsdl y generar el cliente de prueba. Para habilitar el acceso a esquemas externos, abra el archivo de configuración GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) y agregue el siguiente elemento de opción JVM (en negrita). Deberá reiniciar el servidor para que el cambio surta efecto.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Ashwin Patil
fuente
6

Al usar Maven con IntelliJ IDE, puede agregar -Djavax.xml.accessExternalSchema=alla la configuración de Maven en Opciones de JVM para la configuración de Maven Build Tools Runner

Dexter Legaspi
fuente
Funciona con Linux Mint 17.3, JDK 1.8.0.74 e Intellij IDEA 15. Thx.
stuchl4n3k
Agradable ! también funciona para mí cuando uso "mvn clean install -Djavax.xml.accessExternalSchema = all" directamente en el terminal independientemente de IDE
Tanorix
5

Esto funciona en jdk1.8.0_65

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

Para aquellos que usan la tarea ANT wsimport, una forma de pasar la opción sugerida por @CMFly y especificada en la documentación es la siguiente:

<wsimport
   <!-- ... -->
   fork="true"
  >
  <jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
Daniele Piccioni
fuente
4

Ahora está arreglado en la versión 2.5 (lanzada en julio / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

Para las versiones 2.4.x hay una solución alternativa (como se describe en 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
fuente
3

Lo usé con un proyecto regular de Maven , y lo resolví con esta configuración de dependencia de complemento para ejecutar el 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
fuente
Con esta solución, necesitaba actualizar jaxws-maven-plugina 2.5 como se especifica en otras respuestas mojohaus.org/jaxws-maven-plugin/usage.html Pero aún así, la mejor respuesta en mi caso, ¡gracias!
DependenciaHell
3

Cree un archivo llamado jaxp.properties(si no existe) debajo de la ruta a su "versión JDK / jre / lib" y luego agregue esta línea:

javax.xml.accessExternalSchema = all
Gayan Mettananda
fuente
2

Otra solución para abordar: wiki.netbeans.org

El asistente de Cliente de servicio web en el IDE analiza el archivo WSDL al generar un cliente de servicio web a partir de un servicio web o archivo WSDL. Debe modificar el archivo de configuración IDE (netbeans.conf) para agregar el siguiente modificador a netbeans_default_options. Deberá reiniciar el IDE para que el cambio surta efecto.

-J-Djavax.xml.accessExternalSchema=all

Al implementar en GlassFish, debe habilitar el acceso al esquema externo para generar un cliente de prueba para un servicio web. Para habilitar el acceso, debe modificar el archivo de configuración del servidor GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) y agregar el siguiente elemento de opción JVM. Deberá reiniciar el servidor para que el cambio surta efecto.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Özgür Akıncı
fuente
Lo siento, no puedo pensar en otra cosa.
Özgür Akıncı
1

Si está utilizando hormiga, puede agregar un jvmarg a sus llamadas de Java:

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
CMfly
fuente
¿Puedes ser más específico donde pones esto en un archivo ant?
John L
1

Una solución portátil muy simple sería, colocar la siguiente línea de código en algún lugar de una parte crucial de su código, una parte de la cual esté seguro de que se ejecutará (por ejemplo, directamente en el método principal):

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

Esto establece la propiedad del sistema necesaria mediante programación, sin tener que hacer cambios difíciles de maven pom.xml (que por alguna razón no funcionó para mí).

R Hoekstra
fuente
1

Acabo de probar que si usa SoapUI (5.4.x)y usa la Apache CXFherramienta para generar código java, poner javax.xml.accessExternalSchema = allen el YOUR_JDK/jre/lib/jaxp.propertiesarchivo también funciona.

TGU
fuente
0

Otra alternativa es actualizar el script de shell wsimport.sh agregando lo siguiente:

El wsimport.sh se encuentra en este directorio:

jaxws-ri.2.2.28 / bin

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

Percy Williams
fuente
Me encantaría probar su sugerencia, pero aparentemente jaxws-ri.2.2.28 / bin no está en ninguna parte de mi máquina.
Max West
0

Otra referencia: si está utilizando la maven-jaxb2-pluginversión anterior a la 0.9.0, puede usar la solución descrita en este problema , en la que este comportamiento afectó al complemento.

Niel de Wet
fuente