Lỗi tạo thế hệ máy khách WebService với JDK8


227

Tôi cần phải sử dụng một dịch vụ web trong dự án của tôi. Tôi sử dụng NetBeans vì vậy tôi đã nhấp chuột phải vào dự án của mình và cố gắng thêm một "Máy khách dịch vụ web" mới. Lần trước tôi đã kiểm tra, đây là cách để tạo một ứng dụng khách dịch vụ web. Nhưng nó đã dẫn đến một AssertsError, nói rằng:

java.lang.AssertsError: org.xml.sax.SAXPudeException; systemId: jar: file: /path/to/lassfish/modules/jaxb-osgi.jar! /com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; số dòng: 52; số cột: 88; lược đồ: Không thể đọc tài liệu lược đồ ' xjc.xsd ', vì không cho phép truy cập 'tệp' do hạn chế được đặt bởi thuộc tính accessExternalSchema .

Nền tảng Java mặc định cho NetBeans là JDK8 (phiên bản chính thức của Oracle), vì vậy khi tôi thay đổi tệp netbeans.conf của mình và tạo JDK7 (từ Oracle, cũng như mặc định), mọi thứ đều hoạt động tốt. Vì vậy, tôi nghĩ rằng vấn đề là với JDK8. Đây là java -versionđầu ra của tôi :

java phiên bản "1.8.0"
Java (TM) SE Môi trường thời gian chạy (bản dựng 1.8.0-b132)
Máy chủ 64-bit Java HotSpot (TM) (bản dựng 25.0-b70, chế độ hỗn hợp)

Hiện tại, tôi đang giữ JDK7 làm nền tảng Java mặc định của mình. Nếu có một cách để làm cho JDK8 hoạt động, hãy chia sẻ.


2
Tôi đã gặp một vấn đề trong Eclipse rằng các nguồn jaxb không được tạo khi sử dụng m2eclipse và jdk1.8. Trong giao diện đánh dấu, tôi thấy một lỗi tương tự về "accessExternalSchema". Khi tôi áp dụng giải pháp đã chọn bên dưới, khởi động lại nhật thực và làm sạch dự án, các nguồn đã được tạo!
Jonas Berlin

Câu trả lời:


403

Vâng, tôi tìm thấy giải pháp. (dựa trên http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHema )

Tạo một tệp có tên jaxp.properties(nếu nó không tồn tại) bên dưới /path/to/jdk1.8.0/jre/libvà sau đó viết dòng này vào đó:

javax.xml.accessExternalSchema = all

Đó là tất cả. Thưởng thức JDK 8.


12
Làm việc cho intelliJ quá.
Mafro34 17/2/2015

1
Tôi có thể xác nhận giải pháp này cũng như làm việc cho maven build trong nhật thực với maven và jaxb-plugin. Ai đó có thể giải thích lý do tại sao bạn không cần thuộc tính này cho Java7 không?
Daniel Lo

3
Điều này làm việc cho tôi, nhưng tôi phải đặt các tập tin /path/to/jdk1.8.0/libkhông thuộc jrethư mục tiếp theo .
Geoff

21
Điều này không phải là rất di động. Bạn sẽ cần phải điều chỉnh cài đặt JDK cục bộ trên máy của mọi nhà phát triển cố gắng xây dựng dự án.
Natix

7
điều này không hiệu quả với tôi, các công việc sau đây: javax.xml.accessExternalDTD = all, Ngoài ra tôi có thể đặt mã này trong mã và nó hoạt động: System.setProperty ("javax.xml.accessExternalDTD", "all");
qartal

118

Không phải là một câu trả lời thực tế nhưng nhiều hơn như là một tài liệu tham khảo.

Nếu bạn đang sử dụng plugin Maven jaxws và bạn nhận được thông báo lỗi tương tự, hãy thêm thuộc tính được đề cập vào cấu hình plugin:

...
<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
Các accessExternalSchema=allgiá trị được thiết lập theo mặc định nếu bạn sử dụng các phiên bản sau (như 0.12.3) của org.jvnet.jaxb2.maven2:maven-jaxb2-pluginplugin.
Jon Onstott

