JDK8 的 WebService 客户端生成错误
-
21-12-2019 - |
题
我需要在我的项目中使用 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 服务程序时,我也在 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 = All
在 jaxp.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
. 现在已修复2.5版本(于7月/ 17日发布)。 https://github.com/mojohaus/jaxws-maven-plugin/issues/8
地址的另一个解决方案: wiki.netbeans.org
-J-Djavax.xml.accessExternalSchema=all
.
</java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
. 如果您使用的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和此问题:
创建一个名为 jaxp.properties
(如果不存在)在“JDK version/jre/lib”路径下,然后在其中添加以下行:
javax.xml.accessExternalSchema = all