JDK 8的Web服务客户端生成错误

时间:2014-04-11 11:39:06

标签: webservice-client java-8 netbeans-8

我需要在我的项目中使用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工作,请分享。

23 个答案:

答案 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/domain1domain2/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)

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