当前位置: 首页 > 知识库问答 >
问题:

Maven阴影jar用作外部项目依赖项

袁弘方
2023-03-14

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

当我试图在其他应用程序中使用带阴影的jar作为maven依赖项时,它会拉出依赖项jar的。

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

共有1个答案

云焱
2023-03-14

典型的场景是:

>

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

    <dependency>
        <groupId>com.sample</groupId>
        <artifactId>something-uber</artifactId>
        <version>some-version</version>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    注意:上述特性仅在Maven3.2.1之后才可用。

    这样,您就向Maven表明了您不想要任何可传递依赖项,并且Maven依赖项中介将不会触发它们。

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

  •  类似资料:
    • 我的项目依赖于另一个项目的阴影JAR。另一个项目使用shade插件将一些的包中的所有类重新定位到。 这是意料之中的行为吗?有没有一种方法可以阻止这种传递阴影? 其他项目的阴影插件:

    • 根据我的理解,包含/排除只是白名单/黑名单,所以我不能显式地强制包含一些没有包含在实际依赖列表中的内容。 为了获得更多的上下文,我有一个JAR依赖项,它包含一个资源,我只希望它包含在我的shade工件中,但是在类路径上使用该JAR会导致错误。 明确地说,我希望在一个调用中生成一个带有附加依赖项的阴影jar,以及一个没有附加依赖项的普通jar。

    • 我正在使用Intellij社区版v2020.3.2和Java8。 我通过以下步骤添加外部jar文件,file- 执行在IDE中运行良好。但是当使用maven安装时会抛出错误“包包名不存在”。 我的pom。xml看起来像 当我移除外部jar时,maven安装工作正常。

    • 在LoginStorageProviderFactory中,它有一个来自LoginStorageProvier的导入,在最后一个类中,它有一个来自外部项目(也是我的项目)中的用户类的导入。 如果我把这个用户类移到jar模块中,错误就会消失,并且一切都能很好地工作;但我的目标是将项目与用户在其他项目中的实现和EAR项目分离。 所以,我认为错误的原因是缺少依赖项,Maven不能解决它,也没有报告错误,

    • 问题内容: 我想使用maven shade创建一个有阴影的jar,但我也想仅在有阴影的jar的情况下才包含一个特殊的依赖项(而不是在我项目的普通编译依赖项中)。我该怎么办? 根据我的理解,包含/排除项只是白名单/黑名单,因此我无法明确强制要包含的内容未包含在实际依赖项列表中。 对于更多上下文,我有一个JAR依赖项,其中包含只希望包含在我的一个阴影工件中的资源,但是如果在类路径中使用该jar会导致错

    • 我需要在我的maven项目中添加大约15个罐子,它在远程和中央存储库中都不可用。 然而,我实现了以下目标:, > 在我的项目路径中添加了jars(\src\lib) 将pom更改如下, 我的问题是: 我是否需要像上面那样分别对所有15个JAR重复它,或者我们有任何其他方法来绑定这些JAR并将其作为一个依赖路径? Maven在这里讨论了同样的事情:指向多个JAR的系统依赖性。但我想知道我是否能得到更