Ở trên không làm việc cho tôi. Phiên bản này đã làm: <plugin> <groupId> org.codehaus.mojo </ groupId> <artifactId> jaxws-maven-plugin </ artifactId> <version> $ {version.jaxws.plugin} </ version> <configure> ! - Cần thiết với JAXP 1.5 -> <vmArss> <vmArg> -Djavax.xml.accessExternalSchema = tất cả </ vmArg> </ vmArss> </ configure> </ plugin>
Dr4gon

@JonOnstott: có bản 2.4.1 mới nhất và nó không hoạt động theo mặc định. Phải thêm như thế này trong câu trả lời.
Robert Niestroj

36

Tôi chạy các bản dựng ant trong IDE Eclipse (4.4, Luna, trên Windows 7 x64). Thay vì sửa đổi lib JRE đã cài đặt hoặc bất kỳ tập lệnh ant nào (Tôi có nhiều dự án bao gồm XJC trong các bản dựng của chúng), tôi thích thay đổi Cài đặt Eclipse "Cấu hình công cụ bên ngoài" và thêm các đối số VM vào cấu hình xây dựng Ant:

-Djavax.xml.accessExternalSchema=all

2
Tôi sử dụng wsdl2java.bat từ Apache CXF. Vì vậy, tôi chỉ chèn tùy chọn JVM vào tệp BAT này. Nó hoạt động.
ka3ak 11/03/2015

1
Tôi cũng có thể thêm, hơn là nếu chúng tôi bao gồm tùy chọn này làm tham số ant, tất cả các bao gồm khác được đề cập ở đây, là quá mức. Nhưng không phải ngược lại! Vì vậy, đây là giải pháp tốt nhất. +1 (tất nhiên, người dùng Maven nên thực hiện thay đổi phù hợp trong tùy chọn Maven)
Gangnus

1
Tôi gặp vấn đề tương tự khi tôi cố chạy mvn cài đặt sạch, tôi chỉ cần thêm cờ này ở trên và nó đã được triển khai thành công. Cảm ơn
Spear A1

30

Các tác phẩm sau đây cho wsimport 2.2.9 được bao gồm trong jdk 1.8.0_66:

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

Điều này làm việc cho tôi. Tôi đã thử với jdk 1.8.0_65 và nó không hoạt động, vì vậy hãy chắc chắn rằng bạn đang sử dụng jdk 1.8.0_66 trở lên.
jabe

2
Đây là câu trả lời đúng khi sử dụng wsimporttrực tiếp.
Christopher Schultz

20

Trong trường hợp của tôi thêm:

javax.xml.accessExternalSchema = all

để jaxp.properies không hoạt động, tôi đã thêm:

javax.xml.accessExternalDTD = all

Môi trường của tôi là linux mint 17 và java 8 oracle. Tôi sẽ đặt nó ở đó như một câu trả lời cho những người có cùng vấn đề.


2
Nó phụ thuộc vào việc bạn muốn cho phép truy cập vào DTD bên ngoài hay Lược đồ XML (XSD). DTD là tiền thân của Lược đồ XML. Cũng có thể có trường hợp bạn cần đặt cả hai!
Philip Helger

17

Tôi đã thử nghiệm phiên bản 2.4 của artifact org.codehaus.mojo và nó đã hoạt động ~

<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
Có lẽ đó là vmArss -Djavax.xml.accessExternalSchema=allđược cấu hình trong khai báo plugin của bạn. Nó được thảo luận trong Netbeans Bug
244891

15

Dưới đây là một gợi ý Gợi ý cho người dùng lớp mà không có quyền quản trị: thêm dòng này vào tác vụ jaxb của bạn:

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

Nó sẽ trông giống thế này:

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

12

Nếu bạn gặp phải vấn đề này khi chuyển đổi wsdl sang jave với plugin cxf-codegen-plugin , thì bạn có thể giải quyết nó bằng cách định cấu hình plugin thành fork và cung cấp tùy chọn JVM "-Djavax.xml.accessExternalSchema = all".

        <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
cảm ơn! tất cả các tùy chọn trên không giúp được gì và bạn đang làm việc cho tôi
ludenus

10

Tôi cũng đã gặp loại lỗi tương tự trong Eclipse trong khi thử nghiệm chương trình dịch vụ web trên máy chủ web Glassfish 4.0: 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.

