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

Nak*_*ble 31 java maven-2

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

我可以在没有安装的情况下将jar添加到maven 2 build classpath吗?

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

如何让Maven Shade插件将这样的第三方JAR添加到着色的JAR中?


根据得到的答案,我做到了.我做的是,将这个片段添加到我的pom.xml的开头:

<repositories>
  <repository>
    <id>repo</id>
    <url>file://${basedir}/repo</url>
  </repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)

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

<dependencies>
  <dependency>
    <groupId>dummy</groupId>
    <artifactId>dummy</artifactId>
    <version>0.0.0</version>
    <scope>compile</scope>
  </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

然后运行命令行将包添加到'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/
Run Code Online (Sandbox Code Playgroud)

(不确定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
Run Code Online (Sandbox Code Playgroud)

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

Pas*_*ent 41

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

是的,因为system假定范围内的依赖关系始终存在(这正是system范围的内容),因此不会包含它们.人们实际上并不了解system范围依赖是什么,他们只是继续滥用它们(是的,这是滥用),然后得到副作用并想知道为什么(正如Brian在他的回答中指出的那样).

我已经写很多,很多,真的 很多次关于这个在这里SO和在99%的情况,system范围的相关性都应当避免.我将再次重复依赖范围迷你指南所说的内容:

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

因此,不是使用system范围,而是:

  • 通过以下方式将库添加到本地存储库install:install-file.这是一种快速而肮脏的方式来使事情正常工作,如果你是一个人,它可能是一个选项,但它使你的构建不可移植.
  • 安装并运行Nexus,Archiva或Artifactory等"企业存储库",并通过以下方式添加库deploy:deploy-file.这是理想的情况.
  • 按照上一个答案中的描述设置基于文件的存储库,并将库放在那里.如果您没有公司存储库但需要团队合作并且不想牺牲可移植性,那么这是最好的折衷方案.

请停止使用system示波器.

  • 问题不在于人们*喜欢*使用错误的方法,或者这样做是为了惹恼人们 - 问题在于这些东西都没有被清楚地记录下来,也没有在互联网上给出实现这些东西的食谱.让人们粗暴地创建"企业存储库"或使用maven是不可能的,因为没有人们遇到的常见案例的文档 - 他们总会找到一种方法. (17认同)
  • 另一个问题是没有简单的方法来使用本地罐子:承认它,系统范围可能是错误的,让正念的人退缩,但初学者需要让东西上班.ia项目明天到期,10⁰⁰,然后需要一个带阴影的罐子.不得不设置回购让我的眼睛向后滚到我的脑海里. (10认同)
  • 这是什么样的自恋回答?我希望例如在我的程序集中使用`tools.jar`,但不能没有做疯狂的步骤,因为maven-assembly-plugin的某个人认为不应该包含"系统"范围,这是绝对的废话 (4认同)
  • 我喜欢这个答案,但这并不能回答问题。很高兴告诉人们这是一种不好的做法,但在某些情况下确实需要这样做。经过 13 年的 JDev 实践,我终于来到了这一刻,我真的需要这个,而阅读这个而不是真正的解决方案并不酷。如果您感兴趣,我刚刚发现一个仅授权给一个项目的库,因此这不会进入中央存储库,甚至不会进入企业存储库,并且我不会告诉其他开发人员将其安装到本地存储库作为先决条件建立一个项目 (2认同)

Mar*_*ler 13

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

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


归档时间:

查看次数:

34341 次

最近记录:

9 年,7 月 前