前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java、Groovy项目升级JDK 21 ASM9报错

Java、Groovy项目升级JDK 21 ASM9报错

作者头像
FunTester
发布于 2024-01-02 08:46:06
发布于 2024-01-02 08:46:06
90300
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:0
代码可运行

最近在学习Java虚拟线程,打算深挖一下性能测试方面的潜力。不过在升级JDK的过程中遇到了一些意外情况。遇到了一个比较难缠的问题,报错信息如下:

java.lang.UnsupportedOperationException: PermittedSubclasses requires

看报错信息,应该缺少了一些依赖包。通过查证,改异常表示项目使用的库中需要使用了一个需要支持JDK 9的ASM版本,但是现在没有。

ASM 是一个 Java 字节码操作和分析库,它用于在 Java 字节码级别操作类文件。通常情况下,这种异常可能是由于库的兼容性问题造成的,其中使用了不匹配的 ASM 版本。

有了问题的原因,我们来一步步排除问题。

排除旧依赖

首先我们得排除旧版本的依赖。我是用的Maven-helper插件,通过搜索asm相关依赖,然后再使用 excludes 语法排除旧版本的依赖。如果这个办法奏效,那么太恭喜了。否则你还需要引入新版本的依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.2</version> <!-- 使用一个支持的 ASM 版本 -->
</dependency>

根据我自己的经验,不是必须的,我猜是一些依赖的库已经包含了相关的依赖,所以不用我再重新添加依赖配置。

升级相关库版本

这个步骤依然是为了解决版本的问题,因为我发现自己用到的JsonPath库用了一个非常早版本的ASM版本。按照上面步骤操作之后依然无法解决,所以升级了最新版本。然后再使用Maven-helper查看ASM依赖包的时候就发现已经没有问题了。

检查Groovy及插件

当我感觉要成功的时候,发现还是不行。当我仔细检查了所有配置发现还是不行。只能继续去互联网求助了,当我把搜索关键字加上 Groovy 之后有了收获,原来是我Groovy SDK版本以及Maven-Groovy的编译插件版本过时导致。具体从哪个版本过时的没搞清楚,下面是我正常的配置。

依赖配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>3.0.19</version>
        </dependency>

插件配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.0.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>

log4j shutdownHook error

当我终于要完成任务的时候,发现了一个额外的报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WARN StatusConsoleListener Unable to register Log4j shutdown hook because JVM is shutting down. Using SimpleLogger

