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

Java模块化应用多依赖含相同包的冲突解决机制问询

解决模块化Java应用中SLF4J包重复依赖冲突问题

核心原因

Java模块系统(JPMS)的硬性规则:同一个包只能由一个模块负责提供。你的场景中,org.slf4j相关包同时出现在官方SLF4J模块和CommonUtilities的JAR中,触发了包冲突编译错误。

解决步骤

1. 优先尝试Maven依赖排除(传递依赖场景)

如果CommonUtilities的SLF4J是通过Maven传递依赖引入的(而非内置在自身JAR中),直接在pom.xml里排除它的SLF4J依赖:

<dependency>
    <groupId>CommonUtilities的groupId</groupId>
    <artifactId>CommonUtilities</artifactId>
    <version>对应版本号</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
        <!-- 若有其他SLF4J子模块依赖,如slf4j-simple,一并排除 -->
    </exclusions>
</dependency>

排除后,项目只会通过org.xerial.sqlitejdbc的依赖引入SLF4J,从根源避免重复。

2. 处理CommonUtilities内置SLF4J包的情况

如果CommonUtilities是把SLF4J类直接打包到自身JAR中(Fat JAR),Maven排除无效,需用JPMS的--patch-module参数将重复包合并到官方SLF4J模块:

编译阶段配置(maven-compiler-plugin)

在pom.xml的编译插件中添加模块参数:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <release>你的Java版本(如17)</release>
        <compilerArgs>
            <arg>--patch-module</arg>
            <arg>org.slf4j=${project.basedir}/lib/CommonUtilities.jar</arg>
        </compilerArgs>
    </configuration>
</plugin>

该参数会告知模块系统:将CommonUtilities.jar内的SLF4J相关包合并到org.slf4j模块中,让系统认定这些包仅由官方SLF4J模块提供。

运行阶段配置(以exec-maven-plugin为例)

运行时同样需要添加该参数,避免运行时冲突:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <mainClass>你的主类全路径</mainClass>
        <arguments>
            <argument>--patch-module</argument>
            <argument>org.slf4j=${project.basedir}/lib/CommonUtilities.jar</argument>
        </arguments>
    </configuration>
</plugin>

3. 将CommonUtilities转为模块化JAR(长期方案)

若可修改CommonUtilities的构建流程,给它添加module-info.java,明确依赖SLF4J而非内置包:

module CommonUtilities {
    requires org.slf4j;
    // 仅导出自身业务包,不要导出SLF4J相关包
    exports com.yourcompany.common;
}

如果是第三方不可修改的JAR,可使用moditect插件自动生成模块描述:

<plugin>
    <groupId>org.moditect</groupId>
    <artifactId>moditect-maven-plugin</artifactId>
    <version>1.0.0.Final</version>
    <executions>
        <execution>
            <id>add-module-info-to-common-utils</id>
            <phase>package</phase>
            <goals>
                <goal>add-module-info</goal>
            </goals>
            <configuration>
                <jars>
                    <jar>
                        <path>${project.basedir}/lib/CommonUtilities.jar</path>
                        <moduleInfo>
                            module CommonUtilities {
                                requires org.slf4j;
                                exports com.yourcompany.common;
                            }
                        </moduleInfo>
                    </jar>
                </jars>
            </configuration>
        </execution>
    </executions>
</plugin>

内容的提问来源于stack exchange,提问作者Todd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:35:18