2015-04-29 17 views
5

Ho un'app desktop Java che utilizza JAX-WS per chiamare alcuni servizi Web utilizzando l'implementazione Metro JAX-WS predefinita in Java SE: è un'app SWT avviata tramite Java Web Start (.jnlp). I servizi web non hanno avuto alcun problema fino a poco tempo fa, quando molti casi hanno iniziato ad avere gli errori quando le chiamate di servizio web vengono inizializzati:La configurazione della metropolitana non è accessibile in 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") 

che alla fine porta a:

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

Tutti i clienti sperimentare questo problema si verifica su Windows utilizzando JRE 1.8.31-45, entrambi x86 e x86_64. Ho setacciato questo sito e google, ma non sono riuscito a trovare alcuna informazione su questo problema.

Grazie per qualsiasi chiarimento su questo problema!

+0

Si dovrebbe cercare di individuare la versione che ha introdotto il problema, ovvero quale è la versione Java più recente senza il problema e qual è la versione più vecchia con il problema ... – Holger

+0

Il problema è apparso per la prima volta con 8u45, quindi ho pensato che fosse il problema ... ma ieri è successo con 8u31, quindi non so cosa pensare. – idlegravity

+0

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

risposta

1

dopo l'aggiornamento da jre 1.7_80 a 1.8.0_51 abbiamo ricevuto l'errore "MASM0003" quando abbiamo provato ad avviare i nostri servizi web. impostazione ContextClassLoader prima di pubblicare risolto il problema:

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

0

Penso che incontriate lo stesso issue come me.

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

che è il codice nel JDK MetroConfigLoader, caricherà la risorsa con privilegi specifici, e questa è la causa principale, in modo da poter usare jaxws-rt che è un terzo lib parte per la sua attuazione,

oppure si può carica la tua risorsa nel tuo caricatore di classi con AccessController.doPrivileged, in modo che tu possa accedere alla tua risorsa.