Tôi đã thêm javax.xml.accessExternalSchema = Allvào jaxp.properties, nhưng không làm việc cho tôi.

Tuy nhiên, tôi đã tìm thấy một giải pháp dưới đây phù hợp với mình: Đối với Máy chủ GlassFish, tôi cần sửa đổi domain.xmlGlassFish, đường dẫn: <path>/glassfish/domains/domain1hoặc domain2/config/domain.xml) và thêm, <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>dưới <java-config>thẻ

....

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> ... và sau đó khởi động lại máy chủ GlassFish


Tôi thấy hai phiên bản <java-config classpath-hậu tố '> trong tệp domain.xml. Cả hai đều có các phần của <jvm-Tùy chọn> trong đó. Tôi đặt dòng trên (với các thẻ tùy chọn jvm) vào cả hai phần. Nó vẫn không hoạt động để chạy Dịch vụ web thử nghiệm. Tôi biết dự án đang hoạt động vì tệp khách hàng được mã hóa truy cập vào các tệp dịch vụ và in ra thông tin phù hợp trong bảng điều khiển (từ cơ sở dữ liệu được liên kết với các tệp dịch vụ).
Max West

<p> Tôi đã đóng dự án và dự án khách hàng, đã thoát NetBeans và đợi Glassfish tự tắt (nó hiển thị đồng hồ đo tiến độ trong khi nó đang tắt). Sau đó, tôi khởi động lại Netbeans, tải lại dự án Dịch vụ web, tải lại tệp Máy khách (nó chỉ là một lớp Java trong thư mục Dự án Java thông thường / riêng biệt). Máy khách in ra các bảng, cho thấy máy chủ và máy chủ cơ sở dữ liệu đang hoạt động, cũng như các dịch vụ Web & EJB của dịch vụ SOAP. Nó chỉ không hoạt động. Cài đặt accessExternalSchema bị chôn vùi ở đâu đó và không được đặt đúng trong JDK mới. </ P>
Max West

7

Cho phép truy cập vào Lược đồ bên ngoài

Bạn cần kích hoạt IDE và Máy chủ GlassFish để truy cập lược đồ bên ngoài để phân tích tệp WSDL của dịch vụ web. Để cho phép truy cập, bạn cần sửa đổi các tệp cấu hình của IDE và Máy chủ GlassFish. Để biết thêm chi tiết, hãy xem Câu hỏi thường gặp Cách bật phân tích cú pháp WSDL bằng lược đồ bên ngoài? Cấu hình IDE

Để tạo ứng dụng khách dịch vụ web trong IDE từ tệp dịch vụ web hoặc tệp WSDL, bạn cần sửa đổi tệp cấu hình IDE (netbeans.conf) để thêm chuyển đổi sau vào netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

Để biết thêm về cách định vị và sửa đổi tệp cấu hình netbeans.conf, hãy xem Câu hỏi thường gặp về Netbeans Conf. Cấu hình máy chủ GlassFish

Nếu bạn đang triển khai đến Máy chủ GlassFish, bạn cần sửa đổi tệp cấu hình của Máy chủ GlassFish (domain.xml) để cho phép máy chủ truy cập các lược đồ bên ngoài để phân tích tệp wsdl và tạo máy khách thử nghiệm. Để cho phép truy cập vào các lược đồ bên ngoài, hãy mở tệp cấu hình GlassFish (GLASSFISH_INSTALL / glassfish / domain / domain1 / config / domain.xml) và thêm phần tử tùy chọn JVM sau (in đậm). Bạn sẽ cần phải khởi động lại máy chủ để thay đổi có hiệu lực.

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

6

Khi sử dụng Maven với IntelliJ IDE, bạn có thể thêm -Djavax.xml.accessExternalSchema=allvào cài đặt Maven trong Tùy chọn JVM cho cấu hình Maven Build Tools Runner


Hoạt động với Linux Mint 17.3, JDK 1.8.0.74 và Intellij IDEA 15. Thx.
stuchl4n3k

Đẹp ! nó cũng hoạt động với tôi khi tôi sử dụng "mvn clean install -Djavax.xml.accessExternalSchema = all" trực tiếp trên thiết bị đầu cuối độc lập với IDE
Tanorix

5

Điều này hoạt động trên jdk1.8.0_65

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

