gpt4 book ai didi

java - 将第 3 方 jar 包含在 Maven 阴影 jar 中而不将其添加到本地存储库

转载 作者:IT老高 更新时间:2023-10-28 21:02:59 25 4
gpt4 key购买 nike

我已经在 Stack Overflow 上找到了如何在项目中包含第 3 方 JAR 而不将其安装到“本地存储库”的答案:

Can I add jars to maven 2 build classpath without installing them?

但是,当我使用 Maven Shade 插件创建一个包含项目所有依赖项的 JAR 时,不会自动包含第 3 方 JAR。

如何让 Maven Shade 插件将这样的第 3 方 JAR 添加到阴影 JAR 中?


根据得到的答案,我成功了。我所做的是,将此片段添加到我的 pom.xml 的开头:

<repositories>
<repository>
<id>repo</id>
<url>file://${basedir}/repo</url>
</repository>
</repositories>

然后为我的项目添加了一个依赖项,也添加到 pom.xml:

<dependencies>
<dependency>
<groupId>dummy</groupId>
<artifactId>dummy</artifactId>
<version>0.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>

然后运行命令行将包添加到'repo':

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file
-Dfile=<my-jar>.jar -DgroupId=dummy -DartifactId=dummy
-Dversion=0.0.0 -Dpackaging=jar -DlocalRepositoryPath=`pwd`/repo/

(不确定 repo 路径是否需要是完整路径,但不想冒险。)

repo 子目录的内容现在是:

repo/dummy/dummy/0.0.0/dummy-0.0.0.jar
repo/dummy/dummy/0.0.0/dummy-0.0.0.pom
repo/dummy/dummy/maven-metadata-local.xml

现在我可以将其 checkin 版本控制,并且没有本地或远程依赖项。

最佳答案

But, when I use the Maven Shade Plugin to create a JAR that includes all the dependencies of the project as well, the 3rd party JAR is not included automatically.

是的,因为 system假定范围内的依赖项始终存在(这正是 system 范围的含义),因此它们不会被包含在内。人们其实不明白什么system范围依赖是,他们只是继续滥用它们(是的,这是滥用),然后产生副作用并想知道为什么(正如 Brian 在他的 answer 中指出的那样)。

我已经写了many , many , really many在 SO 和 99% 的情况下,关于这个的倍数,system应避免范围依赖。我会重复 Dependency Scopes迷你指南再说一遍:

  • system: This dependency is required in some phase of your project's lifecycle, but is system-specific. Use of this scope is discouraged: This is considered an "advanced" kind of feature and should only be used when you truly understand all the ramifications of its use, which can be extremely hard if not actually impossible to quantify. This scope by definition renders your build non-portable. It may be necessary in certain edge cases. The system scope includes the <systemPath> element which points to the physical location of this dependency on the local machine. It is thus used to refer to some artifact expected to be present on the given local machine an not in a repository; and whose path may vary machine-to-machine. The systemPath element can refer to environment variables in its path: ${JAVA_HOME} for instance.

所以,不要使用 system范围,或者:

  • 通过 install:install-file 将您的库添加到本地存储库.这是一种让事情顺利进行的快速而肮脏的方式,如果你一个人,它可能是一个选择,但它会使你的构建不可移植。
  • 安装并运行 Nexus、Archiva 或 Artifactory 等“企业存储库”,并通过 deploy:deploy-file 添加您的库.这是理想的场景。
  • this previous answer 中所述设置基于文件的存储库并把你的图书馆放在那里。如果您没有公司存储库但需要作为一个团队工作并且不想牺牲可移植性,这是最佳折衷方案。

请停止使用 system范围。

关于java - 将第 3 方 jar 包含在 Maven 阴影 jar 中而不将其添加到本地存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3642023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com