Reflexiones-Java 8-tipo de constante inválida
java-8 javassist (6)
Tengo un problema con la biblioteca de Reflections . Estoy tratando de cargar dinámicamente todas las clases que implementan una interfaz específica. Todo funciona bien (todas las clases están cargadas) siempre que no use la expresión lambda en estas clases (java 8). Intenté actualizar la versión lib pero el efecto fue el mismo (java.io.IOException: tipo de constante no válida: 18).
Dependencia y compilación 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>
Sin exclusión es el mismo efecto.
Código:
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);
¿Cómo puedo cargar clases con la expresión lambda?
PS Perdón por el inglés :)
Acabo de arreglar un problema similar aquí. En mi caso, había dos frascos javassist en mi camino de clases. Yo uso maven y se suponía que debía evitar eso, pero una de las dependencias usaba un groupId diferente ( javassist
para el antiguo y org.javassist
para el nuevo, importado por org.reflections
), así que maven los manejaba como artefactos diferentes.
¡Acabo de cambiar la biblioteca dependiendo de la antigua para depender de la nueva y todo está arreglado!
En Websphere, solucioné el problema al habilitar el último cargador de clases para esa aplicación, de modo que los JARs empaquetados con la aplicación tengan prioridad sobre los proporcionados por el servidor.
Resolví este problema que;
Primera actualización de javassist
jar a -> 3.18.2-GA
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
En segundo lugar añadir weblogic.xml
<wls:package-name>javassist.*</wls:package-name>
Si observa esta tabla , verá que "tipo de constante: 18" hace referencia al atributo CONSTANT_InvokeDynamic
cuyo valor de etiqueta es 18
.
Por lo tanto, está utilizando una biblioteca que tiene un analizador de clase que no es compatible con Java 8. En realidad, este analizador de clase aún no es compatible con Java 7, ya que este valor constante se especifica desde Java 7. Se olvidó de eso, ya que el código Java normal no usa esta función en Java 7. Pero cuando interactúa con el código producido por diferentes Lenguajes de programación para la JVM, incluso podría fallar con Java 7.
Hay un elemento en el rastreador de errores de Reflexiones que describe su problema. En la parte inferior, encontrará el aviso:
Con esta solución: https://issues.jboss.org/browse/JASSIST-174 javassist obtuvo soporte para esta constante. Así que con 3.18.2-GA este error no ocurre.
Si usa weblogic, puede haber un conflicto con las bibliotecas ya cargadas por su cargador de clases. Puedes anularlos poniendo
...
<weblogic-web-app>
<container-descriptor>
<prefer-application-packages>
<package-name>javassist.*</package-name>
...
en el archivo de configuración weblogic.xml
sus proyectos web. Tenga en cuenta que el paquete java real es javassist
, no org.javassist
(maven groupId).
Tuve este problema, así que hice la rebaja temporalmente de mi jdk, EXPORT JAVA_HOME = "/ home / user / jdk1.7.0_55" y todo funcionó bien.