经过一些搜索,发现这是一个不必要处理的异常,因为是升级之后才有的,所以也归于JDK升级的坑里面。解决方法 log4j2 配置文件中增加属性即可,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<configuration status="WARN" monitorInterval="30" shutdownHook="disable">
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot Jar包瘦身 - 跟大文件说再见!
SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼、就是 编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了。这个时候如果想要对线上运行工程有一些微调,则非常痛苦
云扬四海
2019/08/06
1.9K0
maven 插件之 maven-shade-plugin,解决同包同名 class 共存问题的神器
maven-shade-plugin 官网已经介绍的很详细了,我给大家简单翻译一下
青石路
2024/08/31
4580
maven 插件之 maven-shade-plugin,解决同包同名 class 共存问题的神器
从0-1搭建Spark本地开发环境(idea)
https://www.scala-lang.org/download/2.11.12.html
Eights
2020/07/10
3.4K0
从0-1搭建Spark本地开发环境(idea)
maven打一个可执行的jar包
Alternatively use "${project.build.directory}/classes/lib" as OutputDirectory to integrate all jar-files into the main jar, but then you will need to add custom classloading code to load the jars. 如上,上面可以将依赖的jar包copy到 target下面的 lib/ 目录下。然后生成jar包。 注意一点是,你的jar包只是包含你自己的代码,并不会把lib/目录下的jar一起打进你的jar中去。 这个时候,你可以执行 java -jar theMainClass 来运行你的程序。 如果你想把所有的依赖jar都打包到你的jar里面去,成为单个jar。 那么你可以将 dependency-plugin 的output设置为 "${project.build.directory}/classes/lib" 这样就可以打成单个jar包了。 但是,这个时候,你执行 java -jar theMainClass 来运行的话,是运行不了的哦。会报ClassNotFound。 至于原因见下面: 你是否在使用java -jar参数运行打包好的jar应用程序的时候发现应用程序无法找到classpath下设置好的第三方类库的内容?无论怎么设置classpath参数都无济于事,总是会报ClassNotFound的错误?那么本篇帖子可以帮助你摆脱烦恼 :) 当 用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候,你会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报 ClassNotFound错误。实际上这是由于当使用-jar参数运行的时候,java VM会屏蔽所有的外部classpath,而只以本身yourJarExe.jar的内部class作为类的寻找范围。 via: http://hi.baidu.com/daniel_tu/item/12e5434215c4052310ee1e8e 至于解决办法,上面的文章中有提到。个人觉得较好的是写个自定义的classLoader,来加载jar包内部的lib/目录下的class。 至此, 1).你通过maven来打一个可执行的jar包,要么选择不要把依赖jar包打到一起,而选择放在jar包外面的 lib/目录下。这样是可以的。 2).你也可以把依赖jar打到jar包内部,成为单个jar,是可以做到的,但通过java -jar方式执行会找不到类,需要自定义classLoader. 介绍第三种思路,允许打单独jar包,同时也可以通过 java -jar 来执行。 这种思路是将所有的依赖jar包解压开来变成class,打进我们的jar包里面去。POM如下:
sanmutongzi
2020/03/04
1.3K0
深入探讨Maven打包:打造精致的Zip包
在部署Spring Boot生产项目时,首先需要使用Maven将其打包成一个JAR文件或者包含JAR文件的ZIP文件。随后,通过堡垒机将打包好的文件上传至服务器进行部署,或构建成Docker镜像进行发布。在这一过程中,我们需要将项目中的配置文件或静态资源放置在JAR包之外,这样在修改配置文件或静态资源时就无需重新打包。为了构建ZIP文件,我们使用了Maven Assembly Plugin插件,该插件用于创建项目分发包,通过一个XML描述文件定义打包内容。本文将详细介绍这一流程。
修己xj
2024/04/02
2950
深入探讨Maven打包:打造精致的Zip包
Spark Streaming 整合 Flume
Apache Flume 是一个分布式,高可用的数据收集系统,可以从不同的数据源收集数据,经过聚合后发送到分布式计算框架或者存储系统中。Spark Straming 提供了以下两种方式用于 Flume 的整合。
每天进步一点点
2022/07/27
3440
Spark Streaming 整合 Flume
Maven对Springboot项目配置文件、依赖分离打包
Springboot项目有多种打包方法,可以直接打成一个完整jar包,由于spring cloud微服务的流行,这种方法也越来越多,当然这种方法也很简单。但是单个项目中实际部署需要修改某些参数配置,如果如此重复打包那就太麻烦了!
Java开发者之家
2021/06/17
2.9K0
maven打包配置
对于第三方引入的jar包,如果通过 ${project.basedir} 加载项目中的第三方jar包,可以编译运行,但是第三方jar包打不进去,具体可以看 下一篇 <?xml version="1.
kiki.
2022/09/29
4850
Maven - 打包之争:Jar vs. Shade vs. Assembly
Maven 提供了多种打包方式,其中常见的包括三种:jar、shade、assembly。下面是它们的详细比较:
小小工匠
2023/11/25
1.8K0
Maven - 打包之争:Jar vs. Shade vs. Assembly
【极数系列】Flink搭建入门项目Demo & 秒懂Flink开发运行原理(05)
gitee地址:https://gitee.com/shawsongyue/aurora.git 源码直接下载可运行,模块:aurora_flink Flink 版本:1.18.0 Jdk 版本:11
夏之以寒
2024/03/04
7040
【极数系列】Flink搭建入门项目Demo & 秒懂Flink开发运行原理(05)
JMH的简单应用
jmh是个java的压测工具,感觉工具看说明书就行,如果有过压测经验,很容易使用。
李子健
2023/08/01
3390
spring-boot-starter大力出奇迹
​  上篇文章我们已经聊了SpringBoot的启动过程中的各类扩展点,那么从http://start.spring.io上我们生成的demo项目中,到目前就剩下了maven工程的pom.xml还没有进行探索了,那么本文我们就来看看这里面到底都有啥,把大力出奇迹的常见spring-boot-starter来聊一聊,以便更好地使用SpringBoot.
阿豪聊干货
2018/08/09
1K0
HBase使用JavaAPI连接出现java.io.IOException: java.lang.reflect.InvocationTargetException异常解决
今天在使用JavaAPI连接HBase,运行时出现了这个异常。 zjava.io.IOException: java.lang.reflect.InvocationTargetException
大数据梦想家
2021/01/26
2.1K0
HBase使用JavaAPI连接出现java.io.IOException: java.lang.reflect.InvocationTargetException异常解决
Maven 菜鸟教程 5 常用插件配置
其中${project.build.directory}是maven变量,表示target目录。如果不写的话,将在根目录下创建lib目录。 excludeTransitive,表示是否不包含间接依赖的包; stripVersion表示复制的jar文件去掉版本信息 执行mvn dependency:copy-dependencies 所有依赖的jar将提取到lib目录
全栈程序员站长
2022/10/04
5500
SpringBoot入门系列(三十一) 实现静态文件、配置文件与jar分离
前面我们介绍了Spring Boot项目的打包、发布和部署。不了解的可以看前面的文章《SpringBoot入门系列(三十)Spring Boot项目打包、发布与部署》。
章为忠学架构
2021/08/18
1.7K0
Maven 菜鸟教程 3 怎样启动web项目
下载地址http://www.eclipsetotale.com/tomcatPlugin.html – tomcatPluginV331.zip http://www.eclipsetotale.com/tomcatPlugin/tomcatPluginV331.zip – 解压缩之后,只有一个jar文件 把此jar文件放入eclipse根目录plugin
全栈程序员站长
2022/10/04
1K0
Maven 菜鸟教程 3 怎样启动web项目
hive自定义函数之UDF代码
文章目录 创建maven项目,导入jar包 创建一个java类继承UDF,并重载evaluate方法 将项目打包,上传到集群上 在hive里添加jar包 设置函数与自定义函数关联 使用自定义函数 创建maven项目,导入jar包 <repositories> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-rep
用户4870038
2021/02/05
6870
hive自定义函数之UDF代码
spark读写HBase之使用hortonworks的开源框架shc(一):源码编译以及测试工程创建
以下是我修改后的两个子模块core和examples中的pom文件,只修改了version
CoderJed
2018/09/13
1.3K0
spark读写HBase之使用hortonworks的开源框架shc(一):源码编译以及测试工程创建
Dubbo服务治理篇——你知道如何将Dubbo服务打包成Jar文件吗?这篇文章帮你搞定!!
1、使用Servlet容器运行(Tomcat、Jetty等)----不可取 缺点:增加复杂性(端口、管理)
冰河
2020/10/29
1.6K0
Maven 打包成 zip
<build> <finalName>打出来的包名</finalName> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <cl
林万程
2021/01/27
2.1K0
推荐阅读
相关推荐
SpringBoot Jar包瘦身 - 跟大文件说再见!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验