Reflections – Java 8 – tipo costante non valido

Ho un problema con la libreria Reflections . Sto cercando di caricare dynamicmente tutte le classi che implementano un’interfaccia specifica. Tutto funziona bene (tutte le classi sono caricate) a condizione che non usi espressioni lambda in queste classi (java 8). Ho provato la versione di aggiornamento della lib ma l’effetto era lo stesso (java.io.IOException: tipo costante non valido: 18).

Dipendenza e build in pom.xml

 org.reflections reflections 0.9.10   javassist javassist     org.javassist javassist 3.19.0-GA     org.apache.maven.plugins maven-compiler-plugin  1.8 1.8     

senza esclusione è lo stesso effetto.

Codice:

  URL jarUrl = jarFile.toURI().toURL(); URLClassLoader child = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); ConfigurationBuilder builder = new ConfigurationBuilder() .addClassLoader(child) .addUrls(jarUrl) .setScanners(new SubTypesScanner()); Reflections r = new Reflections(builder); return r.getSubTypesOf(cls); 

Come posso caricare le classi con espressione lambda?

PS Scusa per l’inglese 🙂

Se guardi questa tabella , vedrai che “tipo costante: 18” si riferisce all’attributo CONSTANT_InvokeDynamic cui valore di tag è 18 .

Quindi stai usando una libreria che ha un parser di class che non è compatibile con Java 8. In realtà, questo parser di class non è compatibile con Java 7 in quanto questo valore costante è specificato da Java 7. È stato appena superato con questo, poiché il normale codice Java non utilizza questa funzionalità in Java 7. Ma quando si interagisce con codice prodotto da diversi linguaggi di programmazione per JVM, potrebbe anche fallire con Java 7.

C’è un elemento nel bug tracker di Reflections che descrive il tuo problema. In fondo, troverai l’avviso:

Con questa correzione: https://issues.jboss.org/browse/JASSIST-174 javassist ha ottenuto il supporto per questa costante. Quindi con 3.18.2-GA questo errore non si verifica.

Ho appena risolto un problema simile qui. Nel mio caso, c’erano due barattoli javassisti sul mio percorso di class. Uso Maven e dovevo evitarlo, ma una delle dipendenze utilizzava un groupId diverso ( javassist per quello vecchio e org.javassist per quello nuovo, importato da org.reflections ), quindi Maven le gestiva come artefatti diversi.

Ho appena cambiato la libreria in base alla vecchia per dipendere da quella nuova e tutto è stato risolto!

Se usi weblogic potrebbe essere un conflitto con le librerie già caricate dal suo programma di caricamento classi. Puoi scavalcarli inserendo

 ...    javassist.* ... 

nel file di configurazione weblogic.xml dei progetti Web. Nota che il vero pacchetto java è solo javassist , non org.javassist ( org.javassist groupId).

Ho risolto questo problema;

Primo aggiornamento jar javassist a -> 3.18.2-GA

   org.javassist javassist 3.18.2-GA  

In secondo luogo aggiungi weblogic.xml

  javassist.* 

Ho avuto questo problema quindi ho eseguito il downgrade temporaneamente dal mio jdk, EXPORT JAVA_HOME = “/ home / utente / jdk1.7.0_55” e tutto ha funzionato bene.