我需要在我的项目中使用Web服务。我使用NetBeans,因此我右键单击了我的项目,并尝试添加一个新的" Web服务客户端"。上次我检查时,这是创建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; columnNumber:88; schema_reference:无法读取架构文档' xjc.xsd ',因为' file'由于 accessExternalSchema 属性设置了限制,因此不允许访问。
NetBeans的默认Java平台是JDK8(Oracle的官方版本),所以当我更改我的netbeans.conf文件并将JDK7(也来自Oracle)作为我的默认设置时,一切正常。所以我认为问题出在JDK8上。这是我的java -version
输出:
java版本" 1.8.0"
Java(TM)SE运行时环境(版本1.8.0-b132)
Java HotSpot(TM)64位服务器VM(内置25.0-b70,混合模式)
目前,我将JDK7作为我的默认Java平台。如果有办法让JDK8工作,请分享。
答案 0 :(得分:368)
好吧,我找到了解决方案。 (基于http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA)
在jaxp.properties
下创建一个名为/path/to/jdk1.8.0/jre/lib
的文件(如果它不存在),然后在其中写下这一行:
javax.xml.accessExternalSchema = all
这就是全部。享受JDK 8。
答案 1 :(得分:109)
不是实际答案,而是更多作为参考。
如果您使用的是jaxws Maven插件并且收到相同的错误消息,请将上述属性添加到插件配置中:
...
<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>
答案 2 :(得分:32)
我在Eclipse IDE中运行ant build(4.4,Luna,在Windows 7 x64上)。我没有修改已安装的JRE库或任何ant脚本(我的构建中有多个包含XJC的项目),而是更喜欢更改Eclipse Settings&#34; External Tools Configurations&#34;并将以下内容添加到Ant构建配置的VM参数中:
-Djavax.xml.accessExternalSchema=all
答案 3 :(得分:22)
以下适用于jdk 1.8.0_66中包含的wsimport 2.2.9:
wsimport -J-Djavax.xml.accessExternalSchema=all ....
答案 4 :(得分:15)
我测试了这个版本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>
答案 5 :(得分:15)
在我的案例中添加:
javax.xml.accessExternalSchema = all
到jaxp.properties不起作用,我要添加:
javax.xml.accessExternalDTD = all
我的环境是linux mint 17和java 8 oracle。 我会把它作为解决同样问题的人的答案。
答案 6 :(得分:14)
以下是没有管理员权限的gradle用户的提示提示:将此行添加到您的jaxb-task:
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"]
}
}
答案 7 :(得分:11)
如果在使用cxf-codegen-plugin将wsdl转换为jave时遇到此问题,则可以通过将插件配置为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>
答案 8 :(得分:10)
在测试glassfish 4.0 Web服务器上的Web服务程序时,我在Eclipse中也遇到了类似的错误:
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.
我在javax.xml.accessExternalSchema = All
中添加了jaxp.properties
,但对我不起作用。
但是我在下面找到了一个适合我的解决方案:
对于GlassFish Server,我需要修改GlassFish的domain.xml
,
路径:<path>/glassfish/domains/domain1
或domain2/config/domain.xml
)并在<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
标记下添加<java-config>
....
<java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
...然后重新启动GlassFish服务器
答案 9 :(得分:5)
将Maven与IntelliJ IDE一起使用时,您可以在Maven Build Tools Runner configuration
的JVM选项下将-Djavax.xml.accessExternalSchema=all
添加到Maven设置
答案 10 :(得分:5)
启用对外部架构的访问
您需要启用IDE和GlassFish Server来访问外部架构以解析Web服务的WSDL文件。要启用访问权限,您需要修改IDE和GlassFish Server的配置文件。有关更多详细信息,请参阅常见问题解答如何使用外部模式解析WSDL? 配置IDE
要从Web服务或WSDL文件在IDE中生成Web服务客户端,您需要修改IDE配置文件(netbeans.conf)以将以下开关添加到netbeans_default_options。
-J-Djavax.xml.accessExternalSchema=all
有关查找和修改netbeans.conf配置文件的更多信息,请参阅Netbeans Conf FAQ。 配置GlassFish服务器
如果要部署到GlassFish Server,则需要修改GlassFish Server(domain.xml)的配置文件,以使服务器能够访问外部模式以解析wsdl文件并生成测试客户端。要启用对外部模式的访问,请打开GlassFish配置文件(GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml)并添加以下JVM选项元素(以粗体显示)。您需要重新启动服务器才能使更改生效。
</java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
答案 11 :(得分:4)
对于那些使用ANT任务wsimport
的人来说,按照{CMFly的建议传递选项并在documentation中指定的方法如下:
<wsimport
<!-- ... -->
fork="true"
>
<jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
答案 12 :(得分:3)
这适用于jdk1.8.0_65
wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
答案 13 :(得分:3)
现在已修复为2.5版本(在jul / 17中发布)。 https://github.com/mojohaus/jaxws-maven-plugin/issues/8
对于2.4.x版本,有一种解决方法(如https://github.com/mojohaus/jaxws-maven-plugin/issues/4中所述):
"type"
答案 14 :(得分:2)
我将它用于常规的 maven 项目,并通过此插件依赖项配置解决了问题,以便运行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>
答案 15 :(得分:2)
解决的另一个解决方案:wiki.netbeans.org
IDE中的Web Service Client向导在从Web服务或WSDL文件生成Web服务客户端时解析WSDL文件。您需要修改IDE配置文件(netbeans.conf)以将以下开关添加到netbeans_default_options。您需要重新启动IDE才能使更改生效。
-J-Djavax.xml.accessExternalSchema=all
部署到GlassFish时,您需要启用对外部架构的访问权限,以便为Web服务生成测试客户端。要启用访问,您需要修改GlassFish Server的配置文件(GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml)并添加以下JVM选项元素。您需要重新启动服务器才能使更改生效。
</java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
答案 16 :(得分:1)
如果您使用的是ant,可以在java调用中添加一个jvmarg:
<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
答案 17 :(得分:1)
一个非常简单的可移植解决方案是,将以下代码行放在代码的关键部分中,其中一部分您确定它将被运行(例如,在main方法中):< / p>
System.setProperty("javax.xml.accessExternalDTD", "all");
这以编程方式设置所需的系统属性,而不必进行棘手的maven pom.xml更改(由于某些原因,这对我没有用)。
答案 18 :(得分:0)
NetBeans更新他们的JDK8教程和本期:
Getting Started with JAX-WS Web Services -> Enabling Access to External Schema
答案 19 :(得分:0)
另一个参考:
如果您使用版本0.9.0之前的maven-jaxb2-plugin
,则可以使用on this issue所述的解决方法,此行为会影响该插件。
答案 20 :(得分:0)
另一种方法是通过添加以下内容来更新wsimport.sh shell脚本:
wsimport.sh位于以下目录中:
JAXWS-ri.2.2.28 / bin中
exec“$ JAVA”$ WSIMPORT_OPTS -Djavax.xml.accessExternalSchema = all -jar“$ JAXWS_HOME / lib / jaxws-tools.jar”“$ @”
答案 21 :(得分:0)
我刚刚尝试过,如果您使用SoapUI (5.4.x)
并使用Apache CXF
工具生成Java代码,请将javax.xml.accessExternalSchema = all
放在YOUR_JDK/jre/lib/jaxp.properties
文件中。
答案 22 :(得分:0)
在“ JDK版本/ jre / lib”的路径下创建一个名为jaxp.properties
的文件(如果不存在),然后在其中添加以下行:
javax.xml.accessExternalSchema = all