3

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

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

我有一个干净的方法来解决它吗?我必须回到 ANT 吗?

4

4 回答 4

2

最干净的方法是将库上传到中央(或者如果您的项目不是开源的,则将库上传到您的项目所在的 maven 存储库)。

关于将第 3 方工件上传到中央的指南,其中详细说明了如果原始项目不想上传工件的方法。

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

如果您想成为一名优秀的开源公民,请将这些内容上传到中央,以便其他人受益。

像项目内存储库这样的黑客对那些生活在公司存储库管理器后面并且拥有(<mirrorOf>*</mirrorOf>他们~/.m2/settings.xml应该拥有的)的人不起作用

当人们尝试将您的项目作为传递依赖项使用时,像范围这样的黑客system会导致一个永无止境的痛苦世界......因为猜猜从本地存储库而不是从反应堆解决您的项目时会评估什么?试试这绝对不是你放置第 3 方 jar 文件的地方。${basedir}~/.m2/repository/your-groupId/your-artifactId/your-version

范围破解仅在您构建最终工件时才有效,system即使那样它也可能产生意想不到的副作用(例如被烘焙到 JAR 清单中的类路径......它将是您机器的磁盘路径......不是用户部署到的路径)

只有三个解决方案:

  1. 将其部署到远程仓库(首选中央)
  2. 将其安装在本地存储库中(最终用户会很痛苦)
  3. 假模块解决方案(其中你伪造一个 JAR 模块并用你想要子插入的 jar 替换“构建”jar,以便模块现在是构建的工件而不构建它......这最终将成为选项 1或 2 但比“项目存储库”中的解决方案更邪恶)
于 2013-01-21T12:45:20.650 回答
1

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

<dependency>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/file.jar</systemPath>
</dependency>
于 2013-01-21T09:59:33.967 回答
0

将 JAR 文件放在网络上的某个位置并从项目中引用它是微不足道的。您可以通过三个简单的步骤创建自己的 Maven 存储库,请参阅我的帖子

于 2013-01-21T09:59:11.923 回答
0

您可以创建项目内存储库。

请参阅Leonid Dubinsky 的博客 - Maven 项目内存储库

于 2013-01-21T09:57:52.457 回答