【发布时间】:2022-02-02 22:25:56
【问题描述】:
我已阅读:
我的结论是没有办法排除从父 pom.xml 继承的特定依赖项。 我正在使用 maven,并且父 pom 不可编辑。
所以,我考虑在将 jar 本身打包到目标 jar 之前将其排除在依赖项之外。
My parent pom is `sdk-java-starter-parent` that comes from an internal library.
<parent>
<groupId>abc.def.xyz</groupId>
<artifactId>sdk-java-starter-parent</artifactId>
<version>6.1.0.4</version>
</parent>
该 pom 声明了 log4-1.2.7 依赖项,我想将其排除并且根本不导入到我的项目中。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
如果我直接从 spring 的组中导入父 pom,我可以使用spring-boot-maven-plugin 将其排除在外。
但是因为我是从内部库中导入父 pom,所以没有使用或可能使用该插件。
我考虑过使用 maven-shader 插件和其他重新打包插件,以便在打包之前对 jar 进行“着色”:
<excludes>
<exclude>log4j-1.2.17.jar</exclude> (tried also `**/log4j-1.2.17.jar`)
</excludes>
但效果不佳。
我试过<dependencyManagement>,但它不适合,因为我不想覆盖版本,我只想删除整个依赖项。完全排除它或删除它的罐子。
说实话,我一无所知,如果可能的话,我很高兴听到你建议我如何去做的一些想法。
如果不可能,我还有哪些其他选择?我怎样才能避免收到那个 log4j jar?
最终的应用是一个由 JAR 组成的 docker 容器。
正在使用的插件有:
- maven-jar-plugin
- maven-surefire-plugin
- docker-maven-plugin
- swagger-maven-plugin
我不确定其中哪一个负责构建应用程序和 jar 打包。
谢谢。
【问题讨论】:
-
@pringi unfurtunally no。正如我所说,我尝试过使用
<dependencyManagement>,但它不适合,因为我不想覆盖版本,我只想删除整个依赖项。完全排除它或删除它的罐子。 -
也许,如果您已经尝试了所有方法,为什么不将 log4j 的范围更改为提供。这样它就不会包含在最终的 jar 中。根据您所写的内容,我几乎可以肯定您已经分析了将 log4j 依赖项带入子模块的依赖项,并明确地将其排除在外。如果不能,你也可以试试这条路吗?如有需要,作为参考咨询:maven.apache.org/guides/introduction/…
-
@pringi 你是对的。我确实从带来 log4j 的所有其他依赖项中排除了 log4j。剩下的是paret pom。我只是按照您的建议做了,我已将 log4j 的
<dependency></dependency>添加到我的 pom 文件中,指定了从父 pom 带来的版本1.2.17,并添加了一个定义为提供的范围。它也没有奏效。我提取了项目的最终目标 jar,然后进入BOOT-INF\lib\仍然可以看到log4j-1.2.17.jar -
我做了一些测试,得出了和你一样的结论。无法从父 pom 中排除依赖项。这里解释了一个技巧,如果你能遵循将解决你的问题:generacodice.com/en/articolo/822480/…。不确定是否可以将父 pom 更改为另一个,并将当前父 pom 作为依赖项导入。如果可以的话,这个技巧将解决问题。
标签: spring-boot maven dependencies log4j pom.xml