提问人:Dave 提问时间:11/5/2015 最后编辑:Ahmad ShahwanDave 更新时间:9/1/2023 访问量:363303
如何强制 Maven 使用我的本地存储库,而不是转到远程存储库来检索工件?
How do I force Maven to use my local repository rather than going out to remote repos to retrieve artifacts?
问:
我在 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 总是首先检查您的本地存储库,但是,您的依赖项需要安装在您的存储库中,以便 maven 找到它。
首先在依赖项模块中运行,然后生成依赖项模块。mvn install
评论
依赖项具有快照版本。对于快照,Maven 将检查本地存储库,如果在本地存储库中找到的项目太旧,它将尝试在远程存储库中查找更新的项目。这可能就是你所看到的。
请注意,此行为由存储库配置中的 updatePolicy
指令控制(默认情况下,快照存储库)。daily
评论
就我而言,我有一个和你一样的多模块项目。我必须更改我的项目所依赖的外部库之一的组 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 文件中定义此依赖项的子模块的相应部分。
这让我非常疯狂,因为该模块在本地可用。
评论
使用,您可以看到选项列表。mvn --help
有一个选项,如-nsu,--no-snapshot-updates Suppress SNAPSHOT updates
所以使用命令可以强制编译本地仓库。mvn install -nsu
评论
-o
要真正强制 maven 只使用本地存储库,可以使用 .告诉 maven 让您“离线”工作,并且它将远离网络。mvn <goals> -o
-o
评论
mvn dependency:go-offline
-o 选项对我不起作用,因为工件仍在开发中,尚未上传,并且 maven (3.5.x) 仍然尝试从远程存储库下载它,因为这是第一次,根据我得到的错误。
但是,这为我解决了它:https://maven.apache.org/general.html#importing-jars
手动安装后,也无需使用脱机选项。
更新
我刚刚重建了依赖项,我不得不重新导入它:常规对我来说是不够的mvn clean install
请按照以下步骤操作:
- 确保删除位于本地的 jar 文件夹的所有内容,但要保留的 jar 除外。
例如,.repositories、.pom、.sha1、.lastUpdated 等文件。
- 确保删除位于本地的 jar 文件夹的所有内容,但要保留的 jar 除外。
- 执行命令
mvn clean install -o
- 执行命令
这将有助于使用本地存储库 jar 文件,而不是连接到任何存储库。
评论
*.repositories
*.sha1
我遇到了完全相同的问题。运行而不是解决它。
只有在使用 multi-maven-project 时才会出现差异,因为项目依赖项是使用 install 上传到本地存储库的。mvn clean install
mvn clean compile
即使考虑上述所有答案,您仍可能遇到一些问题,这些问题将终止您的 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 存储库的正确文件夹。
评论
使用 <classpathentry kind=“var” path=“M2_REPO/您的 jar 位置 无需创建任何可验证的环境
评论
只是为了给我 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>
我遇到了同样的问题。对我来说,这是 pom.xml 中缺少的 SNAPSHOT 文本。看起来,如果我们想强制 maven 从本地构建,我们需要提供 -SNAPSHOT:
<dependency>
<groupId>com.ABC</groupId>
<artifactId>QRS</artifactId>
<version>1.2.65-SNAPSHOT</version>
</dependency>
评论
settings.xml