如何强制 Maven 使用本地存储库而不是前往远程存储库来检索工件?

问题描述 投票:0回答:11

我在 Mac Yosemite 上使用 Maven 3.3.3 和 Java 8。我有一个多模块项目。

    <modules>
            <module>first-module</module>
            <module>my-module</module>
                …
    </modules>

当我使用“mvn clean install”构建我的一个子模块(例如上面的“my-module”)时,构建会尝试从我在 ~/.bashrc 中定义的远程存储库下载子模块工件。 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 repository maven-3 artifacts
11个回答
73
投票

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

请注意,此行为由存储库配置中的

updatePolicy
指令控制(快照存储库默认为
daily
)。


68
投票

使用

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

有一个类似

-nsu,--no-snapshot-updates             Suppress SNAPSHOT updates

的选项

因此使用命令

mvn install -nsu
可以强制使用本地存储库进行编译。


34
投票

要真正强制maven使用本地存储库,您可以使用

mvn <goals> -o
运行。
-o
告诉 maven 让你“离线”工作,并且它将远离网络。


11
投票

请按照以下步骤操作:

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

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


7
投票

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

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

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


6
投票

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

首先在依赖模块中运行

mvn install
,然后构建依赖模块。


5
投票

即使考虑了上述所有答案,您仍然可能会遇到问题,从而导致您的 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 中的参数 指向本地 Maven 存储库的正确文件夹。


2
投票

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

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

手动安装后,也无需使用离线选项。

更新

我刚刚重建了依赖关系,我必须重新导入它:常规的

mvn clean install
对我来说还不够


2
投票

我也遇到了完全相同的问题。运行

mvn clean install
而不是
mvn clean compile
解决了这个问题。 仅在使用 multi-maven-project 时才会出现差异,因为项目依赖项是通过使用 install 上传到本地存储库的。


1
投票

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

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

0
投票

使用

只是给我 2 美分。对我来说,只需要在

~/.m2/repository
目录中找到 jar 并使用它的版本。所以,使用后

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>
© www.soinside.com 2019 - 2024. All rights reserved.