JDK1.8下Eclipse导出Jar因selenium-java生成module-info致Log4J失效
问题描述
原本基于现有POM文件通过Eclipse导出Jar包时,Log4J可以正常运行。添加selenium-java依赖后,导出的Jar包里自动生成了module-info文件,Log4J随即失效,而且Jar内的Log4j-config.xsd文件变成空白。项目用的是JDK1.8,selenium-java也支持1.8及以上版本,找不到问题原因。
相关POM配置
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.9.1</version> </dependency> </dependencies>
问题分析与解决思路
- 自动生成
module-info的原因:Selenium 4.x的依赖中包含Java 9+的模块化JAR,Eclipse导出Jar时会自动检测这些模块并生成module-info,但JDK1.8不支持模块系统,这会打乱类加载逻辑,导致Log4J无法正常初始化。 Log4j-config.xsd空白的问题:大概率是导出过程中,模块化处理导致资源文件被错误覆盖或未正确打包。
针对这些问题,可以尝试以下方案:
- 方案一:禁用Eclipse的模块化自动处理
在Eclipse导出Jar的向导里,找到模块相关选项,选择不生成module-info文件,强制以JDK1.8的非模块化方式打包:- 右键项目 → Export → Java → Runnable JAR File
- 点击Next后,在Library handling部分,取消勾选模块化相关选项,同时选择合适的依赖打包方式(比如"Extract required libraries into generated JAR")
- 方案二:用Maven插件替代Eclipse导出
用maven-shade-plugin或maven-assembly-plugin打包,避免Eclipse的模块化自动干预。在POM中添加maven-shade-plugin配置:
执行<build> <plugins> <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.yourpackage.YourMainClass</mainClass> </transformer> </transformers> <!-- 排除自动生成的module-info --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>module-info.class</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build>mvn clean package后,生成的shaded Jar会以非模块化方式打包,解决Log4J失效问题。 - 方案三:检查Log4J资源文件打包配置
确保log4j2.xml(或其他配置文件)、Log4j-config.xsd放在src/main/resources目录下,Eclipse导出时勾选"Export all output folders for checked projects",保证资源文件完整打包。
内容的提问来源于stack exchange,提问作者itsraja
相关产品推荐
相关产品推荐

