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

java.lang.AssertionError: org.xml.sax.SAXParseException;systemId: jar文件:/道路/ / glassfish /模块/ jaxb-osgi.jar ! / com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd;lineNumber: 52个;columnNumber: 88;schema_reference:读取架构文档'xjc失败。由于accessExternalSchema属性设置的限制,不允许访问“文件”。

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

Java版本“1.8.0” Java(TM) SE运行时环境(build 1.8.0-b132) Java HotSpot(TM) 64位服务器虚拟机(build 25.0-b70,混合模式)

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


当前回答

我在2.4版的artifact 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>

其他回答

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

启用对外部模式的访问

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

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

-J-Djavax.xml.accessExternalSchema=all

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

如果您部署到GlassFish服务器,您需要修改GlassFish服务器的配置文件(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>

另一个解决方案:wiki.netbeans.org

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

-J-Djavax.xml.accessExternalSchema=all

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

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

一个非常简单的可移植的解决方案是,将下面这行代码放在你的代码的关键部分,其中一部分你肯定会运行(例如在main方法中):

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

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

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

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