我有Reflections库的问题。我试图动态加载实现特定接口的所有类。只要我不在这些类中使用lambda表达式(java 8),一切正常(所有类都已加载)。我尝试升级lib版本,但效果是相同的(java.io.IOException:无效的常量类型:18)。
依赖并在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>
不排斥是同样的效果。
码:
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);
如何使用lambda表达式加载类?
P.S抱歉英语:)
如果你看看this table,你会看到“常量类型:18”指的是CONSTANT_InvokeDynamic
属性,其标记值为18
。
所以你使用的库有一个不兼容Java 8的类解析器。实际上,这个类解析器甚至不兼容Java 7,因为从Java 7开始就指定了这个常量值。它只是因为普通的Java代码在Java 7中没有使用这个特性。但是当与不同的代码交互时JVM的编程语言甚至可能因Java 7而失败。
有an item in the bug tracker of Reflections描述你的问题。在底部,您会看到通知:
有了这个修复:https://issues.jboss.org/browse/JASSIST-174 javassist得到了对这个常量的支持。因此,对于3.18.2-GA,不会发生此错误。
我解决了这个问题;
首先将javassist
jar升级到 - > 3.18.2-GA
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
其次添加weblogic.xml
<wls:package-name>javassist.*</wls:package-name>
我刚刚解决了类似的问题。就我而言,我的类路径上有两个javassist jar。我使用maven并且应该避免这种情况,但其中一个依赖项使用了不同的groupId(javassist
用于旧的,org.javassist
用于新的,由org.reflections
导入),因此maven将它们作为不同的工件处理。
我只是根据旧库改变了库,以取决于新的库,一切都是固定的!
如果您使用weblogic,它可能与它的类加载器已经加载的库发生冲突。您可以通过放置来覆盖它们
...
<weblogic-web-app>
<container-descriptor>
<prefer-application-packages>
<package-name>javassist.*</package-name>
...
在您的Web项目的weblogic.xml
配置文件中。注意真正的java包只是javassist
,而不是org.javassist
(maven groupId)。
在Websphere上,我通过为该应用程序启用“parent last”类加载器来解决该问题,以便与应用程序打包的JAR优先于服务器提供的JAR。
我有这个问题,所以我暂时从我的jdk,EXPORT JAVA_HOME =“/ home / user / jdk1.7.0_55”做了降级,一切正常。