SpringBoot应用打包求助:自动生成含新JAR的二进制文件
SpringBoot自动打包并生成可执行启动脚本解决方案
方法一:改造start.sh自动匹配JAR
直接修改启动脚本,让它自动识别当前目录下的SpringBoot可执行JAR(排除Maven生成的原始JAR):
#!/bin/bash # 自动查找当前目录下的SpringBoot JAR文件 APP_JAR=$(ls -1 *.jar | grep -v "original-" | head -n 1) if [ -z "$APP_JAR" ]; then echo "Error: 未找到SpringBoot JAR文件" exit 1 fi # 启动应用 java -jar "$APP_JAR" "$@"
后续每次打包后,脚本会自动定位最新生成的JAR,无需手动修改路径。
方法二:Maven插件自动生成可执行JAR/启动脚本
方案1:生成自带启动逻辑的可执行JAR
无需额外脚本,直接让SpringBoot JAR具备可执行性:
- 在
pom.xml中配置插件:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin> </plugins> </build>
- 执行打包命令:
mvn clean package - 直接运行生成的JAR:
./your-app.jar
方案2:动态生成带正确JAR路径的start.sh
通过Maven资源插件在打包时替换脚本中的JAR名称:
- 新建
src/main/resources/start.sh.template文件:
#!/bin/bash java -jar @project.build.finalName@.jar "$@"
- 在
pom.xml中添加资源插件配置:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>start.sh.template</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>copy-resources</id> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}</outputDirectory> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>start.sh.template</include> </includes> </resource> </resources> <delimiters> <delimiter>@</delimiter> </delimiters> </configuration> </execution> </executions> </plugin> </plugins> </build>
打包后,target目录下会生成替换好JAR名称的start.sh,直接赋予执行权限即可使用。
方法三:Gradle用户适配方案
方案1:生成可执行JAR
在build.gradle中配置:
plugins { id 'org.springframework.boot' version '3.x.x' id 'java' } springBoot { executable = true }
执行./gradlew bootJar,生成的JAR直接通过./build/libs/your-app.jar启动。
方案2:自动生成启动脚本
添加Gradle任务实现动态生成:
task generateStartScript { doLast { def jarName = "${project.name}-${project.version}.jar" def scriptContent = """#!/bin/bash java -jar $jarName "\$@" """ def scriptFile = file("build/libs/start.sh") scriptFile.text = scriptContent scriptFile.setExecutable(true) } } bootJar.finalizedBy(generateStartScript)
执行打包命令后,build/libs目录会自动生成带正确JAR路径的启动脚本。
内容的提问来源于stack exchange,提问作者Rahul Gangawar
相关产品推荐
相关产品推荐

