Maven 着色 jar 用作外部项目依赖项

erd*_*run 9 uberjar maven-3 maven maven-shade-plugin

我在我的项目中使用了 maven shade 插件来重新定位一个包下的所有依赖 jar 类,例如 org.shade.*

当我尝试在其他应用程序中使用该阴影 jar 作为 maven 依赖项时,它会拉取依赖项 jar。

我的期望是当 uber/shaded jar 作为 maven 依赖项包含时,它不应该拉任何其他依赖类 jar,因为这些类已经在 shaded jar 中重新打包。

A_D*_*teo 7

经典场景是:

  • 生成 uber-jar 的项目有自己的依赖项(dependencypom.xml文件中的元素),然后将它们打包在一个 uber-jar 中作为 Maven 工件
  • 当将此 uber-jar 用作dependency另一个项目的依赖项(元素)时,Maven 将检查其<artifact>-<version>.pom文件(与最终工件一起发布到 Maven 存储库中),这基本上是其原始pom.xml文件的重命名副本,其中依赖项(dependency元素) ) 已声明(正是打包到 uber-jar 中的依赖项)。
  • 由于您已经将它们打包,因此您希望忽略该.pom文件(及其dependencies元素),为此您需要添加exclusions以下内容:

    <dependency>
        <groupId>com.sample</groupId>
        <artifactId>something-uber</artifactId>
        <version>some-version</version>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)

注意:上述功能仅在 Maven 之后可用3.2.1

因此,您向 Maven 明确表示您不想要任何传递依赖,然后Maven 依赖中介不会触发它们。


附带说明:将 uber-jar 作为项目的依赖项并不是一个好习惯:它只会使维护变得更加困难,因为您无法通过依赖项目的顺序dependencyManagementdependencies顺序来控制传递依赖项。因此,每当依赖项(其传递性之一)需要维护(更改版本等)并且对依赖项目的控制要少得多(同样,更难的维护)时,您将始终需要重新打包 uber jar。