在 Maven 着色 jar 中包含第三方 jar,而无需将其添加到本地存储库

2022-09-01 08:39:45

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

我可以在不安装的情况下将 jar 添加到 maven 2 构建类路径中吗?

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

如何让 Maven Shade 插件将这样的第三方 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>

然后运行命令行将包添加到“存储库”:

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/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

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


答案 1

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

是的,因为假定作用域内的依赖项始终存在(这正是作用域的意义所在),因此不会包含它们。人们实际上并不了解范围依赖性是什么,他们只是不断滥用它们(是的,这是滥用),然后得到副作用并想知道为什么(正如Brian在他的答案中指出的那样)。systemsystemsystem

我已经在SO上写很多很多次了,很多很多次,在99%的情况下,应该避免范围依赖。我将再次重复依赖项范围迷你指南所说的内容:system

  • system:此依赖项在项目生命周期的某个阶段是必需的,但特定于系统。不鼓励使用此范围:这被认为是一种“高级”功能,只有在您真正了解其使用的所有后果时才应使用,即使实际上不是实际上不可能量化,也可能非常困难。根据定义,此作用域使生成不可移植。在某些边缘情况下可能是必需的。系统作用域包括指向此依赖项在本地计算机上的物理位置的元素。因此,它用于指代一些预期存在于给定本地机器上的工件,而不是存储库中;其路径可能因机器而异。例如,systemPath 元素可以引用其路径中的环境变量。<systemPath>${JAVA_HOME}

因此,与其使用作用域,不如:system

  • 通过 将库添加到本地存储库。这是一种快速而肮脏的工作方式,如果您独自一人,它可能是一种选择,但它使您的构建不可移植。install:install-file
  • 安装并运行Nexus,Archiva或Artifical等“企业存储库”,并通过添加库。这是理想的情况。deploy:deploy-file
  • 按照前面的答案中所述设置基于文件的存储库,并将库放入其中。如果您没有企业存储库,但需要作为一个团队工作并且不想牺牲可移植性,这是最好的折衷方案。

请停止使用示波器。system


答案 2

Maven addjars插件解决了这个问题 - 请参阅

http://code.google.com/p/addjars-maven-plugin/wiki/UsagePage


推荐