在Maven生命周期和系统范围内的依赖关系中安装第三方JAR

时间:2011-08-24 16:59:59

标签: java maven-2

我的项目取决于Maven Central中没有的某些第三方JAR。

我看到的有关这种情况的大多数信息,包括官方Maven Guide to installing 3rd party JARs,都建议使用mvn install:install-file ...将工件安装到本地存储库中。这在本地开发时效果很好,但是当构建需要以自动方式在许多不同的系统上执行时,需要这个手动步骤是不可取的,也是不切实际的。

经常提出的另一个解决方案是将依赖项安装到组织范围的存储库中,但是在某些情况下这是不可能的。

由于这些选项都不可接受,我可以考虑两个选项:

  1. 将JAR存储在项目的lib目录中,并使用system范围声明依赖关系(如several answers中所述)。这似乎适用于任何系统,因为依赖项与项目捆绑在一起,但我已经看到使用system作为一种不好的做法(通常没有更多的解释)。
  2. 将maven-install-plugin绑定到initialize生命周期阶段,以将工件安装到本地存储库。但是,正如here指出的那样,这会导致不必要的开销,因为它为每个构建运行。如果只有在未安装工件的情况下才有懒惰的方法执行此操作,那可能是理想的。
  3. 我想要一个可以使用常规Maven生命周期构建的标准Maven项目,而不需要任何带外“运行脚本/ init-dependencies”步骤。

    前进的最佳方式是什么?

3 个答案:

答案 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:

  • 所有的hackery都发生在这个神器里面。我的项目使用干净的依赖语法。
  • 没有jar文件重复。 SCM中没有JAR文件。
  • 我认为这是一种“动态”创建新Maven存储库的方法。

<强> CONS:

  • 它击败了Maven的目的。如果您发现自己正在为公共开源项目执行此操作,请考虑将其上载到公共存储库并与Maven Central同步...这是一个guide,解释如何从Sonatype存储库执行此操作。这需要一些时间,但至少其他人可能会从您的努力中受益。
  • 它击败了Maven目的x2。如果您不小心,很快就会忘记Central Repository上的依赖项。我的大多数项目使用一个或多个自定义安装的依赖项,使得任何公共项目都会很痛苦。

干杯,