使用spring-boot 中遇到的一个小坑

在使用Spring Boot进行项目开发时,遇到了一个诡异的问题:在使用spring-boot-maven-plugin启动应用时,target/目录下的配置文件及Velocity模板文件会消失。本文通过查阅官方文档找到了解决方案。

             最近在用spring-boot 做的项目中遇到的小坑,我感觉挺诡异的,

在spring-boot-maven-plugin   spring-boot:run 启动应用的是否发现 target/目录下的配置文件 和velocity 模版文件都无辜消失了,这可好怎么办临时修改配置都没有办法!
           于是开始翻看官方文档  http://docs.spring.io/spring-boot/docs/  大家根据自己的版本找吧
    在找到插件的描述文档看到了如下属性


 看到描述就明白了,设置false  ,手工搞定

<think>我们有两个问题需要解决: 1. jar包运行时出现`java.lang.ClassNotFoundException: com.example.App`错误 2. Maven deploy时`spring-boot-maven-plugin:3.2.1:repackage`目标执行失败(无法重命名jar文件) 首先,我们分别分析这两个问题: **问题1:ClassNotFoundException** 这个错误通常发生在运行时,JVM找不到指定的类。可能的原因包括: - 主类在JAR包中不存在(打包配置问题) - MANIFEST.MF文件中指定的主类不正确 - 类路径(classpath)设置错误 - 依赖缺失(但这里是主类,所以更可能是打包问题) **问题2:Maven deploy时repackage失败(无法重命名jar文件)** 在使用Spring Boot Maven Plugin的repackage目标时,它会将原始jar文件重命名为`*.jar.original`,然后生成一个可执行的jar文件(包含所有依赖)。如果重命名失败,可能是由于文件被占用、权限不足路径问题。 我们结合这两个问题,考虑可能是同一个项目中的两个相关错误。通常,Spring Boot项目使用`spring-boot-maven-plugin`来打包,它会生成一个可执行的jar。如果插件配置执行过程中出现问题,可能导致两个错误。 解决方案: ### 一、解决ClassNotFoundException #### 1.1 检查主类配置 确保在`pom.xml`中正确配置了主类: ```xml <properties> <start-class>com.example.App</start-class> </properties> ``` 者,在插件配置中指定: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.1</version> <configuration> <mainClass>com.example.App</mainClass> </configuration> </plugin> ``` 注意:如果使用Spring Boot,通常主类是一个带有`@SpringBootApplication`注解的类。 #### 1.2 检查打包结果 解压生成的jar包(使用`jar tf`命令)检查主类是否在正确的位置: ```bash jar tf your-application.jar | grep "com/example/App.class" ``` 如果不存在,则可能是编译过程有问题,检查编译输出目录(`target/classes`)中是否有该类。 #### 1.3 检查包名和类名 确认主类的包名和类名与配置一致,注意大小写。 ### 二、解决repackage失败(无法重命名jar文件) #### 2.1 检查文件占用 在Maven执行过程中,确保没有其他程序(如IDE)占用`target`目录下的文件。关闭可能占用该文件的程序,然后重试。 #### 2.2 清理target目录 尝试清理target目录,然后重新打包: ```bash mvn clean package ``` #### 2.3 调整插件配置 在`spring-boot-maven-plugin`配置中添加`<skip>`属性(临时排除问题): ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.1</version> <configuration> <skip>true</skip> <!-- 跳过repackage,仅用于测试 --> </configuration> </plugin> ``` 如果跳过repackage后deploy成功,则说明问题确实在repackage阶段。但这样打包的jar是不可执行的(没有包含依赖),所以不能作为最终解决方案。 #### 2.4 更改输出目录 尝试更改构建输出目录(避免与原有文件冲突): ```xml <build> <outputDirectory>${project.build.directory}/custom</outputDirectory> <!-- 其他配置 --> </build> ``` #### 2.5 禁用其他插件干扰 检查是否有其他Maven插件(如maven-jar-plugin)也在操作jar文件,尝试暂时禁用。 #### 2.6 升级降级插件版本 尝试升级降级`spring-boot-maven-plugin`的版本,例如使用最新版本: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.2</version> <!-- 最新版本 --> </plugin> ``` ### 三、综合解决方案 由于两个问题可能相互关联,我们按照以下步骤操作: 1. **清理和重新构建**:首先清理项目并重新编译。 ```bash mvn clean install ``` 2. **检查主类配置**:确保`spring-boot-maven-plugin`中配置了正确的主类。 3. **排查文件锁定**:在Windows系统中,使用资源监视器查看哪个进程锁定了jar文件;在Linux/Mac中,使用`lsof`命令。 4. **调整构建顺序**:如果项目是多模块项目,确保父模块正确配置了插件管理。 5. **分离打包和部署**:先执行`mvn package`确保打包成功,再执行`mvn deploy`进行部署。 6. **查看详细错误日志**:在Maven命令中添加`-X`参数,查看详细的错误信息: ```bash mvn -X deploy ``` 7. **权限问题**:确保运行Maven的用户对`target`目录有读写权限。 8. **使用不同的文件名**:在`pom.xml`中配置最终生成的jar文件名,避免与原始文件冲突: ```xml <build> <finalName>myapp</finalName> <!-- 其他配置 --> </build> ``` 9. **跳过测试**:在部署时跳过测试,减少构建时间并避免测试阶段的问题: ```bash mvn deploy -DskipTests ``` ### 四、示例配置 一个典型的Spring Boot应用的`pom.xml`配置如下: ```xml <project> <!-- ... --> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <properties> <java.version>17</java.version> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>3.2.1</version> </dependency> <!-- 其他依赖 --> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.1</version> <configuration> <mainClass>com.example.App</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> ``` 请根据实际情况调整。 如果上述方法仍不能解决问题,请提供详细的错误日志,以便进一步分析。 §§相关问题§§ 1. 如何解决Maven构建中出现的“Permission denied”错误? 2. Spring Boot应用打包后如何查看其包含的类路径? 3. 如何配置Maven多模块项目的父POM? 4. 如何解决Windows系统下文件被占用导致的构建失败? </think>### 解决两个核心问题:ClassNotFoundException + Maven部署失败 #### 一、解决`ClassNotFoundException: com.example.App`问题 此错误表明JVM在运行时找不到主类,通常由打包结构错误引起: 1. **验证主类存在性** 检查JAR包内类文件路径: ```bash jar tf your-app.jar | grep "com/example/App.class" # 应输出类似:BOOT-INF/classes/com/example/App.class ``` 若无输出,说明编译未包含主类 2. **修复Spring Boot插件配置** 在`pom.xml`中添加主类声明: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.1</version> <configuration> <mainClass>com.example.App</mainClass> <!-- 必须配置 --> </configuration> <executions> <execution> <goals> <goal>repackage</goal> <!-- 确保repackage目标存在 --> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 3. **检查源码包结构** 确认物理路径匹配: ``` src/main/java └── com/example/App.java # 包路径必须一致 ``` 4. **验证编译输出** 检查`target/classes`目录是否存在`com/example/App.class`文件 #### 二、解决`repackage`目标执行失败(文件重命名错误) 此错误通常由文件锁定路径冲突导致: 1. **解除文件锁定(Windows特例)** 关闭可能占用文件的进程: ```powershell # PowerShell查找占用进程 Get-Process -Name "java*" | Stop-Process -Force ``` 2. **清理构建残留** 删除整个`target`目录后重建: ```bash mvn clean package -DskipTests ``` 3. **调整文件名策略** 在`pom.xml`中配置唯一文件名: ```xml <build> <finalName>${project.artifactId}-${timestamp}</finalName> </build> ``` 4. **关闭并行构建(Maven 3+)** 在命令中添加: ```bash mvn -T 1 clean deploy # 强制单线程构建 ``` 5. **检查存储权限** 确保Maven仓库目录可写: ```bash # Linux/Mac chmod -R u+rw ~/.m2/repository # Windows icacls "%USERPROFILE%\.m2\repository" /grant Everyone:(OI)(CI)F ``` #### 三、完整解决方案流程 ```mermaid graph TD A[开始] --> B[检查主类路径] B --> C{主类是否存在?} C -->|否| D[修复pom.xml配置] C -->|是| E[检查文件锁定] E --> F{文件被占用?} F -->|是| G[结束占用进程] F -->|否| H[配置唯一文件名] H --> I[单线程构建] I --> J[验证部署] ``` 执行验证命令: ```bash # 打包验证 mvn clean package # 检查主类 unzip -l target/*.jar | grep App.class # 运行测试 java -jar target/your-app.jar # 部署到Nexus mvn deploy -T 1 -DskipTests ``` > **避指南**: > 1. Windows系统需关闭防病毒实时扫描[^1] > 2. 多模块项目需在主POM中声明`spring-boot-maven-plugin` > 3. JDK版本需与Spring Boot 3.2+兼容(推荐JDK 17+)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值