Maven - 将工件安装到工作空间中的本地存储库

时间:2010-01-07 07:54:59

标签: maven-2 repository

我希望有一种方法,'mvn install'将文件放在我的源(checkout)根目录下的存储库文件夹中,同时使用来自〜/ .m2 / repository的第三方依赖项。

所以在'mvn install'之后,布局是:

/work/project/
    repository
      com/example/foo-1.0.jar
      com/example/bar-1.0.jar
    foo
      src/main/java
    bar
      src/main/java

~/.m2/repository
    log4j/log4j/1.2/log4j-1.2.jar

(特别是/ work / project / repository不包含log4j)

在本质上,我正在寻找一种创建引用其他存储库的复合存储库的方法

我的目的是能够在同一个源上进行多次检出并在每次检查中使用“install”在本地存储库中相互覆盖。多次检查可能是因为在cvs / svn中的不同分支上工作,但在我的情况下,这是由于在git中克隆主分支(在git中,每个克隆就像一个分支)。我不喜欢每次结账时使用特殊版本/分类器或每次切换时重新安装(重建)所有内容的替代方案。

4 个答案:

答案 0 :(得分:29)

Maven可以搜索多个存储库(本地,远程,“假”远程)以解决依赖关系,但只有 ONE 本地存储库,其中工件在install期间安装。将工件安装到特定位置并维护此列表而不破坏任何东西将是一个真正的噩梦,这不会起作用,您不想这样做。

但是,TBH,我不明白这一点。那么,你为什么要这样做呢?可能有替代的和更简单的解决方案,例如在本地存储库中安装工件,然后在项目根目录下复制它们。为什么这不起作用?我真的很想知道最后的意图。

更新:在阅读了初始问题的更新后,我能想到的唯一解决方案(假设您不想使用不同的版本/标签)将使用两个本地存储库并在它们之间切换(虽然非常容易出错)。

为此,请使用不同的用户帐户(因为默认情况下本地存储库是用户特定的)。

或每次要切换时更新~/.m2/settings.xml

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository>${user.home}/.m2/repository</localRepository>
  <!--localRepository>${user.home}/.m2/repository2</localRepository-->
  ...
</settings>

或者使用settings.xml选项获得另一个--settings并指向它:

mvn install --settings /path/to/alternate/settings.xml

或者使用-Dmaven.repo.local选项在命令行中指定备用位置:

mvn -Dmaven.repo.local=/path/to/repo

正如我所说,这些解决方案都很容易出错,而且没有一个非常令人满意。即使您可能有很好的理由并行处理多个分支,您的用例(不是重建所有内容)也不常见。在这里,使用不同的用户帐户可能是更糟糕的解决方案IMO。

答案 1 :(得分:0)

命令行客户端无法做到这一点,但您可以使用Maven存储库服务器(如Nexus)创建更复杂的存储库布局。

不可能的原因是Maven允许嵌套项目并且其中大多数将相互引用,因此将每个工件安装在不同的存储库中会导致在本地硬盘上进行大量搜索(或者在发生时失败的构建你在一个子项目中开始构建。)

答案 2 :(得分:0)

仅供参考:符号链接适用于Windows7及更高版本,因此如果您的所有代码都在本地存储库中的相同位置,即/ com / myco /.

,这种情况很容易实现。

输入mklink了解详情

答案 3 :(得分:0)

使用命令行可以使用INDEED,实际上非常有用。例如,如果您想在Eclipse项目下创建一个额外的repo,您​​只需:

mvn install:install-file -DlocalRepositoryPath=repo \
   -DcreateChecksum=true -Dpackaging=jar \
   -Dfile=%2 -DgroupId=%3 -DartifactId=%4 -Dversion=%5

这是“localRepositoryPath”参数,它将您的安装指向您想要的任何本地仓库。

我在我从项目根运行的批处理文件中有这个,它将文件安装到我项目中的“repo”目录中(因此是%参数)。那么你为什么要这样做呢?那么,让我们说你是专业的服务顾问,而且你经常进入客户所在的地方,你被迫使用他们的安全硬化笔记本电脑。您可以通过USB记忆棒将自包含的项目复制到他们的笔记本电脑上,然后,您可以毫不费力地构建您的maven。

通常,如果您使用的是笔记本电脑,那么拥有一个包含所有内容的单个本地仓库是有意义的。但对于那些自大而且说“你为什么要这样做”之类的事情,我有一些消息......世界是一个更大的地方,有更多的选择,而不是你可能意识到的。如果您使用的笔记本电脑不是您的,并且您需要在该笔记本电脑上构建项目,获取生成的工件,然后删除您的项目目录(以及您刚刚使用的本地存储库),这是可行的方法。 / p>

至于为什么你想要有2个本地回购,默认的.m2 /存储库是公司标准的东西,而本地的“in project”仓库就是你的东西。

相关问题