执行Maven Install时出现ClassLoader.defineClass访问性错误
问题解决:Spring Boot maven install时CGLIB反射访问错误
核心问题
Spring Boot 2.7.7 + Java 17开发的登录系统,Eclipse直接运行正常,但执行mvn install时测试阶段抛出InaccessibleObjectException,提示module java.base does not "opens java.lang" to unnamed module。
解决方案
1. 配置Maven Surefire插件添加JVM参数
在pom.xml的<build><plugins>节点中添加Surefire插件配置,开放模块化系统的反射访问权限:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine> --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED </argLine> </configuration> </plugin>
Java 9+的模块化系统默认限制核心模块内部API的反射访问,Spring的CGLIB生成代理类时需要访问这些API,通过--add-opens参数可开放指定包给未命名模块(传统类路径依赖)。
2. 临时跳过测试(不推荐)
若仅需快速完成打包,可执行以下命令跳过测试阶段:
mvn install -DskipTests
注意:此方法会跳过所有测试用例,不建议在正式开发流程中使用。
3. 优化依赖管理
移除tomcat-jasper的手动版本指定,让Spring Boot parent自动管理依赖版本,避免版本兼容性问题:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> </dependency>
原因分析
Eclipse直接运行时,内置测试执行器可能自动添加了适配Java模块化的JVM参数;而Maven Surefire插件默认未添加这些参数,导致测试阶段Spring无法通过CGLIB生成代理类,触发访问权限错误。
原始问题信息
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.7</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>java-login-security</groupId> <artifactId>login-system</artifactId> <version>0.0.1-SNAPSHOT</version> <name>login-system</name> <description>login system</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>9.0.70</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
错误日志片段
. ____ _ __ _ _ /\/ ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.7) 2023-01-14 12:19:00.834 INFO 2373 --- [ main] j.l.LoginSystemApplicationTests : Starting LoginSystemApplicationTests using Java 17.0.4.1 on dna with PID 2373 (started by dna in /media/dna/data/koding/java/login-system) 2023-01-14 12:19:00.835 INFO 2373 --- [ main] j.l.LoginSystemApplicationTests : No active profile set, falling back to 1 default profile: "default" 2023-01-14 12:19:01.333 INFO 2373 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2023-01-14 12:19:01.380 INFO 2373 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 41 ms. Found 1 JPA repository interfaces. 2023-01-14 12:19:01.530 ERROR 2373 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InaccessibleObjectException-->Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @78dd667e at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:598) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363) ~[spring-core-5.3.24.jar:5.3.24] // ...more error log here...
Java版本信息
dna@dna:/$ java -version openjdk version "17.0.5" 2022-10-18 OpenJDK Runtime Environment (build 17.0.5+8-Ubuntu-2ubuntu122.04) OpenJDK 64-Bit Server VM (build 17.0.5+8-Ubuntu-2ubuntu122.04, mixed mode, sharing)
内容的提问来源于stack exchange,提问作者dhanyn10
相关产品推荐
相关产品推荐