4

Đối với những người sử dụng tác vụ ANT wsimport, cách chuyển tùy chọn theo đề xuất của @CMFly và được chỉ định trong tài liệu như sau:

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

4

Hiện tại nó đã được sửa trong phiên bản 2.5 (phát hành vào tháng jul / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

Đối với các phiên bản 2.4.x, có một cách giải quyết (như đã được giải mã trong 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

Tôi đã sử dụng nó với một dự án maven thông thường và đã giải quyết nó với cấu hình phụ thuộc plugin này để chạy 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>

Với giải pháp này, tôi cần cập nhật jaxws-maven-pluginlên 2.5 như được chỉ định trong các câu trả lời khác mojohaus.org/jaxws-maven-plugin/usage.html Nhưng vẫn, câu trả lời tốt nhất trong trường hợp của tôi, cảm ơn bạn!
Phụ thuộc vào

3

Tạo một tệp có tên jaxp.properties(nếu nó không tồn tại) theo đường dẫn đến "phiên bản JDK / jre / lib" của bạn và sau đó thêm dòng này vào đó:

javax.xml.accessExternalSchema = all

2

Một giải pháp khác để giải quyết: wiki.netbeans.org

Trình hướng dẫn Máy khách Dịch vụ Web trong IDE phân tích tệp WSDL khi tạo ứng dụng khách dịch vụ web từ tệp dịch vụ web hoặc tệp WSDL. Bạn cần sửa đổi tệp cấu hình IDE (netbeans.conf) để thêm công tắc sau vào netbeans_default_options. Bạn sẽ cần khởi động lại IDE để thay đổi có hiệu lực.

-J-Djavax.xml.accessExternalSchema=all

Khi triển khai lên GlassFish, bạn cần cho phép truy cập vào lược đồ bên ngoài để tạo ứng dụng khách thử nghiệm cho dịch vụ web. Để cho phép truy cập, bạn cần sửa đổi tệp cấu hình của Máy chủ GlassFish (GLASSFISH_INSTALL / glassfish / domain / domain1 / config / domain.xml) và thêm phần tử tùy chọn JVM sau. Bạn sẽ cần phải khởi động lại máy chủ để thay đổi có hiệu lực.

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

Tôi xin lỗi, tôi không thể nghĩ gì khác.
Özgür Akıncı

1

Nếu bạn đang sử dụng ant, bạn có thể thêm jvmarg vào các cuộc gọi java của mình:

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

Bạn có thể cụ thể hơn nơi bạn đặt điều này trong một tập tin kiến?
John L

1

Một giải pháp di động rất đơn giản sẽ là, đặt dòng mã sau đây ở đâu đó trong phần quan trọng của mã của bạn, một phần trong đó bạn chắc chắn rằng nó sẽ được chạy (ví dụ ngay trong phương thức chính):

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

Điều này đặt thuộc tính hệ thống cần thiết theo lập trình, mà không phải thực hiện các thay đổi maven pom.xml phức tạp (vì một số lý do không phù hợp với tôi).


1

Tôi vừa cố gắng rằng nếu bạn sử dụng SoapUI (5.4.x)và sử dụng Apache CXFcông cụ để tạo ra mã java, đặt javax.xml.accessExternalSchema = alltrong YOUR_JDK/jre/lib/jaxp.propertiestập tin cũng làm việc.


0

Một cách khác là cập nhật tập lệnh shell wsimport.sh bằng cách thêm vào như sau:

Wsimport.sh nằm trong thư mục này:

jaxws-ri.2.2.28 / thùng

thực hiện "$ JAVA" $ WSIMPORT_OPTS -Djavax.xml.accessExternalSchema = all -jar "$ JAXWS_HOME / lib / jaxws-tools.jar" "$ @"


Tôi muốn thử đề xuất của bạn, nhưng rõ ràng jaxws-ri.2.2.28 / bin không có ở bất kỳ đâu trên máy của tôi.
Max West

0

Một tài liệu tham khảo khác: Nếu bạn đang sử dụng maven-jaxb2-plugin, trước phiên bản 0.9.0, bạn có thể sử dụng cách giải quyết được mô tả về vấn đề này , trong đó hành vi này ảnh hưởng đến plugin.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.