JDK8의 웹 서비스 클라이언트 생성 오류


227

프로젝트에서 웹 서비스를 사용해야합니다. NetBeans를 사용하여 프로젝트를 마우스 오른쪽 단추로 클릭하고 새 "웹 서비스 클라이언트"를 추가하려고했습니다. 마지막으로 확인했을 때 이것이 웹 서비스 클라이언트를 만드는 방법이었습니다. 그러나 결과적으로 AssertionError가 발생했습니다.

java.lang.AssertionError : org.xml.sax.SAXParseException; systemId : jar : 파일 : /path/to/glassfish/modules/jaxb-osgi.jar! /com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; 줄 번호 : 52; columnNumber : 88; schema_reference : accessExternalSchema 특성에 의해 설정된 제한으로 인해 'file'액세스가 허용되지 않으므로 스키마 문서 ' xjc.xsd ' 를 읽지 못했습니다 .

NetBeans의 기본 Java 플랫폼은 JDK8 (Oracle의 공식 버전)이므로 netbeans.conf 파일을 변경하고 Oracle의 JDK7을 기본값으로 만들면 모든 것이 제대로 작동했습니다. JDK8에 문제가 있다고 생각합니다. 내 java -version출력 은 다음과 같습니다 .

Java 버전 "1.8.0"
Java (TM) SE 런타임 환경 (빌드 1.8.0-b132)
Java HotSpot ™ 64 비트 서버 VM (빌드 25.0-b70, 혼합 모드)

지금은 JDK7을 기본 Java 플랫폼으로 유지하고 있습니다. JDK8을 작동시키는 방법이 있다면 공유하십시오.


2
Eclipse에서 m2eclipse 및 jdk1.8을 사용할 때 jaxb 소스가 생성되지 않는 문제가 발생했습니다. 마커보기에서 "accessExternalSchema"에 대해 비슷한 오류가 발생했습니다. 아래에서 선택한 솔루션을 적용하고 이클립스를 다시 시작하고 프로젝트를 정리하면 소스가 생성되었습니다!
조나스 베를린

답변:


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

1
이 솔루션을 maven 및 jaxb-plugin으로 일식에서 maven 빌드로 작업하는 것으로 확인할 수도 있습니다. Java7 에이 속성이 필요없는 이유를 누군가 설명 할 수 있습니까?
Danny 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

위의 내용은 저에게 효과적이지 않았습니다. <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 (Windows 7 x64의 경우 4.4, Luna)에서 ant 빌드를 실행합니다. 설치된 JRE lib 또는 개미 스크립트를 수정하는 대신 (빌드에 XJC를 포함하는 여러 프로젝트가 있음) Eclipse 설정 "외부 도구 구성"을 변경하고 Ant 빌드 구성의 VM 인수에 다음을 추가하는 것이 좋습니다.

-Djavax.xml.accessExternalSchema=all

2
Apache CXF의 wsdl2java.bat를 사용합니다. 방금 JVM 옵션을이 BAT 파일에 삽입했습니다. 효과가있다.
ka3ak

1
또한이 옵션을 ant 매개 변수로 포함 시키면 여기에 언급 된 다른 모든 포함이 과도 할 수 있습니다. 그러나 그 반대는 아닙니다! 이것이 가장 좋은 해결책입니다. +1 (물론 Maven 사용자는 Maven 옵션을 적절히 변경해야합니다)
Gangnus

1
mvn clean install을 실행하려고 할 때 비슷한 문제가 발생했습니다. 방금 위에 위의 플래그를 추가하고 성공적으로 배포되었습니다. 감사합니다
Spear A1

30

다음은 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 이상을 사용하고 있는지 확인하십시오.
jabe

2
이것은 wsimport직접 사용할 때 정답 입니다.
Christopher Schultz

20

내 경우에는 다음을 추가하십시오.

javax.xml.accessExternalSchema = all

jaxp.properties에 작동하지 않았으므로 다음을 추가했습니다.

javax.xml.accessExternalDTD = all

내 환경은 리눅스 민트 17과 자바 8 오라클입니다. 같은 문제를 가진 사람들을위한 답으로 여기에 넣겠습니다.


2
외부 DTD 또는 XML 스키마 (XSD)에 대한 액세스를 허용할지 여부에 따라 다릅니다. DTD는 XML 스키마의 전신입니다. 둘 다 설정해야하는 경우도 있습니다!
Philip Helger

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

