Log4j2依赖输入验证错误及Docker构建失败等问题咨询
问题解决:Docker构建失败+调试模式与版本查看
一、Docker构建错误(Unable to find main class)
问题分析
- Maven命令冗余:
mvn clean package已经集成了spring-boot:repackage的功能,单独指定会触发重复执行逻辑,引发主类识别异常 - 主类配置缺失:Spring Boot项目需明确指定主类(带
@SpringBootApplication注解的类),否则Maven无法自动识别 - 缓存利用不足:当前Dockerfile未按分层构建原则复制文件,会导致每次源码变更都重新下载依赖,降低构建效率
修正方案
1. 调整Maven构建命令
将原构建命令改为:
RUN mvn clean package -DskipTests
-DskipTests可跳过测试环节,加快构建速度(按需选择)
2. 补全pom.xml主类配置
在spring-boot-maven-plugin节点中添加主类全路径:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.6.1</version> <configuration> <mainClass>com.yourpackage.Log4jexampleApplication</mainClass> <!-- 替换为实际主类全路径 --> </configuration> </plugin>
3. 优化后的Dockerfile
FROM maven:3.8.3-openjdk-8-slim WORKDIR /app # 先复制Maven配置文件,利用Docker缓存 COPY pom.xml . COPY mvnw . COPY mvnw.cmd . COPY .mvn .mvn # 预下载依赖(缓存步骤,避免重复下载) RUN mvn dependency:go-offline # 复制源码文件 COPY src ./src # 构建项目 RUN mvn clean package -DskipTests WORKDIR /app/target EXPOSE 8080 CMD ["java", "-jar", "../log4jexample-0.0.1-SNAPSHOT.jar"]
二、开启调试模式与版本查看
1. 开启调试获取栈追踪
修改Dockerfile的启动命令,添加JVM调试参数:
CMD ["java", "-Xdebug", "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar", "../log4jexample-0.0.1-SNAPSHOT.jar"]
启动容器时映射调试端口:
docker run -p 8080:8080 -p 5005:5005 your-image-name
使用IDE连接容器的5005端口,即可断点调试并获取栈追踪信息。若需在日志中打印异常栈,可在代码中捕获异常时调用e.printStackTrace(),或调整Log4j配置将日志级别设为DEBUG。
2. 查看相关版本
- Java版本:进入容器执行
java -version,或在Dockerfile中添加RUN java -version查看构建环境版本 - Spring Boot版本:查看pom.xml中
spring-boot-starter-parent的版本,或运行jar包时执行java -jar your-app.jar --version - Log4j版本:查看pom.xml中
log4j-core/log4j-api依赖的版本,或进入容器后执行mvn dependency:tree | grep log4j
内容的提问来源于stack exchange,提问作者cokachi
相关产品推荐
相关产品推荐

