Maven项目打包含Log4j2依赖的Jar后运行报错的解决咨询
Maven项目打包含Log4j2依赖的Jar后运行报错的解决咨询
看起来你接连遇到了Maven打包清单配置问题和日志依赖冲突的问题,我来一步步帮你梳理解决思路和修改方案:
一、先清理重复的Maven打包插件配置
你当前的pom里重复配置了两次maven-shade-plugin,这会导致打包流程混乱,冗余配置也容易引发未知问题。我们只需要保留一个整合了主类指定、依赖合并和签名文件过滤的shade插件配置即可(shade插件可以同时帮你把依赖打包进Jar,并设置主清单属性,不需要额外单独配置maven-jar-plugin,用shade更省心)。
二、解决致命的日志依赖冲突
你的依赖里同时存在slf4j-nop、slf4j-log4j12和log4j-core,这三个是完全冲突的:
slf4j-nop是让SLF4J禁用所有日志输出slf4j-log4j12是把SLF4J日志桥接到Log4j 1.xlog4j-core是Log4j 2.x的核心实现
这三个同时存在会让SLF4J无法确定使用哪个日志绑定,进而导致Log4j2初始化失败,也就是你看到的java.lang.UnsupportedOperationException: No class provided, and an appropriate one cannot be found错误。
因为matheclipse-core依赖的是Log4j2,所以我们需要:
- 移除
slf4j-nop和slf4j-log4j12 - 添加适配Log4j2的SLF4J绑定
slf4j-log4j2 - 可选:给
matheclipse-core添加依赖排除,避免它传递进来的冲突日志依赖
修改后的完整pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.calculator</groupId> <artifactId>GraphingCalculator</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>23</maven.compiler.source> <maven.compiler.target>23</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.matheclipse</groupId> <artifactId>matheclipse-core</artifactId> <version>3.0.0</version> <!-- 可选:排除matheclipse-core可能传递的冲突日志依赖 --> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> </exclusion> </exclusions> </dependency> <!-- 保留Log4j2核心 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.21.1</version> </dependency> <!-- 添加SLF4J到Log4j2的绑定,替代原来的冲突绑定 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j2</artifactId> <version>2.0.9</version> </dependency> <!-- 保留jlatexmath依赖 --> <dependency> <groupId>org.scilab.forge</groupId> <artifactId>jlatexmath</artifactId> <version>1.0.7</version> </dependency> </dependencies> <build> <plugins> <!-- 只保留一个整合后的shade插件配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.calculator.Main</mainClass> </transformer> </transformers> <!-- 过滤掉依赖中的签名文件,避免打包后验证错误 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
最后验证步骤
- 执行打包命令:
mvn clean package - 运行生成的可执行Jar:
java -jar GraphingCalculator-1.0-SNAPSHOT.jar - (可选)如果需要自定义日志输出,可以在
src/main/resources下添加log4j2.xml配置文件,比如最简单的控制台输出配置:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
这样应该就能解决你遇到的“no main manifest attribute”和日志初始化错误的问题了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