cxf-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

10

glassfish 4.0 웹 서버에서 웹 서비스 프로그램을 테스트하는 동안 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,하지만 나를 위해 doesnot 작동합니다.

그러나 나는 나 여기있는 작업 아래의 해결책을 발견 : 글래스 피쉬 서버를 들어, 나는 수정해야 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…> 인스턴스가 있습니다. 둘 다 <jvm-options> 섹션이 있습니다. 위의 줄을 jvm-options 태그와 함께 두 섹션에 모두 배치했습니다. 테스트 웹 서비스를 실행해도 여전히 작동하지 않습니다. 핸드 코드 클라이언트 파일이 서비스 파일에 액세스하고 서비스 파일과 연관된 데이터베이스에서 콘솔에 올바른 정보를 인쇄하기 때문에 프로젝트가 작동한다는 것을 알고 있습니다.
Max West

<p> 프로젝트를 닫았고 클라이언트 프로젝트는 NetBeans를 종료하고 Glassfish가 종료 될 때까지 기다렸습니다 (종료되는 동안 진행률 표시기가 나타남). 그런 다음 Netbeans를 다시 시작하고 웹 서비스 프로젝트를 다시로드하고 클라이언트 파일을 다시로드했습니다 (별도의 / 일반 Java 프로젝트 폴더의 Java 클래스 일뿐입니다). 클라이언트는 서버와 데이터베이스 서버 및 SOAP 서비스 웹 서비스 및 EJB가 작동 중임을 나타내는 테이블을 인쇄합니다. 작동하지 않습니다. accessExternalSchema 설정이 어딘가에 묻혀 있고 새 JDK에서 제대로 설정되지 않았습니다. </ p>
Max West

7

외부 스키마에 대한 액세스 활성화

웹 서비스의 WSDL 파일을 구문 분석하려면 IDE 및 GlassFish 서버가 외부 스키마에 액세스 할 수 있도록해야합니다. 액세스하려면 IDE 및 GlassFish 서버의 구성 파일을 수정해야합니다. 자세한 내용은 FAQ 외부 스키마로 WSDL 구문 분석을 활성화하는 방법은 무엇입니까?를 참조하십시오. IDE 구성

웹 서비스 또는 WSDL 파일에서 IDE에 웹 서비스 클라이언트를 생성하려면 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=all경우 Maven Build Tools Runner 구성을 위한 JVM 옵션에서 Maven 설정에 추가 할 수 있습니다


Linux Mint 17.3, JDK 1.8.0.74 및 Intellij IDEA 15에서 작동합니다. Thx.
stuchl4n3k

좋아요! 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의 웹 서비스 클라이언트 마법사는 웹 서비스 또는 WSDL 파일에서 웹 서비스 클라이언트를 생성 할 때 WSDL 파일을 구문 분석합니다. netbeans_default_options에 다음 스위치를 추가하려면 IDE 구성 파일 (netbeans.conf)을 수정해야합니다. 변경 사항을 적용하려면 IDE를 다시 시작해야합니다.

-J-Djavax.xml.accessExternalSchema=all

GlassFish에 배포 할 때는 웹 서비스에 대한 테스트 클라이언트를 생성하기 위해 외부 스키마에 액세스 할 수 있어야합니다. 액세스하려면 GlassFish 서버의 구성 파일 (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml)을 수정하고 다음 JVM 옵션 요소를 추가해야합니다. 변경 사항을 적용하려면 서버를 다시 시작해야합니다.

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

죄송합니다. 다른 생각은 할 수 없습니다.
Özgür Akıncı

1

Ant를 사용하는 경우 Java 호출에 jvmarg를 추가 할 수 있습니다.

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

이것을 개미 파일에 넣는 위치를 더 구체적으로 지정할 수 있습니까?
John L

1

매우 간단한 휴대용 솔루션은 코드의 중요한 부분에 다음 코드 줄을 배치하는 것입니다.

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

이것은 까다로운 maven pom.xml 변경을 수행하지 않고도 프로그래밍 방식으로 필요한 시스템 속성을 설정합니다 (어떤 이유로 나를 위해 작동하지 않았습니다).


1

난 그냥 당신이 사용하는 경우 것을 시도 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.