如何强制 Maven 使用我的本地存储库,而不是转到远程存储库来检索工件?

How do I force Maven to use my local repository rather than going out to remote repos to retrieve artifacts?

提问人:Dave 提问时间:11/5/2015 最后编辑:Ahmad ShahwanDave 更新时间:9/1/2023 访问量:363303

问:

我在 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-3 工件

评论

4赞 mystarrocks 11/5/2015
Maven 在尝试从远程存储库下载项目之前检查您的本地存储库。在尝试此构建之前,您确定您的本地人拥有这些工件吗?您现在可以检查您的本地存储库,然后再次尝试另一个版本。此外,您还可以指定本地存储库在 中的位置(请参阅此处)。settings.xml
1赞 Dave 11/6/2015
虽然我没有在我的 settings.xml 文件中指定我的存储库,但它是 Maven 为我设置的默认值 -- ~/.m2/repository 。即使它是默认值,我是否也必须指定它?
3赞 Harun 9/27/2017
对我来说,我的本地存储库中还有其他文件,例如 *.sha1 或 *.lastUpdate。删除除 *.jar 和 *.pom 之外的其他文件将阻止 Maven 从远程存储库重新下载文件

答:

6赞 Oliver 11/5/2015 #1

Maven 总是首先检查您的本地存储库,但是,您的依赖项需要安装在您的存储库中,以便 maven 找到它。

首先在依赖项模块中运行,然后生成依赖项模块。mvn install

评论

