自定义Spring Boot Loader技术咨询:编译卡顿、代码生效与类定制
自定义Spring Boot Loader的常见问题解决方案
我之前折腾自定义Spring Boot Loader时,刚好遇到过类似的问题,给你梳理下具体的解决思路:
1. 编译Spring Boot卡在verify.groovy脚本环节
这个问题大多和集成测试(IT)脚本的执行有关,我当时踩过几个坑,你可以逐个排查:
- 跳过集成测试快速编译:如果只是想先拿到可编译的Spring Boot Loader模块,不需要跑所有测试的话,直接用命令跳过测试:
其中mvn clean install -DskipTests -Dmaven.install.skip=false-DskipTests会跳过单元测试和集成测试,能快速完成编译安装。 - 检查系统资源:
verify.groovy这类集成测试脚本可能需要较多内存,你可以给Maven分配更多内存,在执行命令前设置环境变量:export MAVEN_OPTS="-Xmx2048m -XX:MaxPermSize=512m" - 单独编译loader模块:如果只想编译
spring-boot-loader模块,不用整个Spring Boot项目,进入模块目录后执行:cd spring-boot-tools/spring-boot-loader mvn clean install -DskipTests - 权限问题:如果是Linux/macOS系统,可能脚本没有执行权限,你可以手动给
verify.groovy加执行权限:chmod +x xxx/spring-boot/spring-boot-tools/spring-boot-loader/target/it/executable-props/verify.groovy
2. 如何让新增的代码生效
修改Spring Boot Loader的代码后,要确保你的项目能用到修改后的版本,核心是让本地编译的jar优先被使用:
- 安装到本地Maven仓库:修改完代码后,在
spring-boot-loader模块执行mvn clean install,把自定义版本的jar安装到本地仓库。 - 锁定依赖版本:在你自己的Spring Boot项目的
pom.xml中,指定Spring Boot的版本为你本地编译的版本号(比如如果官方版本是2.7.10,你可以改成2.7.10-SNAPSHOT,确保和你编译的版本一致),这样Maven会优先从本地仓库拉取你修改后的jar。 - 本地依赖调试(可选):如果不想每次修改都install到仓库,可以直接在项目中添加本地jar依赖,比如:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-loader</artifactId> <version>2.7.10-SNAPSHOT</version> <scope>system</scope> <systemPath>/path/to/your/custom/spring-boot-loader.jar</systemPath> </dependency>
3. 自定义LaunchedURLClassLoader.java并使其生效
LaunchedURLClassLoader是Spring Boot启动时的核心类加载器,自定义它的步骤如下:
- 修改源码:找到
spring-boot-loader模块中的org.springframework.boot.loader.LaunchedURLClassLoader类,添加你的自定义逻辑(比如重写loadClass方法添加自定义类加载规则,或者在构造方法中加入自定义资源路径)。 - 编译并安装模块:按照前面的方法编译
spring-boot-loader模块并安装到本地仓库。 - 确保打包时使用自定义Loader:在你的Spring Boot项目的
pom.xml中,配置spring-boot-maven-plugin时,不需要额外指定主类(因为Launcher会自动调用LaunchedURLClassLoader),只要确保依赖的是你修改后的spring-boot-loader版本即可。- 如果你是自定义了继承
LaunchedURLClassLoader的新类,那需要修改Launcher相关类(比如JarLauncher),把原来的LaunchedURLClassLoader替换成你的自定义类,然后编译整个spring-boot-loader模块,再打包自己的项目。
- 如果你是自定义了继承
- 验证生效:打包你的Spring Boot项目后,解压jar包,查看
BOOT-INF/lib下的spring-boot-loader.jar是否是你修改后的版本,或者通过打印类加载器的信息来验证:
运行项目后如果输出你的自定义类加载器名称,就说明生效了。System.out.println(getClass().getClassLoader().getClass().getName());
内容的提问来源于stack exchange,提问作者jia liu
相关产品推荐
相关产品推荐

