JDK8でのWebServiceクライアント生成エラー


227

プロジェクトで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; lineNumber:52; columnNumber:88; schema_reference:スキーマドキュメント ' xjc.xsd 'の読み取りに失敗しました。accessExternalSchemaプロパティで設定された制限のため、 'file'アクセスが許可されていません。

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、混合モード)

今のところ、デフォルトのJavaプラットフォームとしてJDK7を使用しています。JDK8を動作させる方法がある場合は、共有してください。


2
Eclipseで、m2eclipseおよびjdk1.8を使用するとjaxbソースが生成されないという問題が発生しました。マーカービューで、「accessExternalSchema」に関する同様のエラーを確認しました。以下の選択したソリューションを適用し、Eclipseを再起動してプロジェクトをクリーンアップすると、ソースが生成されました!
ジョナスベルリン

回答:


403

さて、私は解決策を見つけました。(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をお楽しみください。


12
intelliJでも動作します。
Mafro34、2015

1
私はこの解決策を、Mavenとjaxb-pluginを使用したEclipseのMavenビルドで機能することとしても確認できます。Java7でこのプロパティが必要ない理由を誰かが説明できますか?
ダニーLo

3
これは私にとってはうまくいきましたが、私はファイルを/path/to/jdk1.8.0/libそれ以上のjreディレクトリの下に置かなければなりませんでした。
Geoff

21
これはあまり移植性がありません。プロジェクトをビルドしようとするすべての開発者のマシンで、ローカルJDKインストールを微調整する必要があります。
Natix

7
これは私のために機能していません、次のように機能しました:javax.xml.accessExternalDTD = all、これもコードで設定でき、機能します:System.setProperty( "javax.xml.accessExternalDTD"、 "all");
qartal

118

実際の答えではなく、参考として。

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>

3
プラグインのaccessExternalSchema=all新しいバージョン(0.12.3など)を使用する場合、この値はデフォルトで設定されますorg.jvnet.jaxb2.maven2:maven-jaxb2-plugin
Jon Onstott、2015年

上記ではうまくいきませんでした。このバージョンは次のとおりでした:<plugin> <groupId> org.codehaus.mojo </ groupId> <artifactId> jaxws-maven-plugin </ artifactId> <version> $ {version.jaxws.plugin} </ version> <configuration> < !-JAXP 1.5で必要-> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </ vmArg> </ vmArgs> </ configuration> </ plugin>
Dr4gon

@JonOnstott:最新の2.4.1があり、デフォルトでは機能しません。答えのようにこれを追加する必要がありました。
Robert Niestroj

36

私はEclipse IDE内でantビルドを実行しています(4.4、Luna、Windows 7 x64)。インストール済みのJRE libやantスクリプトを変更するのではなく(ビルドにXJCを含む複数のプロジェクトがあります)、Eclipse設定の「外部ツール構成」を変更して、Antビルド構成のVM引数に以下を追加します。

-Djavax.xml.accessExternalSchema=all

2
Apache CXFのwsdl2java.batを使用しています。そのため、このBATファイルにJVMオプションを挿入しました。できます。
ka3ak 2015年

1
このオプションをantパラメータとして含めると、ここで説明する他のすべてのインクルードが過剰になるので、追加することもできます。しかし、その逆ではありません!したがって、これが最良のソリューションです。+1(もちろん、MavenユーザーはMavenオプションを適切に変更する必要があります)
Gangnus

1
mvn clean installを実行しようとしたときに同様の問題がありましたが、上記のフラグを追加しただけで正常にデプロイされました。ありがとう
スピアA1

30

以下は、jdk 1.8.0_66に含まれているwsimport 2.2.9で動作します。

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

これは私にとってはうまくいきます。jdk 1.8.0_65で試しましたが、うまくいきませんでした。jdk1.8.0_66以降を使用していることを確認してください。
jabe

2
これはwsimport直接使用する場合の正解です。
クリストファーシュルツ

20

私の場合、追加:

javax.xml.accessExternalSchema = all

jaxp.propertiesが機能しなかったので、追加しました:

javax.xml.accessExternalDTD = all

私の環境はlinux mint 17とjava 8 oracleです。同じ問題を抱えている人々のための答えとしてそこに置きます。


2
外部DTDまたはXMLスキーマ(XSD)へのアクセスを許可するかどうかによって異なります。DTDはXMLスキーマの前身です。両方を設定する必要がある場合もあります!
フィリップヘルガー2017

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>

1
-Djavax.xml.accessExternalSchema=allプラグイン宣言で設定されているのは、おそらくvmArgs です。これは、Netbeans Bug 244891
kosgeinsky

15

管理者権限のない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"]
    }
}

12

