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

java.lang.断言错误:org.xml.sax.SAXParseException;系统ID:jar:文件:/path/to/glassfish/modules/jaxb-osgi.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd;电话号码:52;栏目编号:88;架构参考:无法读取架构文档'xjc.xsd',因为由于设置的限制而不允许“文件”访问 访问外部模式 财产。

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 工作请分享。

有帮助吗?

解决方案

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

其他提示

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

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

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

-Djavax.xml.accessExternalSchema=all
.

wsimport 2.2.9包含在JDK 1.8.0_66:

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

在我的情况下添加:

javax.xml.accessExternalSchema = all
.

到JAXP.Properties没有工作,我要添加:

javax.xml.accessExternalDTD = all
.

我的环境是Linux薄荷17和Java 8 Oracle。 我会把它放在那里,作为具有同样问题的人的答案。

我测试了这一点是神器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>
.

此处是没有管理权限的DEVERLE用户的提示提示:将此行添加到您的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"]
    }
}
.

如果使用 cxf-codegen-plugin ,然后您可以通过配置插件来解决方案来解决,并提供附加的“-djavax.xml.accessExternalSchema=所有”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>
.

在 glassfish 4.0 Web 服务器上测试 Web 服务程序时,我也在 E​​clipse 中遇到类似类型的错误: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.xml 玻璃鱼,路径:<path>/glassfish/domains/domain1 或者 domain2/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 服务器

当使用Intellij IDE使用Maven时,您可以在 Maven Build Tools Runner配置

启用外部架构

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

要从Web服务或WSDL文件生成Web服务客户端,您需要修改IDE配置文件(NetBeans.conf)以将以下切换添加到NetBeans_default_Options。

-J-Djavax.xml.accessExternalSchema=all
.

有关定位和修改NetBeans.conf配置文件的更多信息,请参阅NetBeans Conf FAQ。 配置GlassFish服务器

如果您部署到GlassFish服务器,则需要修改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>
.

对于使用Ant任务生成的人,一种通过@cmfly建议的选项的方式,并在文档是以下内容:

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

我用常规 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>
.

这适用于jdk1.8.0_65

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

如果您使用的ant,则可以将JVMarg添加到Java呼叫:

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

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

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

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

我刚刚尝试过,如果使用SoapUI (5.4.x)并使用Apache CXF工具生成java代码,请将生成的javax.xml.accessExternalSchema = all放在YOUR_JDK/jre/lib/jaxp.properties文件中也有效。

另一个替代方法是通过添加以下内容更新WSImport.sh shell脚本:

wsimport.sh位于此目录中:

JAXWS-RI.2.28 / BIN

exec“$ java”$ wsimport_opts -djavax.xml.accessExternalSchema= All -Jar“$ JAXWS_HOME / lib / jaxws-tools.jar”$ @“

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

netbeans更新其教程的JDK8和此问题:

使用JAX-WS Web服务入门 - >启用对外部的访问架构

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

javax.xml.accessExternalSchema = all
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top