Reflections - Java 8 - type de constante invalide
J'ai un problème avec Réflexions de la bibliothèque.
Je suis en train de charger dynamiquement toutes les classes qui implémentent l'interface spécifique.
Tout fonctionne bien (toutes les classes sont chargées) tant que je n'utilise pas l'expression lambda dans ces classes (java 8).
J'ai essayé de mise à niveau lib version mais l'effet était le même (java.io.IOException: invalid constante de type: 18).
De dépendance et de construire en pom.xml
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.10</version>
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.19.0-GA</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
sans exclusion est le même effet.
Code:
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);
Comment puis-je charger des classes avec une expression lambda?
P. S Désolé pour l'anglais 🙂
source d'informationauteur Lukasz
Vous devez vous connecter pour publier un commentaire.
Si vous regardez ce tableauvous verrez que la “constante de type: 18” se réfère à la
CONSTANT_InvokeDynamic
attribut dont la valeur de tag18
.De sorte que vous êtes en utilisant une bibliothèque qui a une classe de l'analyseur qui n'est pas Java 8 compatible. En fait, cette classe parser même n'est pas Java 7 compatible que cette valeur de la constante est spécifié depuis Java 7. Il a juste obtenu loin que, comme ordinaire de code Java n'utilise pas cette fonction en Java 7. Mais lors de l'interaction avec le code produit par les différents langages de programmation pour la JVM, il pourrait encore échouer avec Java 7.
Il y a un article dans le bug tracker de Réflexions décrivant votre problème. En bas, vous trouverez l'avis:
Je viens de corriger un problème similaire ici. Dans mon cas, il y avait deux javassist pots sur mon chemin de classe. J'utilise maven et il était censé éviter cela, mais l'une des dépendances utilisé une autre id de groupe (
javassist
pour l'ancien etorg.javassist
pour le nouveau, importés parorg.reflections
), de sorte que maven traitées comme des objets divers.J'ai juste changé la bibliothèque selon l'ancien à dépendre sur le nouveau et tout est résolu!
Si vous utilisez weblogic il peut y avoir un conflit avec les bibliothèques déjà chargé par son chargeur de classe. Vous pouvez les remplacer par la mise
dans vos projets web de l'
weblogic.xml
fichier de configuration. Remarque le réel package java est justejavassist
pasorg.javassist
(maven groupId).J'ai résolu ce problème;
D'abord mettre à niveau
javassist
pot ->3.18.2-GA
Ensuite ajouter weblogic.xml
J'ai eu ce problème donc j'ai fait le downgrade temporairement de mon jdk, EXPORT JAVA_HOME="/home/utilisateur/jdk1.7.0_55" et tout a bien fonctionné.