csf -codegen-pluginでwsdlをjaveに変換するときにこの問題が発生する場合は、プラグインをフォークするように構成し、追加の "-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>

1
ありがとう!上記のすべてのオプションは役に立たず、あなたのオプションが私のために働いています
ludenus '11 / 11/24

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 = Allしましたがjaxp.properties、機能しません。

しかし、私は以下の解決策を見つけました:GlassFishサーバーの場合、GlassFishのを変更する必要があり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サーバーを再起動します


domain.xmlファイルに<java-config classpath-suffix…>の2つのインスタンスが表示されます。どちらにも<jvm-options>のセクションがあります。上記の行(jvm-optionsタグを含む)を両方のセクションに配置しました。テストWebサービスを実行しても機能しません。ハンドコードされたクライアントファイルがサービスファイルにアクセスし、(サービスファイルに関連付けられたデータベースから)コンソールに正しい情報を出力するため、プロジェクトが機能していることがわかります。
Max West

<p>私はプロジェクトを閉じ、クライアントプロジェクトはNetBeansを終了し、Glassfishがシャットダウンするのを待っていました(シャットダウン中に進捗メーターが表示されます)。次に、Netbeansを再起動し、Webサービスプロジェクトをリロードし、クライアントファイルをリロードしました(これは、別個の/通常のJavaプロジェクトフォルダ内の単なるJavaクラスです)。クライアントは、サーバーとデータベースサーバーが機能していることを示すテーブルと、SOAPサービスのWebサービスとEJBを出力します。機能していないだけです。accessExternalSchema設定はどこかに埋め込まれており、新しいJDKで正しく設定されていません。</ p>
Max West

7

外部スキーマへのアクセスを有効にする

IDEとGlassFishサーバーが外部スキーマにアクセスしてWebサービスのWSDLファイルを解析できるようにする必要があります。アクセスを有効にするには、IDEとGlassFishサーバーの構成ファイルを変更する必要があります。詳細については、FAQの外部スキーマでWSDLの解析を有効にする方法を参照してください。IDEの構成

IDEでWebサービスまたはWSDLファイルから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>

6

IntelliJ IDEでMavenを使用する場合-Djavax.xml.accessExternalSchema=allMavenビルドツールランナー構成の JVMオプションでMaven設定に追加できます


Linux Mint 17.3、JDK 1.8.0.74、Intellij IDEA 15で動作します。Thx。
stuchl4n3k 2016年

いいね!IDEとは無関係に、ターミナルで直接「mvn clean install -Djavax.xml.accessExternalSchema = all」を使用する場合にも機能します
Tanorix

5

これはjdk1.8.0_65で動作します

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

4

ANTタスクを使用してwsimportいる場合、@ CMFlyによって提案され、ドキュメントで指定されているオプションを渡す方法は次のとおりです。

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

4

現在、2.5バージョンで修正されています(jul / 17でリリース)。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>

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>

この解決策ではjaxws-maven-plugin、他の回答で指定されているように2.5 に更新する必要がありましたmojohaus.org/jaxws-maven-plugin/usage.htmlしかし、それでも、私の場合は最善の回答をありがとうございます!
DependencyHell

3

jaxp.properties「JDK version / jre / lib」へのパスの下に(存在しない場合は)という名前のファイルを作成し、次の行を追加します。

javax.xml.accessExternalSchema = all

2

対処する別のソリューション:wiki.netbeans.org

IDEのWebサービスクライアントウィザードは、WebサービスまたはWSDLファイルからWebサービスクライアントを生成するときに、WSDLファイルを解析します。IDE構成ファイル(netbeans.conf)を変更して、次のスイッチをnetbeans_default_optionsに追加する必要があります。変更を有効にするには、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>

すみません、他に何も考えられません。
–ÖzgürAkıncı2015

1

antを使用している場合は、jvmargをJava呼び出しに追加できます。

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

これをantファイルに配置する場所をより具体的にできますか?
John L

1

非常に単純なポータブルソリューションは、次のコード行をコードの重要な部分のどこかに配置し、その一部が確実に実行される(たとえば、メインメソッドの右側)ことです。

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

これにより、必要なシステムプロパティがプログラムで設定されます。複雑なmaven pom.xmlを変更する必要はありません(これは、何らかの理由で機能しませんでした)。


1

私はあなたがJavaコードを生成するSoapUI (5.4.x)ためのApache CXFツールを使用して使用する場合javax.xml.accessExternalSchema = allYOUR_JDK/jre/lib/jaxp.propertiesファイルに入れることも機能することを試しました。


0

別の方法は、以下を追加してwsimport.shシェルスクリプトを更新することです。

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は私のマシンのどこにもありません。
Max West


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.