2015-04-29 38 views
5

Mam aplikację Java na komputery stacjonarne, która używa JAX-WS do wywoływania niektórych usług internetowych przy użyciu domyślnej implementacji JAX-WS w Java SE - jest to aplikacja SWT uruchamiana za pośrednictwem Java Web Start (.jnlp). Usługi internetowe nie miały żadnych problemów aż do niedawna, kiedy kilka przypadków, kiedy zaczęłam mieć błędy są inicjowane wywołania usług internetowych:Konfiguracja metra jest niedostępna w języku 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") 

co ostatecznie prowadzi do:

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

Wszyscy klienci doświadczają ten problem występuje w systemie Windows przy użyciu środowiska JRE 1.8.31-45, zarówno w wersji x86, jak i x86_64. Przeszukałem tę witrynę i google, ale nie udało mi się znaleźć żadnych informacji na temat tego problemu.

Dziękujemy za wgląd w ten problem!

+0

Powinieneś spróbować znaleźć wersję, która wprowadziła problem, tj. Jaka jest najnowsza wersja Java bez problemu i jaka jest najstarsza wersja z problemem ... – Holger

+0

Problem pojawił się po raz pierwszy przy 8u45, więc pomyślałem, że to był problem ... ale wczoraj stało się to z 8u31, więc nie wiem co myśleć. – idlegravity

+0

Spójrz na http://stackoverflow.com/questions/23011547/webservice-client-generation-error-with-jdk8 – heelha

Odpowiedz

1

po aktualizacji z jre 1.7_80 do 1.8.0_51 otrzymaliśmy błąd "MASM0003", gdy próbowaliśmy uruchomić nasze usługi sieciowe. ustawienie ContextClassLoader przed publikacją rozwiązało problem:

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

0

Myślę, że spełniasz ten sam issue jak ja.

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)}); 
} 

to kod w JDK MetroConfigLoader będzie załadować zasób z określonego przywileju, i to jest przyczyną, dzięki czemu można używać jaxws-rt która jest trzecia część lib do jego realizacji,

lub można załaduj swój zasób do programu ładującego klasy, korzystając z numeru AccessController.doPrivileged, aby uzyskać dostęp do zasobu.