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

Java 在Maven生命周期与系统范围的依赖关系中安装第三方JAR,java,maven-2,Java,Maven 2,我的项目依赖于一些在Maven Central中不可用的第三方JAR 我看到的关于这种情况的大多数信息,包括官方的Maven,都建议使用mvn install:install file…将工件安装到本地存储库中。这在本地开发时效果很好,但是当构建需要以自动化方式在许多不同的系统上执行时,需要此手动步骤是不可取的,也是不切实际的 另一个经常出现的解决方案是将依赖项安装到组织范围的存储库中,但是在某些情况下这是不可能的 由于这两种选择都不可接受,我可以想出两种选择: 将JAR存储在项目中的lib目录

我的项目依赖于一些在Maven Central中不可用的第三方JAR

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

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

由于这两种选择都不可接受,我可以想出两种选择:

  • 将JAR存储在项目中的lib目录中,并使用
    系统
    范围声明依赖关系(如中所建议)。这似乎适用于任何系统,因为依赖项与项目捆绑在一起,但我发现使用
    system
    是一种不好的做法(通常没有更多的解释)
  • 将maven安装插件绑定到
    初始化
    生命周期阶段,将工件安装到本地存储库。然而,正如所指出的,这将导致不必要的开销,因为它在每个构建中都会运行。如果有一种方法只有在未安装工件时才懒洋洋地执行此操作,那么这可能是理想的
  • 我想要一个标准的Maven项目,它可以使用常规的Maven生命周期构建,而不需要任何带外的“首先运行脚本/init依赖项”步骤


    最好的方法是什么?

    我会创建一个ant任务来检查安装的.mylibisin文件。如果它不存在,mvn安装yourlib.jar并创建它

    然后,您可以将这个ant任务与maven的初始化阶段相关联——开销将是最小的

    这有点粗俗,但你确实有一些限制

    如果有一种方法只有在工件被激活时才懒洋洋地执行它 没有安装,这可能是理想的

    即使知道你的问题与生俱来的丑陋,我也会直接回答你的问题。我已经成功地使用了一段时间的变通方法,但请注意,我个人认为这并不比系统依赖性更好。Maven认为滥用配置文件是一种不良的行为。

    创建一个单独的插件来安装libs,并按照问题中的建议绑定
    maven安装插件

    您可以使用
    -p myprofile
    手动激活配置文件。 另一个选择是,如果你想100%的黑客化,将@vlf“checkforfile”建议改编成纯Maven。只需为配置文件使用激活触发器。 可能是这样的(警告:未测试):

    和ANT。对于lib文件夹和下载的jar,有一些大量的
    安装文件
    投标。它很难看,也很粗糙,但是当您经常需要在多个存储库中反复安装同一组库/javadocs时,它就可以工作了

    优点:

    • 所有的黑客行为都发生在这个人工制品中。我的项目使用干净的依赖语法
    • 没有jar文件复制。SCM中没有JAR文件
    • 我认为这是一种创建新的Maven库的方法。
    缺点:

    • 它违背了专业的目的。如果您发现自己为公共开源项目做了这件事,请考虑将其上传到公共存储库并与Maven Central同步…下面是一个示例,解释如何从Sonatype存储库执行此操作。这需要一些时间,但至少其他人可能会从你的努力中受益
    • 它打败了Maven。如果您不小心,很快就会忘记哪些依赖项在中央存储库中。我的大多数项目都使用一个或多个自定义安装的依赖项,将这些依赖项公开将是一件痛苦的事情

    干杯,

    下面是这个问题的最新答案:

    我不建议在生命周期中使用安装文件。正如您所提到的,它每次都会运行—上面的解决方案会很快跳过项目。虽然上面创建了一个新模块,但它确实减少了许多JAR所需的详细信息,允许您使用可以轻松复制到存储库管理器中的存储库格式,并将其保留在主构建之外

    我也不建议使用system scope,因为上面提到了您链接到列表的问题的一些答案

    <activation>
      <file>
        <missing>${user.home}/.myapp/.mylibisinstalled</missing>
      </file>
    </activation>