如何强制 Maven 使用我的本地存储库而不是去远程存储库检索工件?
Posted
技术标签:
【中文标题】如何强制 Maven 使用我的本地存储库而不是去远程存储库检索工件?【英文标题】:How do I force Maven to use my local repository rather than going out to remote repos to retrieve artifacts? 【发布时间】:2016-02-06 12:20:22 【问题描述】:我在 Mac Yosemite 上使用 Maven 3.3.3 和 Java 8。我有一个多模块项目。
<modules>
<module>first-module</module>
<module>my-module</module>
…
</modules>
当我使用“mvn clean install”从上面构建我的一个子模块时,例如“my-module”,构建尝试从我在我的〜中定义的远程存储库下载子模块工件/.m2/settings.xml 文件。输出如下
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.9 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151104.200545-4.pom
在尝试从远程存储库下载之前,如何强制 Maven 先检查我的本地 ~/.m2/repository?下面是我在 ~/.m2/settings.xml 文件中定义远程存储库的地方……
<profile>
<id>releases</id>
<activation>
<property>
<name>!releases.off</name>
</property>
</activation>
<repositories>
<repository>
<id>releases</id>
<url>https://my.remoterepository.com/nexus/content/repositories/releases/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</profile>
<profile>
<id>snapshots</id>
<activation>
<property>
<name>!snapshots.off</name>
</property>
</activation>
<repositories>
<repository>
<id>snapshots</id>
<url>https://my.remoterepository.com/nexus/content/repositories/snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
编辑: 回答说当工件不存在时会发生下载,下面是终端输出,我在其中证明文件在我的仓库中,但 Maven 正在尝试还是下载吧……
Daves-MacBook-Pro-2:my-module davea$ ls -al ~/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar
-rw-r--r-- 1 davea staff 10171 Nov 5 10:22 /Users/davea/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar
Daves-MacBook-Pro-2:my-module davea$ mvn clean install
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for org.mainco.subco:my-module:jar:87.0.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-antrun-plugin @ org.mainco.subco:my-module:[unknown-version], /Users/davea/Documents/sb_workspace/my-module/pom.xml, line 678, column 12
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.8 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151106.043202-8.pom
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first- module-87.0.0-20151106.043202-8.pom (3 KB at 21.9 KB/sec)
Downloading: http://download.java.net/maven/2/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
【问题讨论】:
Maven 确实在尝试从远程存储库下载工件之前检查您的本地存储库。在您尝试此构建之前,您确定您的本地有这些工件吗?您现在可以检查本地存储库并再次尝试另一个构建。此外,您可以在settings.xml
中指定本地存储库的位置(请参阅here)。
虽然我没有在我的 settings.xml 文件中指定我的存储库,但它是 Maven 为我设置的默认值 - ~/.m2/repository 。即使它是默认值,我也必须指定它吗?
对我来说,我的本地存储库中还有其他文件,例如 *.sha1 或 *.lastUpdate。删除除 *.jar 和 *.pom 之外的其他文件将阻止 maven 从远程存储库重新下载文件
【参考方案1】:
依赖项有一个快照版本。对于快照,Maven 将检查本地存储库,如果在本地存储库中找到的工件太旧,它将尝试在远程存储库中查找更新的工件。这可能就是您所看到的。
请注意,此行为由存储库配置中的 updatePolicy
指令控制(快照存储库默认为 daily
)。
【讨论】:
是否可以通过控制台命令参数“覆盖”它?喜欢: mvn clean install -FORCE_COMMAND “太旧”是什么意思?它选择它可以找到的最新快照,无论是本地的还是远程的?那肯定是可怕的行为。如果我刚刚构建了一个快照,我真的想使用那个,而不是 CI 构建不久之后构建的那个。 请解释一下“太旧”是什么意思?【参考方案2】:使用mvn --help
可以看到选项列表。
有一个类似-nsu,--no-snapshot-updates Suppress SNAPSHOT updates
的选项
所以使用命令mvn install -nsu
可以强制使用本地仓库编译。
【讨论】:
您也可以使用-o
进行“离线” maven 行为
-nsu 选项不会阻止 mvn 尝试远程下载工件,如果它尚未下载,而不是像在本地构建和安装工件时那样使用本地构建。 ——
我遇到了同样的问题,尚未下载工件,这为我解决了这个问题:maven.apache.org/general.html#importing-jars【参考方案3】:
要真正强制 maven 仅使用您的本地存储库,您可以使用mvn <goals> -o
运行。 -o
告诉 maven 让你“离线”工作,它会远离网络。
【讨论】:
-o 选项不会阻止 mvn 尝试远程下载工件,如果它尚未下载,而不是像在本地构建和安装工件时那样使用本地构建。 确实如此 - 如果您没有本地副本,那么您就不走运了。这对于您之前构建的项目很有用,但最近可能有您不关心的 SNAPSHOT 更改。 或者即使您从未构建过项目,您也可以使用mvn dependency:go-offline
为离线构建它做准备
如果您有一个刚刚安装的本地副本(因此它从未在远程快照存储库中部署/可用)怎么办?
啊,我刚刚创建了一个带有一系列依赖项的 pom 项目,但没有在消费项目中指定 按照以下步骤:
-
确保删除位于本地的 jar 文件夹的所有内容,但要保留的 jar 除外。
例如 .repositories、.pom、.sha1、.lastUpdated 等文件。
-
执行
mvn clean install -o
命令
这将有助于使用本地存储库 jar 文件,而不是连接到任何存储库。
【讨论】:
只删除*.repositories
和 *.sha1
文件对我有用
对我不起作用。它说“无法解决项目 XXX 的依赖关系:无法在离线模式下访问 xxxx (https:/xxxx.com/repository/maven/),并且之前没有从它下载工件 xxxx:test:war:1.0.0。 【参考方案5】:
就我而言,我有一个和你一样的多模块项目。我必须更改我的项目所依赖的外部库之一的组 ID,如下所示。
发件人:
<dependencyManagement>
<dependency>
<groupId>org.thirdparty</groupId>
<artifactId>calculation-api</artifactId>
<version>2.0</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependencyManagement>
收件人:
<dependencyManagement>
<dependency>
<groupId>org.thirdparty.module</groupId>
<artifactId>calculation-api</artifactId>
<version>2.0</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependencyManagement>
注意
这让我非常抓狂,因为该模块在本地可用。
【讨论】:
谢谢这么多兄弟,把我的头发拉出来了,b/c 我正在使用父 POM groupid 信息(它也是多模块)导入到我的另一个项目中......你发帖让我意识到我的错误....非常感谢您减轻了人类同胞的痛苦 【参考方案6】:即使在考虑上述所有答案时,您仍然可能会遇到会终止您的 maven 离线构建并出现错误的问题。特别是,您可能会遇到如下警告:
[WARNING] The POM for org.apache.maven.plugins:maven-resources-plugin:jar:2.6 is missing, no dependency information available
警告之后会立即出现更多错误,maven 将终止。
对我们来说,使用按照上述提示创建的 maven 离线缓存进行离线构建的最安全方法是使用以下 maven 离线参数:
mvn -o -llr -Dmaven.repo.local=<path_to_your_offline_cache> ...
特别是,选项 -llr 使您不必按照答案 #4 中的建议调整本地缓存。
还要注意 settings.xml 中的参数
【讨论】:
我的 settings.xml 中没有 localRepository 属性....谢谢兄弟 @ThoR 您的回答很有帮助。请记住,并非每个人的配置都与您相同。如您所示设置我的本地存储库会破坏 maven,哈哈。而不是你的最后一个代码 sn-p,只需说“将 settings.xml 文件中的Maven 总是首先检查你的本地存储库,但是,你的依赖项需要安装在你的 repo 中,maven 才能找到它。
先在你的依赖模块中运行mvn install
,然后再构建你的依赖模块。
【讨论】:
我已经编辑了我的问题以表明该工件在存储库中(请注意我运行的“ls -al”命令。但 Maven 无论如何都在尝试下载它。还有其他想法吗? @Oliver:您错过了这样一个事实,即对于本地存储库中的工件,如果工件是太旧的快照,Maven 仍可能会查询远程存储库。【参考方案8】:-o 选项对我不起作用,因为工件仍在开发中,尚未上传,maven (3.5.x) 仍然尝试从远程存储库下载它,因为这是第一次,根据错误我明白了。
但是这为我解决了这个问题:https://maven.apache.org/general.html#importing-jars
此手动安装后,也无需使用离线选项。
更新
我刚刚重建了依赖项,我不得不重新导入它:常规的mvn clean install
对我来说不够用
【讨论】:
【参考方案9】:我遇到了完全相同的问题。运行 mvn clean install
而不是 mvn clean compile
解决了它。
仅在使用 multi-maven-project 时会出现差异,因为项目依赖项是通过 install 上传到本地存储库的。
【讨论】:
【参考方案10】:使用 【讨论】:
只是为了给我 2 美分。对我来说,只需要在 ~/.m2/repository
目录中找到 jar 并使用它的版本。所以,使用后
cd local-dependency/
mvn install
local-dependency
jar 将在 .m2/repository/com/your-organization/local-dependency/
中
~$ tree ~/.m2/repository/com/your-organization/local-dependency/
/home/felipe/.m2/repository/com/your-organization/local-dependency/
├── 0.1-SNAPSHOT
│ ├── maven-metadata-local.xml
│ ├── _remote.repositories
│ ├── local-dependency-0.1-SNAPSHOT.jar
│ ├── local-dependency-0.1-SNAPSHOT.pom
│ └── resolver-status.properties
└── maven-metadata-local.xml
然后将其用作本地依赖项
<dependency>
<groupId>com.your-organization</groupId>
<artifactId>local-dependency</artifactId>
<version>0.1-SNAPSHOT</version>
</dependency>
【讨论】:
以上是关于如何强制 Maven 使用我的本地存储库而不是去远程存储库检索工件?的主要内容,如果未能解决你的问题,请参考以下文章
有没有什么办法可以将我的存储库下载为zip并添加到我的本地存储库而不是使用git(repo snc命令)?
如何强制 IntelliJ 中的 Maven 从本地 .m2 存储库中提取特定依赖项