如果我的开源项目由maven管理,并且依赖于不在maven存储库中的库,该怎么办?

如果我的开源项目由maven管理,并且依赖于不在maven存储库中的库,该怎么办?,maven,Maven,想象一下这种情况。我有一个用Maven管理的开源项目,它依赖于一个不在Maven存储库中的知名库(例如jpathwatch)。我怎样才能让它工作 简单的方法是将jpathwatch安装到本地maven存储库中。然而,这给那些查看我的项目源代码并希望自己构建它们的人带来了负担。他们会遇到maven错误,然后查看自述文件,或者干脆放弃尝试 有没有一个干净的方法让我来解决这个问题?我必须回到ANT吗 您可以在项目存储库中创建 请参见将JAR文件放在网络上的某个地方并从项目中引用它是很简单的。您可以通过

想象一下这种情况。我有一个用Maven管理的开源项目,它依赖于一个不在Maven存储库中的知名库(例如jpathwatch)。我怎样才能让它工作

简单的方法是将jpathwatch安装到本地maven存储库中。然而,这给那些查看我的项目源代码并希望自己构建它们的人带来了负担。他们会遇到maven错误,然后查看自述文件,或者干脆放弃尝试


有没有一个干净的方法让我来解决这个问题?我必须回到ANT吗

您可以在项目存储库中创建


请参见

将JAR文件放在网络上的某个地方并从项目中引用它是很简单的。您可以通过三个简单的步骤创建自己的Maven存储库,请参见我的。

在这种情况下,您应该将此库绑定到您的项目中,并使用
依赖范围,如下所示:

<dependency>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/file.jar</systemPath>
</dependency>

...
...
...
系统
${project.basedir}/lib/file.jar

最干净的方法是将库上载到central(如果您的项目不是开源的,则无法上载到项目所在的maven存储库)

如果原始项目不想上传工件,则有一些详细说明如何上传工件

也有可能只是在您自己的groupId下部署工件。。。更多的是最后的手段,或者如果官方的方式对你来说太慢的话,第一个手段

如果你想成为一个好的开源公民,把这些东西上传到central,这样其他人就会受益

像这样的黑客对那些生活在公司存储库管理员后面并且在
~/.m2/settings.xml中有
*
的人来说是行不通的(他们应该有这样的能力)

system
scope这样的黑客在人们试图将您的项目作为一个可传递的依赖项来处理时,会造成一个永无止境的痛苦世界。。。因为猜猜当从本地存储库而不是从反应器解析项目时,
${basedir}
的计算结果是什么?请尝试
~/.m2/repository/your groupId/your artifactId/your version
,它肯定不是您放置第三方jar文件的位置

system
scope hack只在您构建最终工件时有效,即使如此,它也可能会产生意外的副作用(比如烧制到JAR清单中的类路径……它将是您机器的磁盘路径……而不是用户部署到的路径)

只有三种解决方案:

  • 将其部署到远程回购(首选项为central)
  • 在本地回购中安装它(让最终用户感到痛苦)
  • 假模块解决方案(其中,您伪造了一个JAR模块,并将“构建的”JAR替换为您想要加入的JAR,以便模块现在是构建的工件,而不是构建它……这最终将成为选项1或2,但与“项目存储库中”相比,它是一个不那么邪恶的解决方案)

  • 不<代码>系统
    范围是邪恶的。使用
    mvn安装:安装文件
    mvn部署:部署文件
    instead@StephenConnolly我不认为邪恶这个词是正确的:)当然,最好不要使用它,并且在存储库中拥有所有依赖项,但我没有遇到使用它的任何副作用(除了您提到的可传递依赖项之外)。格式错误的清单类路径是另一个重要的副作用…还有其他一些,但我需要挖掘它们。伪模块是比系统范围更好的解决方案。同意Stephen,系统路径${project.basedir}有更好的类似Maven的替代方案作为系统路径的一部分对我不起作用。不知道为什么。另外,当项目组装时,系统作用域库不会打包。noooooooo。
    system
    作用域是邪恶的。使用
    mvn安装:安装文件
    mvn部署:部署文件
    对那些在
    ~/.m2/s中需要
    *
    的人不起作用xml
    (应该是在公司环境中与Maven Repository Manager一起工作的每个人)可能重复我发现Maven是一项步履蹒跚的技术,除非我也在运行像Nexus这样的Maven存储库管理器。安装它,你将永远不会回头。我正在设计一个开源项目,我希望被公司以外的人共享。虽然我可以在我的公司建立Nexus,但我不能假设其他人也会这样做。不没关系。我可以与您共享代码,但仍然使用我自己的Nexus实例。Maven repository Manager旨在“镜像”远程内容,因此使用它可以自动缓存像Maven Central这样的大型repo(提高构建速度和可靠性)。它还可以让您更好地了解项目如何使用JAR(开源或其他)。如果没有回购管理器,您将无法获得使用Maven的全部好处。谢谢。似乎我必须让人们进行本地安装。