springboot项目打包后运行出现问题解决办法

本文介绍了解决log4j-over-slf4j与slf4j-log44j12冲突的方法,并提供了一个实际案例,通过排除依赖解决了Spring Boot应用中的死循环问题。

1

Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError


原因:log4j-over-slf4j.jar 和 slf4j-log4j12.jar不能同时引入,造成死循环

解决:删除pom里面的slf4j-log4j12依赖,仍然没有解决问题。这里主要是因为spring-boot-starter-logging里面引入了log4j-over-slf4j依赖,在webmagic里面又引入了slf4j-log4j12依赖。所以只能去除webmagic中的slf4j-log4j12依赖。

<!-- webmagic框架支持  -->
        <dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-core</artifactId>
    <version>0.5.2</version>
    <exclusions>  
            <exclusion>  
            <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>  
            </exclusion>  

        </exclusions>  
   
</dependency>
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-extension</artifactId>
    <version>0.5.2</version>
</dependency>
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>


用exclusion去除依赖中的其他依赖




2 could not initialize class

原因:我在jdbcUtil.class里面有一段静态代码,类初始化的时候会加载这端代码,这段代码主要是读取resource下的properties文件。虽然开发运行的时候是可以运行的。但是打包后文件路径发生改变,导致无法读取文件,也就无法初始化这个类。
解决办法:InputStream in = jdbcUtil.class.getResourceAsStream("/application.properties");
用这种方法去读取文件。





### Spring Boot 中 JAR 和 WAR 包的区别及适用场景 #### 1. 基础概念对比 JAR 文件是一种标准的 Java 归档文件格式,通常用于封装独立运行的应用程序。而 WAR(Web Application Archive)文件则专门设计用来部署 Web 应用到传统的 Servlet 容器中,比如 Tomcat 或 Jetty[^1]。 #### 2. 打包方式的不同 当将 Spring Boot 项目打包JAR 文件时,默认情况下会嵌入一个轻量级的服务器(如内置的 Tomcat),这使得该应用可以作为独立进程直接运行。相比之下,WAR 文件并不自带任何服务器组件,它依赖外部的 Servlet 容器来加载并执行其中的内容[^2]。 #### 3. 启动机制差异 对于基于 JAR 的 Spring Boot 应用而言,在命令行下只需简单地输入 `java -jar your-application.jar` 即可完成启动操作。然而如果采用的是 WAR 格式的分发,则需要先将其放置于目标 Servlet 容器内的指定目录之后再由后者负责初始化整个流程[^4]。 #### 4. 结构上的区别 从内部结构上看,WAR 文件除了包含 class 文件外还会额外增加 WEB-INF/lib 目录存储第三方库以及 META-INF/MANIFEST.MF 记录元数据信息等内容;与此同时,所有的前端资源也会被保留下来以便能够正常访问页面等功能模块。相反地,JAR 类型仅保存必要的字节码及相关配置项即可满足需求。 #### 5. 性能考量与维护成本分析 由于 JAR 方案无需考虑兼容性问题并且更容易实现自动化运维管理(例如借助 Docker 进行容器化),所以在现代微服务架构体系当中更受青睐。不过需要注意的一点是,尽管如此仍然存在某些特殊场合可能更适合选用 WAR 模式——特别是那些已经长期稳定运作的传统 IT 系统环境中[^3]。 综上所述,Spring Boot 提供了灵活多样的发布选项让用户可以根据实际业务特点做出明智决策: - 如果追求高效便捷且倾向于利用最新技术趋势构建现代化解决方案的话,那么毫无疑问应该优先选择 JAR; - 而针对一些受限于历史遗留因素或者特定法规约束无法轻易改变现有基础设施布局的情况来说,WAR 则不失为一种折衷办法. ```bash # 启动 JAR 包的方式 java -jar my-spring-boot-app.jar # 将 WAR 包放到 Tomcat webapps 下自动解压部署 cp my-spring-boot-app.war /path/to/tomcat/webapps/ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值