Maven/Docker:缓存所有依赖项

Posted

技术标签:

【中文标题】Maven/Docker:缓存所有依赖项【英文标题】:Maven/Docker: cache all dependencies 【发布时间】:2019-03-24 08:28:17 【问题描述】:

我正在尝试在 docker 容器中构建/部署 Spring Boot。

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 at 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

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

[INFO] 从 spring-releases 下载:https://repo.spring.io/libs-release/org/codehaus/plexus/plexus-utils/1.5.15/plexus-utils-1.5.15.jar

如果我在离线模式下运行 mvn package,它会失败,因为它无法到达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>

但没有效果。

有什么想法吗? 谢谢!

【问题讨论】:

你知道这个创建 Docker 容器guide 吗?它使用dockerfile-maven-plugin,我发现它更容易。您能否进一步解释一下什么是“新的大量依赖项下载”,您如何执行构建? 也许您可以尝试jojovedder.blogspot.com/2009/04/… 或此 SO 线程中提到的一些建议:How do I configure Maven for offline development? 请在***.com/a/71066133/418599查看我的解决方案。 【参考方案1】:

我终于通过使用 go-offline-maven-plugin 找到了解决方案。

         <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

【讨论】:

以上是关于Maven/Docker:缓存所有依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Gradle离线如何缓存依赖项

缓存依赖中cachedependency对象

使用 github 操作缓存 npm 依赖项

安装依赖项后如何清理heroku中的缓存?

在 circleci 中缓存 npm 依赖项

在 Windows 上的 GitHub Actions 中缓存依赖项