2015-04-29 21 views
5

Tôi có ứng dụng Java dành cho máy tính để bàn sử dụng JAX-WS để gọi một số dịch vụ web bằng cách sử dụng triển khai Metro JAX-WS mặc định trong Java SE - đó là ứng dụng SWT được khởi chạy qua Java Web Start (.jnlp). Các dịch vụ web đã không có vấn đề gì cho đến gần đây, khi một số trường hợp bắt đầu có lỗi khi các cuộc gọi dịch vụ web được khởi tạo:Cấu hình Metro không thể truy cập được trong Java SE 8

WARNING: MASM0010: Unable to unmarshall metro config file from location [ jar:file:/C:/Program%20Files%20(x86)/Java/jre1.8.0_31/lib/resources.jar!/com/sun/xml/internal/ws/assembler/jaxws-tubes-default.xml ] 
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessDeclaredMembers") 

Mà cuối cùng dẫn đến:

SEVERE: MASM0003: Default [ jaxws-tubes-default.xml ] configuration file was not loaded. 

Tất cả các khách hàng trải nghiệm vấn đề này là trên Windows bằng cách sử dụng JRE 1.8.31-45, cả x86 và x86_64. Tôi đã cọ rửa trang web này và google, nhưng không thể tìm thấy bất kỳ thông tin nào về vấn đề này.

Cảm ơn bạn đã có thông tin chi tiết về vấn đề này!

+0

Bạn nên cố gắng phát hiện phiên bản giới thiệu sự cố, tức là phiên bản Java mới nhất mà không gặp sự cố và phiên bản cũ nhất có vấn đề là gì ... – Holger

+0

Sự cố đầu tiên xuất hiện với 8u45, vì vậy tôi nghĩ đó là vấn đề ... nhưng ngày hôm qua nó đã xảy ra với 8u31, vì vậy tôi không biết phải suy nghĩ gì. – idlegravity

+0

Xem http://stackoverflow.com/questions/23011547/webservice-client-generation-error-with-jdk8 – heelha

Trả lời

1

sau khi nâng cấp từ jre 1.7_80 lên 1.8.0_51, chúng tôi đã nhận được lỗi "MASM0003" khi chúng tôi cố gắng khởi động dịch vụ web của mình. đặt ContextClassLoader trước khi xuất bản giải quyết được sự cố:

Thread.currentThread(). SetContextClassLoader (getClass(). GetClassLoader()); endpoint = Endpoint.publish (wsdlUrl, engine);

0

Tôi nghĩ bạn gặp cùng một số issue như tôi.

private static JAXBContext createJAXBContext() throws Exception { 
     return isJDKInternal()?(JAXBContext)AccessController.doPrivileged(new PrivilegedExceptionAction<JAXBContext>() { 
      public JAXBContext run() throws Exception { 
       return JAXBContext.newInstance(MetroConfig.class.getPackage().getName()); 
      } 
     }, createSecurityContext()):JAXBContext.newInstance(MetroConfig.class.getPackage().getName()); 
} 

private static AccessControlContext createSecurityContext() { 
    PermissionCollection perms = new Permissions(); 
    perms.add(new RuntimePermission("accessClassInPackage.com.sun.xml.internal.ws.runtime.config")); 
    perms.add(new ReflectPermission("suppressAccessChecks")); 
    return new AccessControlContext(new ProtectionDomain[]{new ProtectionDomain((CodeSource)null, perms)}); 
} 

đó là mã trong JDK MetroConfigLoader, nó sẽ tải các tài nguyên với đặc quyền cụ thể, và đó là nguyên nhân gốc rễ, vì vậy bạn có thể sử dụng jaxws-rt mà là một phần lib thứ ba để thực hiện nó,

Hoặc bạn có thể tải tài nguyên của bạn trong trình tải lớp của bạn với AccessController.doPrivileged, do đó bạn có thể truy cập tài nguyên của mình.

Các vấn đề liên quan