使用JDK8的WebService客户端生成错误

我需要在我的项目中使用Web服务。 我使用NetBeans,所以我右键单击我的项目,并试图添加一个新的“Web服务客户端”。 上次我检查,这是创build一个Web服务客户端的方式。 但它导致了一个AssertionError,说:

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; lineNumber:52; 列号:88; schema_reference:无法读取模式文档“ xjc.xsd ”,因为由于accessExternalSchema属性设置的限制,不允许“文件”访问。

NetBeans的默认Java平台是JDK8(甲骨文的正式版本),所以当我改变我的netbeans.conf文件,并使JDK7(从Oracle,以及)作为我的默认,一切工作正常。 所以我认为问题在于JDK8。 这是我的java -version输出:

java版本“1.8.0”
Java(TM)SE运行时环境(build 1.8.0-b132)
Java HotSpot(TM)64位服务器虚拟机(构build25.0-b70,混合模式)

现在,我将JDK7作为默认的Java平台。 如果有办法让JDK8工作,请分享。 提前致谢。

那么,我find了解决scheme。 (基于http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA

/path/to/jdk1.8.0/jre/lib下创build一个名为jaxp.properties的文件(如果它不存在),然后写下这一行:

 javax.xml.accessExternalSchema = all 

就这样。 享受JDK 8。

不是一个实际的答案,而是更多的参考。

如果您使用的是jaxws Maven插件,并且您收到相同的错误消息,请将提到的属性添加到插件configuration中:

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

我在Eclipse IDE(4.4,Luna,Windows 7 x64)中运行ant构build。 我不想修改已安装的JRE库或任何ant脚本(我有多个在其构build中包含XJC的项目),而是更改Eclipse设置“外部工具configuration”,并将以下内容添加到Ant构buildconfiguration的VM参数中:

 -Djavax.xml.accessExternalSchema=all 

jdk 1.8.0_66中的wsimport 2.2.9包含以下工作:

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

我testing了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> 

下面是没有pipe理员权限的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"] } } 

在testingglassfish 4.0 web服务器上的webservice程序期间,我也在Eclipse中得到类似types的错误: 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. 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.

我已经在jaxp.properties添加了javax.xml.accessExternalSchema = All ,但是对我不起作用。

不过,我在下面find了一个解决scheme,适用于我:对于GlassFish服务器,我需要修改GlassFish的domain.xml ,path为: <path>/glassfish/domains/domain1domain2/config/domain.xml )并添加, <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> <java-config>标记下的<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>

 .... 

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> …然后重新启动GlassFish服务器

在我的情况下添加:

 javax.xml.accessExternalSchema = all 

到jaxp.properties没有工作,我要补充:

 javax.xml.accessExternalDTD = all 

我的环境是linux mint 17和java 8 oracle。 我会把它作为同样问题的人的答案。

如果使用cxf- codegen -plugin将wsdl转换为jave时遇到此问题,则可以通过将插件configuration为fork并提供附加的“-Djavax.xml.accessExternalSchema = all”JVM选项来解决此问题。

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

在IntelliJ IDE中使用Maven时,可以在Maven的“Maven设置”下将-Djavax.xml.accessExternalSchema=all添加到Maven设置中。

我用它与一个常规的maven项目,并得到解决这个插件依赖configuration运行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> 

如果你正在使用ant,你可以添加一个jvmarg到你的java调用:

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

解决的另一个解决scheme: wiki.netbeans.org

IDE中的Web服务客户端向导在从Web服务或WSDL文件生成Web服务客户端时parsingWSDL文件。 您需要修改IDEconfiguration文件(netbeans.conf)以将以下切换添加到netbeans_default_options。 您将需要重新启动IDE才能使更改生效。

 -J-Djavax.xml.accessExternalSchema=all 

在部署到GlassFish时,您需要启用对外部模式的访问,以便为Web服务生成testing客户端。 要启用访问,您需要修改GlassFish服务器的configuration文件(GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml)并添加以下JVM选项元素。 您将需要重新启动服务器才能使更改生效。

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

对于那些使用ANT任务wsimport ,按照@CMFly的build议传递选项并在文档中指定的方法如下:

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

它现在被固定在2.5版本(17日/ 17日发布)。 https://github.com/mojohaus/jaxws-maven-plugin/issues/8

对于2.4.x版本,有一个解决方法(如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> 

启用对外部模式的访问

您需要启用IDE和GlassFish服务器来访问外部模式来parsingWeb服务的WSDL文件。 要启用访问,您需要修改IDE和GlassFish服务器的configuration文件。 有关更多详细信息,请参阅常见问题解答如何使用外部模式启用WSDLparsing? configurationIDE

要从Web服务或WSDL文件在IDE中生成Web服务客户机,您需要修改IDEconfiguration文件(netbeans.conf)以将以下切换添加到netbeans_default_options。

 -J-Djavax.xml.accessExternalSchema=all 

有关查找和修改netbeans.confconfiguration文件的更多信息,请参见Netbeans Conf FAQ。 configurationGlassFish服务器

如果要部署到GlassFish服务器,则需要修改GlassFish服务器(domain.xml)的configuration文件,以使服务器能够访问外部架构来parsingwsdl文件并生成testing客户端。 要启用对外部模式的访问,请打开GlassFishconfiguration文件(GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml)并添加以下JVM选项元素(粗体)。 您将需要重新启动服务器才能使更改生效。

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

另一种方法是通过添加以下内容来更新wsimport.sh shell脚本:

wsimport.sh位于以下目录中:

JAXWS-ri.2.2.28 /箱

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

另一个参考:如果您使用的是maven-jaxb2-plugin ,在版本0.9.0之前,您可以使用在这个问题上描述的解决方法,这个行为影响了插件。

NetBeans更新他们的JDK8教程和这个问题:

JAX-WS Web服务入门 – >启用对外部模式的访问

这适用于jdk1.8.0_65

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

一个非常简单的便携式解决scheme是将下面的代码放在代码的一个关键部分,其中的一部分你可以肯定会运行(例如在主要方法中):

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

这以编程方式设置所需的系统属性,而不必做麻烦的maven pom.xml更改(由于某些原因,这对我不起作用)。