JDK8的WebService客户端生成错误


227

我需要在项目中使用Web服务。我使用NetBeans,因此右键单击我的项目,并尝试添加新的“ Web Service客户端”。上次检查时,这是创建Web服务客户端的方法。但这导致一个AssertionError,说:

java.lang.AssertionError:org.xml.sax.SAXParseException; systemId:jar:文件:/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™SE运行时环境(内部版本1.8.0-b132)
Java HotSpot(TM)64位服务器VM(内部版本25.0-b70,混合模式)

现在,我将JDK7保留为默认Java平台。如果有使JDK8工作的方法,请分享。


2
我在Eclipse中遇到一个问题,即使用m2eclipse和jdk1.8时不会生成jaxb源。在标记视图中,我看到了有关“ accessExternalSchema”的类似错误。当我在下面应用所选的解决方案,重新开始Eclipse并清理项目时,就生成了源代码!
乔纳斯·柏林

Answers:


403

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


12
同样适用于智能。
Mafro34

1
我可以在使用Maven和jaxb-plugin在Eclipse中构建Maven时也能确认该解决方案。有人可以解释一下为什么Java7不需要此属性吗?
Danny Lo

3
这对我有用,但是我必须将文件放在/path/to/jdk1.8.0/lib另一个jre目录下。
杰夫

21
这不是很便携。您将需要在每个试图构建项目的开发人员的计算机上调整本地JDK安装。
Natix

7
这对我不起作用,以下方法起作用:javax.xml.accessExternalDTD = all,我也可以在代码中进行设置,并且它可以起作用:System.setProperty(“ javax.xml.accessExternalDTD”,“ all”);
2016年

118

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

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

3
accessExternalSchema=all如果您使用org.jvnet.jaxb2.maven2:maven-jaxb2-plugin插件的更高版本(例如0.12.3),则默认情况下设置该值。
乔恩·昂斯托特

以上对我不起作用。此版本可以:<plugin> <groupId> org.codehaus.mojo </ groupId> <artifactId> jaxws-maven-plugin </ artifactId> <version> $ {version.jaxws.plugin} </ version> <configuration> < !-JAXP 1.5需要-> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </ vmArg> </ vmArgs> </ configuration> </ plugin>
Dr4gon

@JonOnstott:具有最新的2.4.1,默认情况下不起作用。不得不在答案中添加这个。
罗伯特·涅斯特罗伊

36

我在Eclipse IDE(Windows 7 x64上为4.4,Luna)中运行蚂蚁构建。与其修改已安装的JRE lib或任何ant脚本(我在其构建中有多个包含XJC的项目),不如更改Eclipse设置“外部工具配置”,并将以下内容添加到Ant构建配置的VM参数中:

-Djavax.xml.accessExternalSchema=all

2
我使用来自Apache CXF的wsdl2java.bat。因此,我只是将JVM选项插入了此BAT文件。有用。
ka3ak 2015年

1
我还可以添加,如果我们将此选项作为ant参数包含在内,那么这里提到的所有其他包含项都是多余的。但反之亦然!因此,这是最好的解决方案。+1(当然,Maven用户应在Maven选项中进行适当的更改)
Gangnus 2015年

1
当我尝试运行mvn clean install时,我遇到了类似的问题,我刚刚在上面的标志中添加了此标志,并成功部署了它。谢谢
长矛A1

30

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

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

这对我有用。我尝试使用jdk 1.8.0_65,但没有用,因此请确保您使用的是jdk 1.8.0_66或更高版本。
贾贝(Jabe)2016年

2
wsimport直接使用时,这是正确的答案。
Christopher Schultz

20

以我为例:

javax.xml.accessExternalSchema = all

到jaxp.properties无效,我必须添加:

javax.xml.accessExternalDTD = all

我的环境是linux mint 17和java 8 oracle。我将其放在此处,以解决同样问题的人们。


2
这取决于您是否要允许访问外部DTD或XML Schema(XSD)。DTD是XML Schema的前身。在某些情况下,您可能需要同时设置两者!
菲利普·海格

17

我在工件org.codehaus.mojo的2.4版本中对此进行了测试,并且效果很好〜

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

1
也许是-Djavax.xml.accessExternalSchema=all在插件声明中配置的vmArgs 。在Netbeans 错误244891中进行
kosgeinsky '16

15

这是对没有管理员权限的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"]
    }
}

12

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

1
谢谢!上述所有选项均无济于事,您的选项对我
有用

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 = Alljaxp.properties,但对我多年平均值的工作。

但是,我在下面找到了一个对我有用的解决方案:对于GlassFish Server,我需要修改domain.xmlGlassFish的path <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服务器


我在domain.xml文件中看到了<java-config classpath-suffix…>的两个实例。两者都有<jvm-options>部分。我将上面的行(带有jvm-options标记)放入了两个部分。运行Test Web Service仍然不起作用。我知道该项目正在运行,因为手动编码的客户端文件访问服务文件并在控制台中(从与服务文件关联的数据库中)打印出正确的信息。
麦克斯韦斯特

<p>我确实关闭了该项目,并且客户端项目退出了NetBeans,并等待Glassfish关闭自身(它在关闭时显示进度表)。然后,我重新启动了Netbeans,重新加载了Web Services项目,重新加载了Client文件(它只是单独的/常规Java Project文件夹中的Java类)。客户端打印出表,表明服务器和数据库服务器正在工作,以及SOAP服务Web服务和EJB。只是不起作用。accessExternalSchema设置埋藏在某个地方,并且在新的JDK中未正确设置。</ p>
Max West

7

启用对外部架构的访问

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

要在IDE中从Web服务或WSDL文件生成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>


5

这适用于jdk1.8.0_65

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

4

对于使用ANT任务的用户wsimport,以下方式是通过@CMFly建议并在文档中指定的:

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

4

现在,它已在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中所述):

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

3

我将其用于常规的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>

使用此解决方案,我需要将其更新jaxws-maven-plugin为其他答案中指定的2.5 mojohaus.org/jaxws-maven-plugin/usage.html但是,对于我而言,这是最佳答案,谢谢!
DependencyHell


2

解决的另一种解决方案:wiki.netbeans.org

从Web服务或WSDL文件生成Web服务客户端时,IDE中的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>

对不起,我别无选择。
Özgür的Akıncı

1

如果您使用的是ant,则可以将jvmarg添加到您的java调用中:

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

您能否更具体地将其放在ant文件中?
约翰L

1

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

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

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


1

我刚才想,如果你使用SoapUI (5.4.x)和使用Apache CXF工具来生成Java代码,放javax.xml.accessExternalSchema = allYOUR_JDK/jre/lib/jaxp.properties文件也适用。


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”“ $ @”


我很想尝试您的建议,但是jaxws-ri.2.2.28 / bin显然不在我的计算机上。
马克斯·韦斯特

0

另一个参考:如果您使用的是maven-jaxb2-plugin0.9.0之前的版本,则可以使用此问题中描述的解决方法,该行为会影响插件。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.