239

我需要在我的项目中使用 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;行号:52;列号:88;schema_reference:无法读取架构文档“ xjc.xsd ”,因为accessExternalSchema属性设置的限制不允许“文件”访问。

NetBeans 的默认 Java 平台是 JDK8(Oracle 的官方版本),所以当我更改我的 netbeans.conf 文件并将 JDK7(也来自 Oracle)作为我的默认值时,一切正常。所以我认为问题出在JDK8上。这是我的java -version输出:

java 版本“1.8.0”
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, 混合模式)

目前,我将 JDK7 作为我的默认 Java 平台。如果有办法让 JDK8 工作,请分享。

4

23 回答 23

421

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

于 2014-04-11T12:36:27.713 回答
122

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

如果您使用的是 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>
于 2015-03-17T11:20:01.733 回答
39

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

-Djavax.xml.accessExternalSchema=all
于 2014-07-15T02:43:53.117 回答
35

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

wsimport -J-Djavax.xml.accessExternalSchema=all ....
于 2015-12-22T22:31:56.583 回答
25

在我的情况下添加:

javax.xml.accessExternalSchema = all

对 jaxp.properties 不起作用,我必须添加:

javax.xml.accessExternalDTD = all

我的环境是 linux mint 17 和 java 8 oracle。我会把它放在那里,作为有同样问题的人的答案。

于 2016-01-28T19:14:42.223 回答
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>
于 2016-02-27T16:51:24.873 回答
16

这里是对没有管理员权限的 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"]
    }
}
于 2016-04-07T13:29:44.767 回答
13

如果您在使用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>
于 2015-11-20T19:32:14.150 回答
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>/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 服务器

于 2014-06-21T17:37:56.353 回答
9

启用对外部架构的访问

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

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

-J-Djavax.xml.accessExternalSchema=all

有关查找和修改 netbeans.conf 配置文件的更多信息,请参阅 Netbeans Conf 常见问题解答。配置 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>
于 2017-10-10T18:37:18.210 回答
7

在“JDK version/jre/lib”的路径下创建一个名为jaxp.properties(如果不存在)的文件,然后在其中添加以下行。

javax.xml.accessExternalSchema = all
于 2019-11-04T08:48:01.763 回答
6

将 Maven 与 IntelliJ IDE 一起使用时,您可以-Djavax.xml.accessExternalSchema=all在 JVM Options for Maven Build Tools Runner 配置下添加到 Maven 设置

于 2016-01-15T20:42:03.667 回答
6

This works on jdk1.8.0_65

wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
于 2016-11-25T08:10:58.840 回答
4

对于那些使用 ANT taskwsimport的人,@CMFly 建议并在文档中指定的传递选项的方法如下:

<wsimport
   <!-- ... -->
   fork="true"
  >
  <jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
于 2016-12-09T14:00:40.083 回答
4

它现在已在 2.5 版本中修复(于 17 年 7 月发布)。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>
于 2017-07-21T17:45:33.620 回答
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>
于 2015-07-16T15:30:31.080 回答
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>
于 2014-07-23T14:45:25.770 回答
2

我刚刚尝试过,如果您使用SoapUI (5.4.x)并使用Apache CXF工具生成 java 代码,则放入javax.xml.accessExternalSchema = all文件YOUR_JDK/jre/lib/jaxp.properties也可以。

于 2019-04-19T18:49:07.660 回答
1

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

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
于 2014-06-27T20:17:25.163 回答
1

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

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

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

于 2017-07-07T19:25:11.917 回答
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" "$@"

于 2014-11-11T23:52:36.587 回答
0

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

于 2015-06-25T14:22:39.167 回答
0

NetBeans 更新了他们的 JDK8 教程和这个问题:

JAX-WS Web 服务入门 -> 启用对外部模式的访问

于 2015-07-15T17:43:23.443 回答