SpringBoot Fat Jar解压运行

本文介绍如何在没有开发环境的情况下修改SpringBoot打成的Fatjar中的内容,并使其仍能正常运行。首先使用WinRAR或7z解压,然后通过直接调用JarLauncher类来启动。文中还提到了可能遇到的问题及解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       SpringBoot已经成为当前最流行的微服务开发框架之一,整个应用资源通过打成一个jar(Fat jar),大大降低了部署的复杂性。

 

       有些时候,我们在没有开发环境的情况下(甚至源代码已丢失),我们需要更改一些资源(比如 class),却是一个难题。因为,SpringBoot的jar包不是常规的jar文件,其中包含着一些自启动的shell脚本,用jar进行重新打包是会破解这种jar结构的。那有没有办法,实现更改其中内容后还能正常运行呢?

 

      其中,SpringBoot jar的入口是 org.springframework.boot.loader.JarLauncher,我们可以简单地用WinRAR或7z等工具,把SpringBoot jar解压,然后用命令:

java org.springframework.boot.loader.JarLauncher

来运行。

当然,这只是第一步,在运行过程中可能会遇到其他的一些问题,例如:

Unable to start embedded Tomcat 

之类的,遇到问题就去网上搜一下,一个个问题来解决。最后一般是能改造成功的。

 

<think>我们正在处理的问题是:在Spring Boot项目中以JAR方式启动后,如何访问前端页面? 根据引用内容,我们知道Spring Boot打包成JAR后,如果前端页面放在传统的webapp目录下,可能无法被打包进去,导致访问不到。 引用[2]明确指出:如果只是打jar包,打包不了webapp目录下的资源,所以运行jar包访问不到页面。 引用[4]也提到:在IDE中运行正常的代码,在打成JAR后却引发异常,如FileNotFoundException。 解决方案: 1. 将前端页面(HTML、CSS、JS等)放在Spring Boot默认的静态资源目录下,例如: - `src/main/resources/static` - `src/main/resources/public` - `src/main/resources/resources` - `src/main/resources/META-INF/resources` 2. 确保在构建时,这些资源被包含进JAR包。Spring Boot的Maven插件默认会将这些资源打包。 3. 如果之前使用了webapp目录,需要将资源移动到上述目录之一(例如static)中。 4. 构建JAR包并运行。 5. 访问页面:启动JAR后,可以通过浏览器访问,例如:http://localhost:8080/你的页面文件名.html 注意:如果使用了模板引擎(如Thymeleaf),则HTML文件应放在`src/main/resources/templates`下,并通过控制器返回视图名称。 引用[2]中还提供了一个Maven插件配置的示例,但请注意,这个配置是用于重新打包的,确保使用了`spring-boot-maven-plugin`插件,这样打出的JAR才是可执行的,并且会包含资源。 如果按照上述步骤操作后仍然无法访问,请检查: - 资源是否真的被包含在JAR包中?可以通过解压JAR包查看。 - 路径是否正确?注意静态资源的访问路径是相对于根路径的。 另外,引用[3]提到Spring Boot的fat jar特殊结构(BOOT-INF/lib和BOOT-INF/classes),资源文件会被放在BOOT-INF/classes下的对应目录中。 因此,具体步骤为: 步骤1:将前端页面文件移动到src/main/resources/static目录(例如index.html) 步骤2:使用Maven打包(确保有spring-boot-maven-plugin插件) 步骤3:运行JARjava -jar your-project.jar 步骤4:访问http://localhost:8080/index.html 如果希望访问根路径就显示index.html,可以创建一个简单的控制器来重定向,或者确保index.html在静态资源目录下(Spring Boot默认会寻找index.html作为欢迎页)。 如果问题仍然存在,请参考引用[4]中提到的资源访问方式:在JAR中,不能使用传统的File API来访问资源,而应该使用ClassLoader的getResource或getResourceAsStream方法。但如果是静态资源,Spring Boot已经处理了,我们只需要放在上述目录即可。 生成相关问题: 1. Spring Boot默认的静态资源目录有哪些? 2. 如何在Spring Boot中配置自定义的静态资源路径? 3. Spring Boot项目打包成JAR后,如何验证资源文件是否被打包进去? 4. 为什么在JAR包中不能使用File API访问资源文件? 5. 如何通过控制器返回静态页面?</think>在 Spring Boot 项目中以 JAR 方式启动后访问前端页面,需遵循以下关键步骤: ### 解决方案步骤 1. **正确放置前端资源** - 将 HTML/CSS/JS 等前端文件放入标准静态资源目录: ```plaintext src/main/resources/static # 推荐位置(如 index.html) src/main/resources/public src/main/resources/META-INF/resources ``` - ✘ 避免使用 `webapp` 目录(JAR 打包会忽略它)[^2][^4] 2. **配置 Maven 打包插件** 在 `pom.xml` 中确保包含 Spring Boot Maven 插件: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> <!-- 关键:包含静态资源 --> </goals> </execution> </executions> </plugin> </plugins> </build> ``` [^2][^4] 3. **验证资源打包** - 构建 JAR 后检查内容: ```bash jar tf your-app.jar | grep static/ ``` - 应输出类似: ```plaintext BOOT-INF/classes/static/index.html BOOT-INF/classes/static/css/style.css ``` [^3][^4] 4. **访问页面** - 启动 JAR:`java -jar your-app.jar` - 浏览器访问(根据文件位置): - `http://localhost:8080/index.html` - `http://localhost:8080/css/style.css` ### 常见问题排查 - **404 错误**: → 检查资源是否在 `static/public` 目录 → 确认打包后 JAR 内存在资源文件 → 清除浏览器缓存后重试[^2][^4] - **资源加载失败**: 使用相对路径引用资源(避免绝对路径): ```html <!-- 正确 --> <script src="/js/app.js"></script> <!-- 错误 --> <script src="C:/project/js/app.js"></script> ``` ### 原理说明 Spring Boot 的可执行 JAR 使用特殊类加载器(`LaunchedURLClassLoader`)加载嵌套在 `BOOT-INF/classes/` 和 `BOOT-INF/lib/` 中的资源。静态资源需位于 classpath 标准路径下才能被识别[^3][^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值