You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>
问题分析与解决思路
  1. 自动生成module-info的原因:Selenium 4.x的依赖中包含Java 9+的模块化JAR,Eclipse导出Jar时会自动检测这些模块并生成module-info,但JDK1.8不支持模块系统,这会打乱类加载逻辑,导致Log4J无法正常初始化。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:33:18