JDK8 ile WebService İstemcisi Oluşturma Hatası


227

Projemde bir web hizmeti kullanmam gerekiyor. NetBeans kullanıyorum, bu yüzden projeme sağ tıkladım ve yeni bir "Web Service Client" eklemeye çalıştım. En son kontrol ettiğimde, bu bir web hizmeti istemcisi oluşturmanın yoluydu. Ancak bir AssertionError hatasıyla sonuçlandı:

java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: jar: dosya: /path/to/glassfish/modules/jaxb-osgi.jar! /com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: accessExternalSchema özelliği tarafından ayarlanan kısıtlama nedeniyle 'dosya' erişimine izin verilmediğinden, ' xjc.xsd ' şema belgesi okunamadı .

NetBeans için varsayılan Java platformu JDK8 (Oracle'ın resmi sürümü) idi, bu yüzden netbeans.conf dosyamı değiştirip varsayılan olarak JDK7'yi (Oracle'dan da) yaptığımda her şey yolunda gitti. Bence problem JDK8 ile ilgili. İşte benimjava -version çıktı:

Java sürümü "1.8.0"
Java (TM) SE Çalışma Zamanı Ortamı (derleme 1.8.0-b132)
Java HotSpot (TM) 64 Bit Sunucu VM (derleme 25.0-b70, karışık mod)

Şimdilik JDK7'yi varsayılan Java platformum olarak tutuyorum. JDK8'in çalışmasını sağlamanın bir yolu varsa lütfen paylaşın.


2
Eclipse'de m2eclipse ve jdk1.8 kullanılırken jaxb kaynaklarının üretilmemesi sorunu yaşadım. İşaretler görünümünde "accessExternalSchema" hakkında benzer bir hata gördüm. Aşağıda seçilen çözümü uyguladığımda, tutulmayı yeniden başlattığımda ve projeyi temizlediğimde, kaynaklar üretildi!
Jonas Berlin

Yanıtlar:


404

Çözümü buldum. ( http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA tabanlı )

jaxp.propertiesAltında (yoksa) adlı bir dosya oluşturun /path/to/jdk1.8.0/jre/libve bu satırı içine yazın:

javax.xml.accessExternalSchema = all

Bu kadar. JDK 8'in tadını çıkarın.


12
IntelliJ için de çalışır.
Mafro34

1
Bu çözümü, maven ve jaxb-eklentisi ile tutulmada maven yapısında çalışmak için de onaylayabilirim. Birisi Java7 için neden bu özelliğe ihtiyacınız olmadığını açıklayabilir mi?
Danny Lo

3
Bu benim için çalıştı, ama dosyayı /path/to/jdk1.8.0/libdaha sonraki jredizinin altına koymak zorunda kaldı .
Geoff

21
Bu çok taşınabilir değil. Projeyi oluşturmaya çalışan her geliştiricinin bir makinesinde yerel bir JDK yüklemesi ayarlamanız gerekir.
Natix

7
Bu benim için çalışmıyor, aşağıdaki çalıştı: javax.xml.accessExternalDTD = all, Ayrıca bu kodu ayarlayabilir ve çalışır: System.setProperty ("javax.xml.accessExternalDTD", "all");
qartal

118

Gerçek bir cevap değil, daha çok referans olarak.

Jaxws Maven eklentisini kullanıyorsanız ve aynı hata iletisini alıyorsanız, belirtilen özelliği eklenti yapılandırmasına ekleyin:

...
<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=allEğer (0.12.3) gibi daha sonraki sürümlerini kullanıyorsanız değer varsayılan olarak ayarlanır org.jvnet.jaxb2.maven2:maven-jaxb2-plugineklenti.
Jon Onstott

Yukarıdakiler benim için işe yaramadı. Bu sürüm yaptı: <plugin> <groupId> org.codehaus.mojo </groupId> <artifactId> jaxws-maven-plugin </artifactId> <version> $ {version.jaxws.plugin} </version> <configuration> < ! - JAXP 1.5 için gerekli -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = hepsi </vmArg> </vmArgs> </configuration> </plugin>
Dr4gon

@JonOnstott: en son 2.4.1 sürümüne sahip ve varsayılan olarak çalışmıyor. Bu cevabı cevabı gibi eklemek zorunda kaldı.
Robert Niestroj

36

Eclipse IDE içinde karınca yapıları çalıştırıyorum (4.4, Luna, Windows 7 x64'te). Yüklü JRE lib'i veya herhangi bir karınca komut dosyasını (yapılarında XJC içeren birden fazla projem var) değiştirmek yerine, Eclipse Settings "External Tools Configurations" ı değiştirmeyi ve Ant build yapılandırması için VM argümanlarına aşağıdakileri eklemeyi tercih ederim:

-Djavax.xml.accessExternalSchema=all

2
Apache CXF'den wsdl2java.bat kullanıyorum. Bu yüzden JVM seçeneğini bu BAT dosyasına ekledim. İşe yarıyor.
ka3ak

1
Ayrıca, bu seçeneği karınca parametresi olarak eklesek, burada bahsedilen diğer tüm içeriklerin aşırı olduğunu ekleyebilirim. Ama tam tersi değil! Yani bu en iyi çözüm. +1 (tabii ki Maven kullanıcıları Maven seçeneklerinde uygun değişikliği yapmalıdır)
Gangnus

1
Ben mvn clean install çalıştırmaya çalışırken benzer bir sorun vardı, ben sadece yukarıdaki bayrağı ekledi ve başarıyla konuşlandırıldı. Teşekkürler
Mızrak A1

30

Jdk 1.8.0_66'da bulunan wsimport 2.2.9 için aşağıdaki işler:

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

Bu benim için çalışıyor. JDK 1.8.0_65 ile denedim ve bu işe yaramadı, bu yüzden jdk 1.8.0_66 veya üstünü kullandığınızdan emin olun.
jabe

2
wsimportDoğrudan kullanırken doğru cevap budur .
Christopher Schultz

20

Benim durumumda:

javax.xml.accessExternalSchema = all

jaxp.properties işe yaramadı, eklemeliyim:

javax.xml.accessExternalDTD = all

Çevrem linux nane 17 ve java 8 oracle. Buraya aynı problemi olan insanlar için bir cevap olarak koyacağım.


2
Harici DTD'ye veya XML Şemasına (XSD) erişime izin vermek isteyip istemediğinize bağlıdır. DTD, XML Şemasının selefidir. Her ikisini de ayarlamanız gereken durumlar da olabilir!
Philip Helger

17

Bunu artifact org.codehaus.mojo 2.4 sürümü için test ettim ve işe yaradı ~

<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
Belki de -Djavax.xml.accessExternalSchema=alleklenti bildiriminizde yapılandırılan vmArgs'dir . Netbeans Bug 244891
kosgeinsky

15

Yönetici haklarına sahip olmayan kullanıcılar için bir ipucu: bu satırı jaxb-task'ınıza ekleyin:

System.setProperty('javax.xml.accessExternalSchema', 'all')

Bunun gibi görünecek:

jaxb {
    System.setProperty('javax.xml.accessExternalSchema', 'all')
    xsdDir = "${project.name}/xsd"
    xjc {
        taskClassname = "com.sun.tools.xjc.XJCTask"
        args = ["-npa", "-no-header"]
    }
}

12

Eğer wsdl'yi cxf - codegen -eklentisi ile jave'ye dönüştürürken bu sorunu alıyorsanız, eklentiyi fork'a yapılandırarak ve ek "-Djavax.xml.accessExternalSchema = all" JVM seçeneğini sağlayarak çözebilirsiniz.

        <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
Teşekkürler! yukarıdaki tüm seçenekler yardımcı olmuyor ve seninki benim için çalışıyor
Ludenus

10

Ayrıca glassfish 4.0 web sunucusunda bir webservice programı test sırasında Eclipse hata benzer tür alıyordu: 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.

Eklediğim javax.xml.accessExternalSchema = Alliçinde jaxp.properties, ama benim için doesnot çalışması.

Ancak burada aşağıda benim için çalışan bir çözüm buldum: GlassFish Server domain.xmliçin GlassFish, path: <path>/glassfish/domains/domain1or domain2/config/domain.xml) 'i değiştirmem ve etiketin <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>altına eklemem gerekiyor<java-config>

....

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> ... ve sonra GlassFish sunucusunu yeniden başlatın


Domain.xml dosyasında iki <java-config classpath-suffix…> örneği görüyorum. Her ikisinde de <jvm-options> bölümleri vardır. Yukarıdaki satırı (jvm-options etiketleriyle) her iki bölüme de yerleştirdim. Test Web Hizmetini çalıştırmak için hala çalışmaz. Handcoded istemci dosyası hizmet dosyalarına erişir ve konsolda (hizmet dosyaları ile ilişkili veritabanından) doğru bilgileri yazdırır çünkü proje çalışıyor biliyorum.
Max West

<p> Projeyi kapattım ve müşteri projesi NetBeans'ten çıktı ve Glassfish'in kendini kapatmasını bekledi (kapanırken bir ilerleme ölçer gösteriyor). Sonra, Netbeans'i yeniden başlattım, Web Hizmetleri projesini yeniden yükledim, İstemci dosyasını yeniden yükledim (ayrı / normal bir Java Project klasöründe sadece bir Java sınıfı). İstemci, sunucu ve veritabanı sunucusunun çalıştığını gösteren tabloları ve SOAP hizmeti Web Hizmetleri ve EJB'leri yazdırır. Sadece çalışmıyor. AccessExternalSchema ayarı bir yere gömüldü ve yeni JDK'da düzgün ayarlanmıyor. </p>
Max West

7

Harici Şemaya Erişimi Etkinleştirme

Web hizmetinin WSDL dosyasını ayrıştırmak için IDE ve GlassFish Sunucusunun harici şemaya erişmesini etkinleştirmeniz gerekir. Erişimi etkinleştirmek için IDE ve GlassFish Sunucusu'nun yapılandırma dosyalarını değiştirmeniz gerekir. Daha fazla ayrıntı için, bkz. SSS WSDL'yi harici bir şema ile ayrıştırma nasıl etkinleştirilir? IDE'yi yapılandırma

Bir web hizmeti veya WSDL dosyasından IDE'de bir web hizmeti istemcisi oluşturmak için, netbeans_default_options öğesine aşağıdaki anahtarı eklemek üzere IDE yapılandırma dosyasını (netbeans.conf) değiştirmeniz gerekir.

-J-Djavax.xml.accessExternalSchema=all

Netbeans.conf yapılandırma dosyasını bulma ve değiştirme hakkında daha fazla bilgi için, bkz. Netbeans Conf SSS. GlassFish Sunucusunu Yapılandırma

GlassFish Sunucusuna dağıtıyorsanız, sunucunun wsdl dosyasını ayrıştırmak ve sınama istemcisini oluşturmak için harici şemalara erişmesini sağlamak için GlassFish Sunucusu'nun (domain.xml) yapılandırma dosyasını değiştirmeniz gerekir. Harici şemalara erişimi etkinleştirmek için GlassFish yapılandırma dosyasını (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) açın ve aşağıdaki JVM seçenek öğesini (kalın olarak) ekleyin. Değişikliğin etkili olması için sunucuyu yeniden başlatmanız gerekir.

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

6

Maven'i IntelliJ IDE ile kullanırken Maven Derleme Araçları Runner yapılandırması-Djavax.xml.accessExternalSchema=all için JVM Seçenekleri altında Maven ayarına ekleyebilirsiniz .


Linux Mint 17.3, JDK 1.8.0.74 ve Intellij IDEA 15. Thx ile çalışır.
stuchl4n3k

Güzel ! IDE'den bağımsız olarak doğrudan terminalde "mvn clean install -Djavax.xml.accessExternalSchema = all" kullandığımda da işe yarıyor
Tanorix

5

Bu jdk1.8.0_65 üzerinde çalışır

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

4

ANT görevini kullananlar için wsimport, @CMFly tarafından önerilen ve belgelerde belirtilen seçeneği geçirmenin bir yolu şudur:

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

4

Şimdi 2.5 sürümünde düzeltildi (jul / 17'de piyasaya sürüldü). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

2.4.x sürümleri için bir geçici çözüm vardır ( https://github.com/mojohaus/jaxws-maven-plugin/issues/4'de belirtildiği gibi ):

    <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

Düzenli bir maven projesiyle kullandım ve aşağıdaki eklenti bağımlılığı yapılandırmasıyla çözdüm 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>

Bu çözümle, jaxws-maven-plugindiğerlerinin belirttiği gibi 2.5'e güncellemem gerekiyordu mojohaus.org/jaxws-maven-plugin/usage.html Ama yine de, benim durumumdaki en iyi cevap , teşekkür ederim!
DependencyHell

3

jaxp.properties"JDK version / jre / lib" yolunuzun altında (yoksa) adlı bir dosya oluşturun ve ardından şu satırı ekleyin:

javax.xml.accessExternalSchema = all

2

Ele alınacak başka bir çözüm: wiki.netbeans.org

IDE'deki Web Hizmeti İstemcisi sihirbazı, bir web hizmetinden veya WSDL dosyasından bir web hizmeti istemcisi oluştururken WSDL dosyasını ayrıştırır. Netbeans_default_options öğesine aşağıdaki anahtarı eklemek için IDE yapılandırma dosyasını (netbeans.conf) değiştirmeniz gerekir. Değişikliğin geçerli olması için IDE'yi yeniden başlatmanız gerekir.

-J-Djavax.xml.accessExternalSchema=all

GlassFish'e dağıtım yaparken, bir web hizmeti için test istemcisi oluşturmak üzere harici şemaya erişimi etkinleştirmeniz gerekir. Erişimi etkinleştirmek için GlassFish Sunucusunun (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) yapılandırma dosyasını değiştirmeniz ve aşağıdaki JVM seçenek öğesini eklemeniz gerekir. Değişikliğin etkili olması için sunucuyu yeniden başlatmanız gerekir.

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

Üzgünüm, başka bir şey düşünemiyorum.
Özgür Akıncı

1

Ant kullanıyorsanız java aramalarınıza jvmarg ekleyebilirsiniz:

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

Bunu bir karınca dosyasına nereye koyarsanız daha açık olabilir misiniz?
John L

1

Çok basit bir taşınabilir çözüm, aşağıdaki kod satırını, kodunuzun önemli bir bölümüne bir yere yerleştirmek olacaktır, bunun bir kısmı çalıştırılacağından emin olabilirsiniz (örneğin, ana yöntemde):

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

Bu, gerekli sistem özelliğini, zor maven pom.xml değişiklikleri yapmak zorunda kalmadan programlı olarak ayarlar (bu, bazı nedenlerden dolayı benim için çalışmadı).


1

Sadece kullanırsanız o çalıştık SoapUI (5.4.x)ve kullanım Apache CXFjava kodu oluşturmak için bir araç, koymak javax.xml.accessExternalSchema = alliçinde YOUR_JDK/jre/lib/jaxp.propertiesdosyanın da çalışır.


0

Başka bir alternatif, aşağıdakileri ekleyerek wsimport.sh kabuk betiğini güncellemektir:

Wsimport.sh bu dizinde bulunur:

JAXWS-ri.2.2.28 / bin

exec "$ JAVA" $ WSIMPORT_OPTS -Djavax.xml.accessExternalSchema = tümü -jar "$ JAXWS_HOME / lib / jaxws-tools.jar" "$ @"


Önerinizi denemek isterim, ama görünüşe göre jaxws-ri.2.2.28 / bin makinemin herhangi bir yerinde değil.
Max West

0

Başka bir başvuru: maven-jaxb2-plugin0.9.0 sürümünden önce kullanıyorsanız, bu davranışın eklentiyi etkilediği bu sorunda açıklanan geçici çözümü kullanabilirsiniz .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.