当前位置: 首页 > 知识库问答 >
问题:

Maven/Docker:缓存所有依赖项

丰飞龙
2023-03-14

我正在尝试在 Docker 容器中构建/部署Spring启动。

FROM maven:3.5.3-jdk-8-slim AS build
COPY ./pom.xml /app/pom.xml
RUN cd /app
RUN mvn -f /app/pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:go-offline dependency:resolve-plugins -B
COPY . /app
RUN mvn -f /app/pom.xml -s /usr/share/maven/ref/settings-docker.xml --batch-mode package -DskipTests

如您所见,我用第一个mvn命令缓存了所有的依赖项,这样我的代码应用程序中的每一个变化都不会触发新的大量依赖项下载。它适用于大多数依赖项,但仍有一些需要下载(即使缓存)。这是第二个mvn命令(包)的日志:

[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< xxx:xxx >----------------------
[INFO] Building xxxx 0.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- apt-maven-plugin:1.1.3:process (default) @ vsol-java ---
[INFO] Downloading from spring-releases: https://repo.spring.io/libs-release/org/apache/commons/commons-io/1.3.2/commons-io-1.3.2.pom
[INFO] Downloaded from spring-releases: https://repo.spring.io/libs-release/org/apache/commons/commons-io/1.3.2/commons-io-1.3.2.pom (0 B at 0 B/s)
[INFO] Downloading from spring-releases: https://repo.spring.io/libs-release/commons-io/commons-io/1.3.2/commons-io-1.3.2.pom
[INFO] Downloaded from spring-releases: https://repo.spring.io/libs-release/commons-io/commons-io/1.3.2/commons-io-1.3.2.pom (0 B at 0 B/s)
[INFO] Downloading from spring-releases: https://repo.spring.io/libs-release/org/apache/commons/commons-parent/3/commons-parent-3.pom
[INFO] Downloaded from spring-releases: https://repo.spring.io/libs-release/org/apache/commons/commons-parent/3/commons-parent-3.pom (0 B at 0 B/s)
[INFO] Downloading from spring-releases: https://repo.spring.io/libs-release/org/sonatype/plexus/plexus-build-api/0.0.7/plexus-build-api-0.0.7.jar
...

(顺便说一句,(0 B在0 B / s)有点奇怪...只是一张支票?

如果我基于第一个maven命令之后的步骤启动一个容器(mvn依赖关系:...)(应该缓存所有依赖项的那个)

root@3281a837a236:/usr/share/maven/ref/repository# ls -lh org/codehaus/plexus/plexus-utils/1.5.15
total 244K
-rw-r--r-- 1 root root  202 Oct 19 12:07 _remote.repositories
-rw-r--r-- 1 root root 223K Oct 19 12:07 plexus-utils-1.5.15.jar
-rw-r--r-- 1 root root   40 Oct 19 12:07 plexus-utils-1.5.15.jar.sha1
-rw-r--r-- 1 root root 6.7K Oct 19 12:07 plexus-utils-1.5.15.pom
-rw-r--r-- 1 root root   40 Oct 19 12:07 plexus-utils-1.5.15.pom.sha1

库似乎在那里,但是,我可以在mvn包的日志中看到这一点:

[信息]从spring-releases下载:https://repo . spring . io/libs-release/org/codehaus/plexus/plexus-utils/1 . 5 . 15/plexus-utils-1 . 5 . 15 . jar

如果我在离线模式下运行mvn包,它会失败,因为它不能到达https://repo.spring.io/libs-release.

所以它看起来像是缓存的,但maven仍然尝试下载这个文件。我已经在我的pom中尝试过这个.xml

        <pluginRepository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
        </pluginRepository>

但没有效果。

有什么想法吗?谢谢!

共有1个答案

程禄
2023-03-14

我最终通过使用go offline maven插件找到了解决方案。

         <plugin>
            <groupId>de.qaware.maven</groupId>
            <artifactId>go-offline-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <dynamicDependencies>
                    <DynamicDependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit4</artifactId>
                        <version>2.20.1</version>
                        <repositoryType>PLUGIN</repositoryType>
                    </DynamicDependency>
                </dynamicDependencies>
            </configuration>
        </plugin>

并尝试使用以下方法获取所有依赖项:

mvn de.qaware.maven:go-offline-maven-plugin:resolve-dependencies
 类似资料:
  • 我正在做一个有大约200MB依赖项的项目,我希望避免由于带宽有限而导致的无用上传。 当我推我的Dockerfile(我一会儿会附上)时,我总是有一个~200MB的上传,即使我没有碰pom.xml: 这个Dockerfile应该生成一个200MB的fatJAR,包括所有依赖项,这就是为什么每次都会发生~200MB的上传。我想要实现的是构建一个包含所有依赖项的层,并“告诉”打包阶段不要将依赖项JAR包

  • 我正在使用sh文件,其中包含所有专家配置,密钥,专家命令。当我运行容器时,它每次都会一次又一次地下载依赖项,它无法缓存依赖项。 下面是我的Dockerfile的外观: 下面是Test.sh文件 当我创建docker映像并运行容器时,每当我运行它时,它就会一次又一次地下载依赖项。

  • 问题内容: 我需要将我们的maven build java项目发布给远程质量检查团队。为此,我想下载所有依赖项,并发送给他们,这样他们就不需要下载它们了。 当前,所有依赖项都在pom.xml文件中定义,并且我们使用mvn install或mvn包来构建项目。一些项目成员使用uber jars,其他一些项目则使用jars +依赖项来执行。 什么是最简单的方法来预打包相关的jar文件,以使从Inter

  • 我有一个简单的Quarkus应用程序,我尝试使用以下多级Dockerfile构建它。 还有pom.xml 构建工作正常,它下载maven依赖项,然后它创建. jar并在最终容器中运行. jar。但是如果我更改源代码中的某些内容并保持pom.xml不变,依赖项会再次下载。似乎并没有下载所有依赖项。 有没有办法以这种方式加速docker构建?例如,我对Spring Boot做了同样的事情,那里一切都很

  • 我正试图让maven下载所有的依赖项(编译、测试、插件等)。)这样我就可以避免让我们的dockerized构建浪费不必要的时间一遍又一遍地下载它们。 我们已经对maven build进行了dockerized,这样我们就可以从jenkins运行它,而无需在jenkins机器上安装大量构建特定的依赖项(Java、redis、maven依赖项等)。我们的构建依赖于增量docker构建,它只执行实际需要

  • 对于我的一些模块,Intellij的想法不是导入依赖项和插件。只导入活循环。 当我在命令行编译时,POM是有效的。我已经删除了模块并重新导入它们。我删除了他们的项目,并重新导入它。 所以我想知道Intellij在模块上的想法信息被删除后是否有一些秘密缓存。