使用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/domain1
或domain2/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更改(由于某些原因,这对我不起作用)。