是否有办法在maven尝试解决它们之前安装maven依赖项?

我必须从远程位置解压缩一些依赖项并在本地安装它们。

我成功地获取它们(使用antrun插件)并安装它们(使用安装插件)

但是,如果我将它们定义为依赖项( .. ),则maven首先尝试解析它们,然后,如果成功,则继续执行antrun并安装。

我还尝试了build-helper-plugin及其attach-artifact,但它没有做任何事情(它甚至没有将工件添加到最终的war文件中)

那么,如何在maven尝试解决依赖关系之前运行我的执行?

有趣的问题! (可能)尝试这种尝试的一种尝试是使用多模块项目设置。

在父项目中获取并安装依赖项,并在子模块中使用它们。 我测试了我的假设:

父pom.xml

  4.0.0 foo.bar foo.bar.parent 1.0.0 pom  foo.bar.child     maven-antrun-plugin 1.6   validate       run        

模块pom.xml

  4.0.0 foo.bar foo.bar.child 1.0.0  foo.bar foo.bar.parent 1.0.0    can.not find.me 0.0.0    

在子模块构建失败之前,我从父pom构建获得“ Hello World ”输出(因为缺少依赖性)。 如果您实现在parent.pom的构建中提供依赖项,那么子模块项目应该是可构建的。

您应该看看运行Artifact Repository Manager(如Archiva),然后您可以在那里加载它们,并在~/.m2/settings.xml文件中添加Archiva服务器,而不必担心手动执行本地安装,假设工件尚未存在于远程存储库中。 如果您的“远程位置”是Maven存储库,Archiva也可以透明地代理。

我最终分两个阶段完成:

  • 设置antrun并安装执行以在clean上运行
  • 选择package时,如果尚未至少清理一次,则构建将失败

该解决方案虽然引入了一些复杂性。

您可以依赖于尝试system范围并添加systemPath

  junit junit 4.0 system ${project.basedir}/lib/myhackedjunit-4.0.jar  

system范围与provided类似,只是您必须提供明确包含它的JAR。 工件始终可用,不会在存储库中查找。

仅当依赖范围是系统时才使用systemPath 。 路径必须是绝对的。 由于假设系统范围依赖关系是先安装的,因此Maven不会检查项目的存储库,而是检查以确保文件存在。