思考 - Java 8 - 无效常量类型
Reflections - Java 8 - invalid constant type
我对 Reflections 库有疑问。
我正在尝试动态加载所有实现特定接口的 类 。
只要我不在这些 类 (java 8) 中使用 lambda 表达式,一切正常(所有 类 都已加载)。
我尝试升级 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 对不起英语:)
如果您查看标签值为 18
的 this table, you’ll see that “constant type: 18” refers to the CONSTANT_InvokeDynamic
属性。
所以您使用的库有一个 class 解析器,它与 Java 8 不兼容。实际上,这个 class 解析器甚至不兼容 Java 7,因为这个常量值是从 Java 7 开始指定的。它只是逃脱了,因为普通的 Java 代码没有在 Java 7 中未使用此功能。但是当与由不同编程语言为 JVM 生成的代码交互时,它甚至可能会失败 Java 7.
an item in the bug tracker of Reflections 描述了您的问题。在底部,您会发现通知:
With this fix: https://issues.jboss.org/browse/JASSIST-174 javassist got support for this constant. So with 3.18.2-GA this error doesn't occur.
我刚刚在这里解决了一个类似的问题。在我的例子中,我的 class 路径上有两个 javassist jar。我使用 maven 并且它应该避免这种情况,但是其中一个依赖项使用了不同的 groupId(javassist
用于旧的,org.javassist
用于新的,由 org.reflections
导入),所以 Maven 将它们作为不同的工件处理。
我刚刚将依赖旧库的库更改为依赖新库,一切都已修复!
我遇到了这个问题,所以我暂时从 jdk、EXPORT JAVA_HOME="/home/user/jdk1.7.0_55" 进行了降级,一切正常。
如果您使用 weblogic,则可能与它的类加载器已经加载的库发生冲突。您可以通过放置
来覆盖它们
...
<weblogic-web-app>
<container-descriptor>
<prefer-application-packages>
<package-name>javassist.*</package-name>
...
在您的网络项目的 weblogic.xml
配置文件中。注意真正的 java 包只是 javassist
,而不是 org.javassist
(maven groupId).
我解决了这个问题;
先升级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>
在 Websphere 上,我通过为该应用程序启用 "parent last" 类加载器解决了这个问题,这样与应用程序一起打包的 JAR 优先于服务器提供的 JAR。
我对 Reflections 库有疑问。 我正在尝试动态加载所有实现特定接口的 类 。 只要我不在这些 类 (java 8) 中使用 lambda 表达式,一切正常(所有 类 都已加载)。 我尝试升级 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 对不起英语:)
如果您查看标签值为 18
的 this table, you’ll see that “constant type: 18” refers to the CONSTANT_InvokeDynamic
属性。
所以您使用的库有一个 class 解析器,它与 Java 8 不兼容。实际上,这个 class 解析器甚至不兼容 Java 7,因为这个常量值是从 Java 7 开始指定的。它只是逃脱了,因为普通的 Java 代码没有在 Java 7 中未使用此功能。但是当与由不同编程语言为 JVM 生成的代码交互时,它甚至可能会失败 Java 7.
an item in the bug tracker of Reflections 描述了您的问题。在底部,您会发现通知:
With this fix: https://issues.jboss.org/browse/JASSIST-174 javassist got support for this constant. So with 3.18.2-GA this error doesn't occur.
我刚刚在这里解决了一个类似的问题。在我的例子中,我的 class 路径上有两个 javassist jar。我使用 maven 并且它应该避免这种情况,但是其中一个依赖项使用了不同的 groupId(javassist
用于旧的,org.javassist
用于新的,由 org.reflections
导入),所以 Maven 将它们作为不同的工件处理。
我刚刚将依赖旧库的库更改为依赖新库,一切都已修复!
我遇到了这个问题,所以我暂时从 jdk、EXPORT JAVA_HOME="/home/user/jdk1.7.0_55" 进行了降级,一切正常。
如果您使用 weblogic,则可能与它的类加载器已经加载的库发生冲突。您可以通过放置
来覆盖它们...
<weblogic-web-app>
<container-descriptor>
<prefer-application-packages>
<package-name>javassist.*</package-name>
...
在您的网络项目的 weblogic.xml
配置文件中。注意真正的 java 包只是 javassist
,而不是 org.javassist
(maven groupId).
我解决了这个问题;
先升级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>
在 Websphere 上,我通过为该应用程序启用 "parent last" 类加载器解决了这个问题,这样与应用程序一起打包的 JAR 优先于服务器提供的 JAR。