2赞 Dave 11/6/2015
我已经编辑了我的问题以表明工件在存储库中(请注意我运行的“ls -al”命令。然而,Maven 仍然试图下载它。还有其他想法吗?
6赞 Andreas Veithen 11/7/2015
@Oliver:您忽略了这样一个事实,即对于本地存储库中的工件,如果工件是太旧的快照,Maven 仍可能查阅远程存储库。
76赞 Andreas Veithen 11/7/2015 #2

依赖项具有快照版本。对于快照,Maven 将检查本地存储库,如果在本地存储库中找到的项目太旧,它将尝试在远程存储库中查找更新的项目。这可能就是你所看到的。

请注意,此行为由存储库配置中的 updatePolicy 指令控制(默认情况下,快照存储库)。daily

评论

19赞 Naxos84 11/8/2016
是否可以通过控制台命令参数“覆盖”它?喜欢:mvn clean install -FORCE_COMMAND
32赞 Tom Quarendon 9/5/2017
“太老了”是什么意思?它会选择它能找到的最新快照,无论是本地的还是远程的?那肯定是可怕的行为。如果我刚刚构建了一个快照,我真的想使用那个快照,而不是 CI 构建片刻后构建的快照。
3赞 Bằng 11/28/2019
请详细解释一下“太旧”是什么意思?
7赞 Willa 2/13/2016 #3

就我而言,我有一个和你一样的多模块项目。我必须更改我的项目所依赖的外部库之一的组 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>

请注意 <groupId> 部分。事实证明,我忘了修改在其 pom 文件中定义此依赖项的子模块的相应部分。

这让我非常疯狂,因为该模块在本地可用。

评论

1赞 ennth 11/16/2021
太棒了兄弟,把我的头发了,b/c 我正在使用父 POM groupid 信息(它也是多模块)导入到我的其他项目中......你的帖子让我意识到我的错误......非常感谢你减轻人类同胞的痛苦 <3
68赞 Zheng Zhongqi 7/3/2017 #4

使用,您可以看到选项列表。mvn --help

有一个选项,如-nsu,--no-snapshot-updates Suppress SNAPSHOT updates

所以使用命令可以强制编译本地仓库。mvn install -nsu

评论

22赞 Sean 11/23/2017
您还可以用于“脱机”maven 行为-o
11赞 user1767316 1/17/2018
-nsu 选项不会阻止 mvn 尝试远程下载工件,如果尚未下载工件,而不是像在本地构建和安装工件时那样使用本地构建。–
0赞 Luigi Cristalli 10/17/2018
我遇到了同样的问题,尚未下载工件,这为我解决了它:maven.apache.org/general.html#importing-jars
35赞 Sean 11/23/2017 #5

要真正强制 maven 使用本地存储库,可以使用 .告诉 maven 让您“离线”工作,并且它将远离网络。mvn <goals> -o-o

评论

11赞 user1767316 1/17/2018
-o 选项不会阻止 mvn 尝试远程下载工件(如果尚未下载),而不是像在本地构建和安装工件时那样使用本地构建。
2赞 Sean 1/17/2018
这是真的 - 如果你没有本地副本,你就不走运了。这对于您之前构建的项目很有用,但可能具有您不关心的最新 SNAPSHOT 更改。
0赞 Aldian 1/26/2018
或者,即使您从未构建过项目,也可以为离线构建它做好准备mvn dependency:go-offline
0赞 Vivek Chavda 4/18/2018
如果您有一个刚刚安装的本地副本(因此它从未在远程快照存储库中部署/可用)怎么办?
1赞 Vivek Chavda 4/18/2018
啊,我刚刚创建了一个带有依赖集合的 pom 项目,但没有在消费项目中指定 <type>pom</type>,所以它正在寻找一个 jar(当然也找不到它,即使在离线模式下)
2赞 Luigi Cristalli 10/17/2018 #6

-o 选项对我不起作用,因为工件仍在开发中,尚未上传,并且 maven (3.5.x) 仍然尝试从远程存储库下载它,因为这是第一次,根据我得到的错误。

但是,这为我解决了它:https://maven.apache.org/general.html#importing-jars

手动安装后,也无需使用脱机选项。

更新

我刚刚重建了依赖项,我不得不重新导入它:常规对我来说是不够的mvn clean install

12赞 Madhu 5/29/2019 #7

请按照以下步骤操作:

    1. 确保删除位于本地的 jar 文件夹的所有内容,但要保留的 jar 除外。
      例如,.repositories、.pom、.sha1、.lastUpdated 等文件。
    1. 执行命令mvn clean install -o

这将有助于使用本地存储库 jar 文件,而不是连接到任何存储库。

评论

3赞 DLight 3/26/2020
仅删除和文件对我有用*.repositories*.sha1
5赞 Alex 2/10/2021
对我不起作用。它说“无法解析项目 XXX 的依赖项:无法在脱机模式下访问 xxxx (https:/xxxx.com/repository/maven/),并且以前未从中下载过工件 xxxx:test:war:1.0.0。
2赞 GJohannes 9/29/2020 #8

我遇到了完全相同的问题。运行而不是解决它。 只有在使用 multi-maven-project 时才会出现差异,因为项目依赖项是使用 install 上传到本地存储库的。mvn clean installmvn clean compile

5赞 ThoR 10/15/2020 #9

即使考虑上述所有答案,您仍可能遇到一些问题,这些问题将终止您的 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 中的建议调整本地缓存。

此外,请注意设置中的参数 <localRepositoryin>.xml指向本地 Maven 存储库的正确文件夹。

评论

0赞 ennth 11/16/2021
我的设置中没有 localRepository 属性.xml....谢谢兄弟
0赞 cb4 12/5/2021
@ThoR 你的回答很有帮助。请记住,并非每个人都具有与您相同的配置。按照你显示的方式设置我的本地存储库会破坏 maven,哈哈。只需说“将设置中的 <localRepository>.xml 文件指向正确的文件夹”,而不是最后一个代码片段。
1赞 ThoR 12/7/2021
@cb4 你是对的。代码片段是特定的,因为它侧重于用户特定的设置.xml和存储库文件夹。谢谢你的提示。说明已改编。
0赞 Dibyendu Adhikary 3/12/2021 #10

使用 <classpathentry kind=“var” path=“M2_REPO/您的 jar 位置 无需创建任何可验证的环境

评论

1赞 alelom 3/12/2021
嗨,感谢您对 StackOverflow 的贡献。请考虑在发布之前为您的答案添加更多详细信息。另外,请记住使用正确的样式。你的答案似乎也不完整。请对其进行编辑,否则您可能会招致反对票和强制删除。
0赞 Felipe 12/9/2021 #11

只是为了给我 2 美分。对我来说,只需要在目录中找到 jar 并使用其版本。所以,使用后~/.m2/repository

cd local-dependency/
mvn install

罐子将在local-dependency.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>
1赞 NeilB 4/26/2023 #12

我遇到了同样的问题。对我来说,这是 pom.xml 中缺少的 SNAPSHOT 文本。看起来,如果我们想强制 maven 从本地构建,我们需要提供 -SNAPSHOT:

<dependency>
    <groupId>com.ABC</groupId>
    <artifactId>QRS</artifactId>
    <version>1.2.65-SNAPSHOT</version>
</dependency>