我的项目取决于Maven Central中没有的某些第三方JAR。
我看到的有关这种情况的大多数信息,包括官方Maven Guide to installing 3rd party JARs,都建议使用mvn install:install-file ...
将工件安装到本地存储库中。这在本地开发时效果很好,但是当构建需要以自动方式在许多不同的系统上执行时,需要这个手动步骤是不可取的,也是不切实际的。
经常提出的另一个解决方案是将依赖项安装到组织范围的存储库中,但是在某些情况下这是不可能的。
由于这些选项都不可接受,我可以考虑两个选项:
system
范围声明依赖关系(如several answers中所述)。这似乎适用于任何系统,因为依赖项与项目捆绑在一起,但我已经看到使用system
作为一种不好的做法(通常没有更多的解释)。initialize
生命周期阶段,以将工件安装到本地存储库。但是,正如here指出的那样,这会导致不必要的开销,因为它为每个构建运行。如果只有在未安装工件的情况下才有懒惰的方法执行此操作,那可能是理想的。我想要一个可以使用常规Maven生命周期构建的标准Maven项目,而不需要任何带外“运行脚本/ init-dependencies”步骤。
前进的最佳方式是什么?
答案 0 :(得分:1)
我会创建一个ant任务来检查.mylibisinstalled文件。如果它不存在,请安装yourlib.jar并创建它。
然后,您可以将此ant任务与maven的初始化阶段相关联 - 开销将是最小的。
这有点像hackish,但你确实有一些限制。
答案 1 :(得分:1)
以下是该问题的最新答案:Maven: keeping dependent jars in project version control
我不建议在生命周期中使用install-file。正如您所提到的,它将每次运行 - 上述解决方案将很快跳过项目。虽然上面创建了一个新模块,但它确实减少了许多JAR所需的冗长,允许您使用可以轻松复制到存储库管理器的存储库格式,并将其保留在主构建之外。
我也不建议使用系统范围,原因是你提到了与列表链接的问题的一些答案。
答案 2 :(得分:0)
如果只有在工件存在时才有懒惰的方法执行此操作 没安装,这可能是理想的。
即使知道它的内在丑陋,我也会直截了当地回答你的问题。我已经成功地使用了一个变通方法,但是请注意,我个人并不认为这比系统依赖更好。 Maven人认为滥用档案是一种不好的做法。
创建一个单独的profile来安装lib并按照问题中的建议绑定maven-install-plugin
。
您可以使用-P myprofile
手动激活配置文件。
另一个选择,如果你想要100%hackish,正在调整@vlf“检查文件”建议到纯Maven。只需为配置文件使用激活触发器即可。
也许是这样的(警告:未经测试):
<activation>
<file>
<missing>${user.home}/.myapp/.mylibisinstalled</missing>
</file>
</activation>
如果您有许多项目使用的通用库集,只需使用自己的pom.xml创建单独的安装程序工件。这样您就不需要为多个项目携带相同的jar文件。
我个人有一个install-extra-libs
工件用于此目的。它在lib文件夹中有一些jar文件(还有一些javadoc和源代码的jar),一些依赖于隐藏/密码保护的存储库,甚至直接使用antrun:run和ANT get task下载一些文件。对于lib文件夹和下载的jar,有一些大规模的install-file
出价。它是丑陋和hackish但是当你通常需要一遍又一遍地将同一组库/ javadoc安装到多个存储库中时,它会起作用。
PROS:
<强> CONS:强>
干杯,