使用 maven 嵌套依赖包含而不创建阴影 jar

Posted

技术标签:

【中文标题】使用 maven 嵌套依赖包含而不创建阴影 jar【英文标题】:Nested dependency inclusion using maven without creating shaded jar 【发布时间】:2020-09-08 10:11:39 【问题描述】:

我创建了两个 maven 项目。以下是两个项目的 pom 文件;

    核心库 -
<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.demo</groupId>
    <artifactId>core-library</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Core</name>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.reflections</groupId>
                <artifactId>reflections</artifactId>
                <version>0.9.12</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.reflections</groupId>
            <artifactId>reflections</artifactId>
        </dependency>
    </dependencies>
</project>
    实用程序库 -
<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.demo</groupId>
    <artifactId>utility-library</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Utility</name>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.demo</groupId>
                <artifactId>core-library</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.demo</groupId>
            <artifactId>core-library</artifactId>
        </dependency>
    </dependencies>
</project> 

现在核心库有一些外部依赖项,例如org.reflections:reflections 等。所以我的期望是当我将核心库添加到实用程序库时,这些外部依赖项应该自动添加到实用程序库的依赖关系树中。

但实际上,这些嵌套的依赖并没有被包含在实用程序库的依赖树中。

以下是我在实用程序库上运行 mvn dependency:tree 时的输出

 --- maven-dependency-plugin:2.8:tree (default-cli) @ utility-library ---
[INFO] com.demo:utility-library:jar:0.0.1-SNAPSHOT
[INFO] +- com.demo:core-library:jar:0.0.1-SNAPSHOT:compile
INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

我尝试了this堆栈溢出问题的解决方案,但问题还没有解决。

有人可以帮我解决这个问题吗?

附: - 我必须在不创建胖/阴影/uber jar 的情况下实现这种嵌套依赖包含,因为它会增加实际 jar 大小,并且我还想进一步使用实用程序库作为其他项目中的 maven 依赖项。

更新: 当我尝试使用 -X(启用调试日志)标志构建实用程序库时,出现以下错误,

[WARNING] The POM for com.demo:core-library:jar:0.0.1-SNAPSHOT is invalid, transitive dependencies (if any) will not be available: 3 problems were encountered while building the effective model for com.demo:core-library:0.0.1-SNAPSHOT
[ERROR] Invalid packaging for parent POM com.demo:core-library:0.0.1-SNAPSHOT, must be "pom" but is "jar" @
[ERROR] Invalid packaging for parent POMcom.demo:core-library:0.0.1-SNAPSHOT, must be "pom" but is "jar" @
[FATAL] The parents form a cycle: com.demo:core-library:0.0.1-SNAPSHOT -> com.demo:core-library:0.0.1-SNAPSHOT @ 

【问题讨论】:

【参考方案1】:

您的 POM 看起来正确。

reflections 是一个传递依赖,应该由 Maven 自动绘制。

如果看不到,请查看mvn dependency:tree。它应该列在那里。

也许你的 IDE 出现了废话。

【讨论】:

J F*** Meier 根据您的建议,我尝试了 mvn dependency:tree。但是依赖树仍然不包含预期的输出。我已经更新了我的问题以添加依赖树目标的输出。请检查。 也许你之前构建了core-library(如0.0.1-SNAPSHOT),但没有依赖关系? 不,我用依赖构建它,仍然要再次验证,我尝试重建核心核心库。但问题还没有解决。 这真的很奇怪。这是 Maven 的标准功能,我从来没有遇到过这个问题...... 我在我的问题中添加了与 pom 打包错误相关的更新,请检查。

以上是关于使用 maven 嵌套依赖包含而不创建阴影 jar的主要内容,如果未能解决你的问题,请参考以下文章

在maven项目中导入外部jar而不创建依赖项[重复]

创建一个包含依赖管理 maven 的 jar [重复]

当它们包含我创建的工件时,如何指示 maven 自动添加依赖项 jar?

如何使用maven shaded插件而不是两个创建一个包含所有依赖项的可执行jar

无法为使用 maven-shaded-plugin 创建的 jar 获取条目 BOOT-INF/lib 的嵌套存档

Maven 可以重新签署依赖项吗?