JDK8的WebService客户端生成错误

Posted

技术标签:

【中文标题】JDK8的WebService客户端生成错误【英文标题】:WebService Client Generation Error with JDK8 【发布时间】:2014-05-25 13:08:18 【问题描述】:

我需要在我的项目中使用 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 运行时环境(内部版本 1.8.0-b132) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.0-b70,混合模式)

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

【问题讨论】:

我在Eclipse中遇到一个问题,使用m2eclipse和jdk1.8时没有生成jaxb源。在标记视图中,我看到了关于“accessExternalSchema”的类似错误。当我应用下面选择的解决方案,重新启动 eclipse 并清理项目时,源代码就生成了! 【参考方案1】:

好吧,我找到了解决方案。 (基于http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA)

/path/to/jdk1.8.0/jre/lib下创建一个名为jaxp.properties(如果不存在)的文件,然后在里面写下这一行:

javax.xml.accessExternalSchema = all

就是这样。享受 JDK 8。

【讨论】:

也适用于 intelliJ。 我可以确认这个解决方案也适用于使用 maven 和 jaxb-plugin 在 eclipse 中构建的 maven。有人能解释一下为什么 Java7 不需要这个属性吗? 这对我有用,但我必须将文件放在/path/to/jdk1.8.0/lib 下,而不是在更远的jre 目录下。 这不是很便携。您需要在每个尝试构建项目的开发人员的机器上调整本地 JDK 安装。 这对我不起作用,以下工作:javax.xml.accessExternalDTD = all,我也可以在代码中设置它并且它有效:System.setProperty("javax.xml.accessExternalDTD", “全部”);【参考方案2】:

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

我在jaxp.properties 中添加了javax.xml.accessExternalSchema = All,但对我不起作用。

但是,我在下面找到了一个适合我的解决方案: 对于 GlassFish Server,我需要修改 GlassFish 的domain.xml, 路径 :<path>/glassfish/domains/domain1domain2/config/domain.xml) 并在 <java-config> 标签下添加 <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>

....

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

【讨论】:

我在 domain.xml 文件中看到 的两个实例。两者都有 部分。我将上面的行(带有 jvm-options 标签)放在两个部分中。运行测试 Web 服务仍然不起作用。我知道该项目正在运行,因为手动编码的客户端文件访问服务文件并在控制台中打印出正确的信息(来自与服务文件关联的数据库)。

我确实关闭了项目和客户端项目,退出了 NetBeans 并等待 Glassfish 自行关闭(它在关闭时显示进度表)。然后,我重新启动了 Netbeans,重新加载了 Web 服务项目,重新加载了客户端文件(它只是一个单独的/常规 Java 项目文件夹中的 Java 类)。客户端打印出表格,显示服务器和数据库服务器以及 SOAP 服务 Web 服务和 EJB 正在工作。它只是不工作。 accessExternalSchema 设置被隐藏在某个地方,并且在新的 JDK 中没有正确设置。

【参考方案3】:

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

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

【讨论】:

你能更具体地说明你把它放在 ant 文件中的什么地方吗?【参考方案4】:

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

-Djavax.xml.accessExternalSchema=all

【讨论】:

我使用来自 Apache CXF 的 wsdl2java.bat。所以我只是将 JVM 选项插入到这个 BAT 文件中。它有效。 我还可以补充一点,如果我们将这个选项作为 ant 参数包含在内,那么这里提到的所有其他包含都是多余的。但反之则不然!所以这是最好的解决方案。 +1(当然,Maven 用户应该对 Maven 选项进行适当的更改) 我在尝试运行 mvn clean install 时遇到了类似的问题,我只是在上面添加了这个标志,它已成功部署。谢谢【参考方案5】:

另一种解决办法:wiki.netbeans.org

IDE 中的 Web 服务客户端向导在从 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>

【讨论】:

对不起,我想不出别的了。【参考方案6】:

另一种选择是通过添加以下内容来更新 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 不在我的机器上。【参考方案7】:

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

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

【讨论】:

如果您使用 org.jvnet.jaxb2.maven2:maven-jaxb2-plugin 插件的更高版本(如 0.12.3),则默认设置 accessExternalSchema=all 值。 以上对我不起作用。这个版本做了: org.codehaus.mojojaxws-maven-plugin$version.jaxws.plugin-Djavax.xml.accessExternalSchema=all @JonOnstott:拥有最新的 2.4.1,默认情况下无法正常工作。不得不在答案中添加这个。【参考方案8】:

另一个参考: 如果您使用的是 0.9.0 之前的maven-jaxb2-plugin,则可以使用on this issue 中描述的解决方法,其中此行为会影响插件。

【讨论】:

【参考方案9】:

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

Getting Started with JAX-WS Web Services -> Enabling Access to External Schema

【讨论】:

【参考方案10】:

我将它与常规 ma​​ven 项目一起使用,并通过运行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>

【讨论】:

使用此解决方案,我需要按照其他答案mojohaus.org/jaxws-maven-plugin/usage.html 中的说明将jaxws-maven-plugin 更新为2.5 但是,就我而言,最佳答案,谢谢!跨度> 【参考方案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>

【讨论】:

谢谢!以上所有选项都无济于事,您的选项对我有用【参考方案12】:

以下适用于 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 或更高版本。 这是直接使用wsimport时的正确答案。【参考方案13】:

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

【讨论】:

适用于 Linux Mint 17.3、JDK 1.8.0.74 和 Intellij IDEA 15。谢谢。 不错!当我独立于 IDE 直接在终端上使用“mvn clean install -Djavax.xml.accessExternalSchema=all”时,它也适用于我【参考方案14】:

在我的情况下添加:

javax.xml.accessExternalSchema = all

到 jaxp.properties 不起作用,我要补充:

javax.xml.accessExternalDTD = all

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

【讨论】:

这取决于您是要允许访问外部 DTD 还是允许访问 XML Schema (XSD)。 DTD 是 XML Schema 的前身。可能还有需要同时设置的情况!【参考方案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>

【讨论】:

可能是插件声明中配置的 vmArgs -Djavax.xml.accessExternalSchema=all。在 Netbeans 中讨论过 Bug 244891【参考方案16】:

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

【讨论】:

【参考方案17】:

这适用于 jdk1.8.0_65

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

【讨论】:

【参考方案18】:

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

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

【讨论】:

【参考方案19】:

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

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

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

【讨论】:

【参考方案20】:

现在已在 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>

【讨论】:

【参考方案21】:

启用对外部架构的访问

您需要启用 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>

【讨论】:

【参考方案22】:

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

【讨论】:

【参考方案23】:

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

javax.xml.accessExternalSchema = all

【讨论】:

MacOS:在/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib下创建文件jaxp.properties

以上是关于JDK8的WebService客户端生成错误的主要内容,如果未能解决你的问题,请参考以下文章

在idea中,怎么生成cxf webservice的客户端代码

c++如何发布webservice

C#编写用户自定义控件时,引用web的webservice,提示错误

web service接口 wsdl和asmx有啥区别

java之wsdl自动生成WebService客户端

eclipse根据.wsdl文件自动生成webservice的调用客户端