11

我在我的项目中使用 maven,我需要在非 Internet 访问机器上运行构建。

当我测试我的项目构建时,一切正常,但是当我在未来运行构建时,maven 尝试更新 mvn-plugins并且这个sh t* 正在破坏我的构建。

我的配置文件:来自 mvn 的settings.xml 。

    <profile>
      <id>blaProfile</id>
      <repositories>
        <repository>
          <id>blaRepo</id>
          <url>file://${bla.3rdParty.home}/maven/.m2/repository</url>
          <layout>default</layout>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>blaRepo</id>
          <url>file://${bla.3rdParty.home}/maven/.m2/repository</url>
          <layout>default</layout>
        </pluginRepository>
      </pluginRepositories>
    </profile>

  <activeProfiles>
    <activeProfile>blaProfile</activeProfile>
  </activeProfiles>

我用参数运行了我的 maven:

mvn -npu -bla.3rdParty.home="$(THE_CORRECT_PATH)" package

我看到 maven 尝试更新一些 mvn-plugins 一段时间,但是选项:

-npu,--no-plugin-updates      Suppress upToDate check for any relevant

应该适用于此更新。

好吧,等待一些帮助!

提前致谢!


更新(1):
我正在看的是我可以使用以下设置:

<usePluginRegistry>true</usePluginRegistry>

在我的settings.xml中,我将在 ${user.home}/.m2 中有一个plugin-registry.xml,我可以配置和强制执行 maven 插件版本。

但它不工作!:(

4

6 回答 6

10

在离线之前运行以下命令:

mvn dependency:go-offline

这会将构建项目所需的所有依赖项和插件下载到 ~/.m2/repository 中。

运行后,您现在可以使用“-o”标志离线构建项目:

mvn install -o
于 2009-08-07T15:49:55.610 回答
5

为了将插件缓存到 .m2/repository 文件夹中,您需要使用mvn <maven-plugin-name>:help

您还需要在 pom.xml 的<plugins>or<pluginsManagement>部分中为每个插件指定显式版本

<plugin> 
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.19</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <artifactId>surefire-testng</artifactId>
      <version>2.19</version>
    </dependency>
  </dependencies>
</plugin>

这需要确保mvn install -o使用相同的插件版本。

当然,您还需要运行mvn dependency:go-offline来处理您的编译和测试依赖项。

mvn assembly:help compiler:help enforcer:help exec:help failsafe:help install:help jar:help resources:help surefire:help mvn dependency:go-offline mvn compile --offline

于 2016-09-05T18:47:46.050 回答
5

Maven 下线 + 隔离 Docker 多阶段镜像构建

我的答案是针对本地构建或 Dockerized 环境,这与构建 docker 映像的性质不同。这使用 Maven 3.6.3-jdk-8

有了这个答案,您就可以确切地知道您的 CI 在下载、编译、测试、打包上花费了多少时间……

最后,还回答了关于 Jira 下线的旧问题https://issues.apache.org/jira/browse/MDEP-82?focusedCommentId=16997793&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment -tabpanel#comment-16997793

  • 更新pom.xml依赖项
    • maven-dependency-plugin
    • surefire-junit-platform
  • 调用go-offline解析依赖
  • mvn使用开关调用任何命令--off-line

设置最新版本的插件

@@ -23,6 +23,9 @@
         <junit-jupiter.version>5.5.2</junit-jupiter.version>
         <common-io.version>2.6</common-io.version>
         <jacoco-maven-plugin.version>0.8.4</jacoco-maven-plugin.version>
+        <!-- https://issues.apache.org/jira/browse/MDEP-82 -->
+        <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
+        <surefire-junit-platform.version>2.22.2</surefire-junit-platform.version>
         <maven-release-plugin.version>2.5.3</maven-release-plugin.version>
         <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
         <maven-surefire-report-plugin.version>2.22.2</maven-surefire-report-plugin.version>
...
...
     <build>
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>${maven-dependency-plugin.version}</version>
+            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
@@ -135,6 +143,11 @@
                     <target>${java.version}</target>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.surefire</groupId>
+                <artifactId>surefire-junit-platform</artifactId>
+                <version>${surefire-junit-platform.version}</version>
+            </plugin>

创建 Go-offline 缓存

  • 这将确保下载所有依赖项
  • 3m以上下载所有依赖
FROM maven:3.6.3-jdk-8 AS dependencies-downloaded
...
...
COPY pom.xml /usr/src/app/pom.xml
COPY settings.xml /usr/src/app/settings.xml
WORKDIR /usr/src/app
RUN mvn -f pom.xml -s settings.xml dependency:resolve-plugins dependency:go-offline

在此处输入图像描述

使用 --offline 调用编译

  • 我们可以重复使用相同的图像进行编译
  • 只需要 7 秒,因为没有下载任何内容
FROM dependencies-downloaded AS compile
COPY app /usr/src/app
WORKDIR /usr/src/app
RUN mvn -f pom.xml -s settings.xml compile --offline

在此处输入图像描述

使用 --offline 调用测试

  • 我们可以重复使用相同的图像进行测试
  • 用 18 秒运行测试用例,无需任何下载
FROM compile AS tests
WORKDIR /usr/src/app
RUN mvn -f pom.xml -s settings.xml test --offline

在此处输入图像描述

使用 --offline 调用包

  • 我们可以为最终的 jar 重用相同的图像
  • 甚至跳过在之前的 docker 镜像中运行的测试
  • 采取的方式比以前少
FROM tests AS package
WORKDIR /usr/src/app
RUN mvn -f pom.xml -s settings.xml package -Dmaven.test.skip=true --offline

在此处输入图像描述

最终的运行时映像是包中的 Docker 映像。

FROM JRE
COPY --from package /usr/src/app/target /bin
...
...
于 2019-12-17T02:38:27.443 回答
4

mvn clean install在您的代码上运行 a 就足够了。下次,当您在离线模式下运行它时,您可以使用以下选项:

mvn -Dmaven.repo.local=..\repository –o clean install

-o告诉 Maven不要尝试通过网络更新其依赖项,并与-Dmaven.repo.local您一起提供包含所有必需依赖项的存储库的路径。或者,您可以在localRepository标签中的 settings.xml 中添加存储库的路径,并添加一个<offline>true</offline>. 您可以在 Maven Eclipse 配置中进行相同的配置。

于 2012-09-27T11:18:10.387 回答
1

经过一些调试后,我发现maven-dependency-plugin3.1.1撰写本文时的版本)在指定时无法解析插件的依赖项,例如:

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <version>3.0.0-M3</version>
 <dependencies>
  <dependency>    <--- this is not going to be resolved by dependency:go-offline command !!!
   <groupId>org.apache.maven.surefire</groupId>
   <artifactId>surefire-junit4</artifactId>
   <version>3.0.0-M3</version>
  </dependency>
 </dependencies>
