Spring 3下替代spring-boot-cli的spring jar -cp命令方案咨询
替代Spring Boot CLI
spring jar命令的可行方案 针对Spring 3.3.3移除spring jar命令后的需求,结合Docker环境、/lib目录依赖、离线Maven及快速迭代Groovy代码的目标,提供以下三种实用方案:
方案一:直接运行Groovy代码(最快迭代)
无需提前打包,修改Groovy文件后直接重启命令即可,完全适配快速迭代需求:
- 设置类路径:将/lib下所有依赖Jar、当前目录(存放Groovy文件和application.yml)加入类路径
- 启动命令:利用Groovy直接运行Spring Boot主类
示例bash启动脚本
#!/bin/bash # 拼接类路径:/lib下所有jar + 当前目录 CLASSPATH=$(find /lib -name "*.jar" | tr '\n' ':'):. # 运行Groovy主类(TestMain为你的Spring Boot主类,需带@SpringBootApplication注解) groovy -cp "$CLASSPATH" TestMain.groovy
说明
- 修改Groovy文件或application.yml后,直接终止进程再重新执行脚本即可
- 若Groovy版本与依赖兼容,无需额外配置,容器内已安装Groovy即可运行
方案二:用离线Maven + Spring Boot插件快速构建
利用容器内的离线Maven,通过极简pom.xml快速构建可运行Jar,兼顾打包和快速迭代:
- 创建极简pom.xml(放在Groovy文件同目录):
<?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>3.3.3</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>groovy-app</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <groovy.version>4.0.15</groovy.version> </properties> <dependencies> <!-- 引入/lib目录的本地依赖 --> <dependency> <groupId>com.example</groupId> <artifactId>test-config</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>/lib/test-config.jar</systemPath> </dependency> <!-- Spring Boot基础依赖(离线Maven需已缓存) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> </dependency> </dependencies> <build> <sourceDirectory>./</sourceDirectory> <!-- 指定Groovy文件所在目录 --> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>TestMain</mainClass> <!-- 指定主类 --> </configuration> </plugin> <plugin> <groupId>org.codehaus.gmavenplus</groupId> <artifactId>gmavenplus-plugin</artifactId> <version>1.13.1</version> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
- 构建/启动命令:
# 直接启动应用(修改Groovy后重新执行即可) mvn spring-boot:run -Dmaven.repo.local=/path/to/offline/repo # 或打包成可运行Jar mvn package -Dmaven.repo.local=/path/to/offline/repo java -jar target/groovy-app-0.0.1-SNAPSHOT.jar
说明
- 离线Maven需提前缓存好Spring Boot及Groovy相关依赖
sourceDirectory指定为当前目录,无需按标准Maven目录结构存放Groovy文件
方案三:手动模拟spring jar打包逻辑
完全复刻原spring jar的打包流程,手动构建Spring Boot可运行Jar结构:
- 创建临时目录结构:
mkdir -p temp/BOOT-INF/lib temp/BOOT-INF/classes temp/META-INF
- 复制依赖与代码:
# 复制/lib下所有Jar到BOOT-INF/lib cp /lib/*.jar temp/BOOT-INF/lib/ # 复制Groovy文件和application.yml到BOOT-INF/classes cp *.groovy application.yml temp/BOOT-INF/classes/
- 创建META-INF/MANIFEST.MF:
Manifest-Version: 1.0 Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: TestMain Spring-Boot-Version: 3.3.3
将上述内容保存到temp/META-INF/MANIFEST.MF
- 打包成可运行Jar:
# 进入temp目录打包 cd temp jar cvfm ../app.jar META-INF/MANIFEST.MF . cd ..
- 启动应用:
java -jar app.jar
说明
- 需确保
org.springframework.boot.loader.JarLauncher所在的Jar(spring-boot-loader)已在/lib目录中 - 修改Groovy文件后,重复步骤2-4重新打包即可
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

