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


97

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

    <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 /存储库?以下是在〜/ .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

2
在尝试从远程存储库下载工件之前,Maven 检查您的本地存储库。在尝试构建之前,您确定本地人具有这些工件吗?您现在可以检查本地存储库,然后尝试再次构建。另外,您可以指定本地存储库在中的位置settings.xml(请参阅此处)。
mystarrocks 2015年

尽管我没有在settings.xml文件中指定存储库,但这是Maven为我设置的默认设置-〜/ .m2 / repository。即使是默认值,我也必须指定它吗?
戴夫

对我来说,本地存储库中还有其他文件,例如* .sha1或* .lastUpdate。删除* .jar和* .pom之外的其他文件将阻止maven从远程存储库重新下载文件
Harun

Answers:


45

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

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


16
是否可以通过控制台命令参数“覆盖”此内容?就像:mvn全新安装-FORCE_COMMAND
Naxos84 '16

21
“太老了”的意思是什么?它选择可以找到的最新快照,无论是本地快照还是远程快照?那肯定是可怕的行为。如果我刚刚构建了快照,则我真的想使用该快照,而不是CI构建仅在稍后创建的快照。
汤姆·夸伦登

请进一步解释“太旧”的含义了吗?
DJO丛BANG

32

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

有一个像 -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

因此,use命令mvn install -nsu可以强制使用本地存储库进行编译。


10
您也可以使用-o“离线”行家行为
Sean

8
-nsu选项不会阻止mvn尝试远程下载文件(如果尚未下载),而不是像使用本地文件构建和安装本地文件那样使用本地版本。–
user1767316 '18

我有一个同样的问题,就是尚未下载工件,这对我来说已经解决了:maven.apache.org/general.html#importing-jars
Luigi Cristalli,

15

要真正迫使 Maven 使用本地存储库,可以运行mvn <goals> -o。该-o告诉Maven让你“脱机”,而且将保持关闭网络。


5
-o选项不会阻止mvn尝试远程下载失败的文件(如果尚未下载),而不是像在本地构建和安装该文件那样使用本地版本。
user1767316 '18

2
没错-如果您没有本地副本,那么您就不走运了。这对于您之前构建的项目很有用,但可能会导致您不关心SNAPSHOT的最新更改。
肖恩

甚至即使您从未构建过该项目,也可以使用mvn dependency:go-offline
Aldian

如果您有刚安装的本地副本(因此它从未在远程快照存储库中部署/可用)怎么办?
Vivek Chavda

1
啊,我刚刚创建了一个带有依赖项集合的pom项目,但是没有在使用项目中指定<type> pom </ type>,所以它正在寻找一个jar(当然也找不到它)在离线模式下)
Vivek Chavda

4

就我而言,我和您一样有一个多模块项目。我不得不更改我的项目所依赖的一个外部库的组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文件中定义了这种依赖性。

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


4

请按照以下步骤操作:

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

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


1
仅移除*.repositories*.sha1文件为我工作
DLight

2

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

但这为我修复了它:https : //maven.apache.org/general.html#importing-jars

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

更新

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


-1

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

mvn install首先在依赖模块中运行,然后构建依赖模块。


1
我已经编辑了我的问题,以显示该工件在存储库中(请注意我运行的“ ls -al”命令。但是Maven仍试图下载它。还有其他想法吗?)
Dave 2015年

5
@Oliver:您缺少以下事实:对于本地存储库中的工件,如果工件是太旧的快照,则Maven可能仍会查询远程存储库。
Andreas Veithen 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.