</plugin>

在那之后,我发现go-offline-maven-plugin哪个行得通!请参阅https://github.com/qaware/go-offline-maven-plugin了解更多信息。

<plugin>
 <groupId>de.qaware.maven</groupId>
 <artifactId>go-offline-maven-plugin</artifactId>
 <version>x.y.z</version>
</plugin>

当前版本可以在这里找到https://mvnrepository.com/artifact/de.qaware.maven/go-offline-maven-plugin和 Maven 问题在这里https://issues.apache.org/jira/browse/MDEP-82

于 2019-11-08T13:21:08.603 回答
0

我认为这是因为 Maven 没有本地可用的元数据来确定其插件版本是否正确。如果你为你的插件指定了确切的版本(无论如何这对于重现性来说是个好主意),它不需要做检查,所以不会尝试连接到远程存储库。

通过指定确切的版本,我的意思是在您项目的 POM 中,您应该将版本添加到插件声明中。例如:

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <!-- set the version explicitly-->
    <version>2.0</version>
  </plugin>
</plugins>

请注意,您还可以通过设置存储库镜像来强制 Maven 使用内部存储库而不是 Central。有关使用存储库管理器和镜像的更多详细信息,请参阅此答案。

在您包含的配置中,您将远程存储库设置为指向本地存储库,这不是一个好主意。要离线运行,您应该在命令行中传递 -o 或将其添加到您的 settings.xml:

<offline>true</offline>
于 2009-08-07T14:45:00.467 回答