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

问题描述 投票:205回答:22

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

webservice-client java-8 netbeans-8
22个回答
372
投票

好吧,我找到了解决方案。 (基于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。


5
投票

将Maven与IntelliJ IDE一起使用时,您可以在<java-config>的JVM选项下将.... 添加到Maven设置


5
投票

启用对外部架构的访问

您需要启用IDE和GlassFish Server来访问外部模式以解析Web服务的WSDL文件。要启用访问权限,您需要修改IDE和GlassFish Server的配置文件。有关更多详细信息,请参阅常见问题解答如何使用外部模式解析WSDL?配置IDE

要从Web服务或WSDL文件在IDE中生成Web服务客户端,您需要修改IDE配置文件(netbeans.conf)以将以下开关添加到netbeans_default_options。

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

有关查找和修改netbeans.conf配置文件的更多信息,请参阅Netbeans Conf FAQ。配置GlassFish服务器

如果要部署到GlassFish Server,则需要修改GlassFish Server(domain.xml)的配置文件,以使服务器能够访问外部模式以解析wsdl文件并生成测试客户端。要启用对外部模式的访问,请打开GlassFish配置文件(GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml)并添加以下JVM选项元素(以粗体显示)。您需要重新启动服务器才能使更改生效。

-Djavax.xml.accessExternalSchema=all

4
投票

对于那些使用ANT任务Maven Build Tools Runner configuration的人来说,按照@CMFly的建议传递选项并在-J-Djavax.xml.accessExternalSchema=all 中指定的方法如下:

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

3
投票

这适用于jdk1.8.0_65

wsimport

3
投票

它现在修复为2.5版本(jul / 17发布)。 documentation

对于2.4.x版本,有一种解决方法(如qazxsw poi中所述):

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

2
投票

另一种解决方案:wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl

IDE中的Web Service Client向导在从Web服务或WSDL文件生成Web服务客户端时解析WSDL文件。您需要修改IDE配置文件(netbeans.conf)以将以下开关添加到netbeans_default_options。您需要重新启动IDE才能使更改生效。

https://github.com/mojohaus/jaxws-maven-plugin/issues/8

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

https://github.com/mojohaus/jaxws-maven-plugin/issues/4

2
投票

我在常规的maven项目中使用它,并通过这个插件依赖配置来解决它运行 <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>

wiki.netbeans.org

1
投票

如果您使用的是ant,可以在java调用中添加一个jvmarg:

-J-Djavax.xml.accessExternalSchema=all

1
投票

一个非常简单的可移植解决方案是将以下代码行放在代码的关键部分中,其中一部分您确定它将被运行(例如,在main方法中):

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

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


0
投票

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

wsimport.sh位于以下目录中:

那么xws。 2. 2. 28 /瓶

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


111
投票

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

如果您使用的是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>

0
投票

另一个参考:如果您使用的是xjc plugin,在版本0.9.0之前,您可以使用 <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> 描述的解决方法,其中此行为会影响插件。


0
投票

NetBeans更新了他们的JDK8教程和本期杂志:

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


0
投票

我刚试过,如果你使用System.setProperty("javax.xml.accessExternalDTD", "all"); 并使用maven-jaxb2-plugin工具生成java代码,将on this issue放在Getting Started with JAX-WS Web Services -> Enabling Access to External Schema文件中也可以。


33
投票

我在Eclipse IDE中运行ant构建(4.4,Luna,在Windows 7 x64上)。我没有修改已安装的JRE lib或任何ant脚本(我的构建中有多个包含XJC的项目),我更喜欢更改Eclipse Settings“External Tools Configurations”并将以下内容添加到Ant构建配置的VM参数中:

-Djavax.xml.accessExternalSchema=all

23
投票

以下适用于jdk 1.8.0_66中包含的wsimport 2.2.9:

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

15
投票

在我的情况下添加:

javax.xml.accessExternalSchema = all

到jaxp.properties不起作用,我要添加:

javax.xml.accessExternalDTD = all

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


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>

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"]
    }
}

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>

10
投票

在glassfish 4.0 Web服务器上测试Web服务程序时,我在Eclipse中也遇到了类似的错误:qazxsw poi

我在qazxsw poi中添加了qazxsw poi,但对我不起作用。

但是我在下面找到了一个适用于我的解决方案:对于GlassFish Server,我需要修改GlassFish的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 = Alljaxp.properties)并在domain.xml标签上添加<path>/glassfish/domains/domain1

domain2/config/domain.xml

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

© www.soinside.com 2019 - 2024. All rights reserved.