【发布时间】:2021-04-11 11:55:50
【问题描述】:
我正在尝试构建一个具有 docker Multi-Stage 能力的 scala 项目。
首先,这是我的 dockerfile:
FROM maven:3.6.0-jdk-11-slim AS maven
RUN apt-get update
WORKDIR /build
COPY pom.xml .
RUN mvn -B de.qaware.maven:go-offline-maven-plugin:resolve-dependencies
COPY src src
RUN mvn -B -o install spring-boot:repackage
FROM openjdk:11.0.6
WORKDIR /opt/app
COPY --from=maven /build/target/app.jar app.jar
CMD ["java", "-jar", "/opt/app/app.jar"]
EXPOSE 8080
我注意到在完成 resolve-dependencies 部分后,maven 仍然尝试在安装阶段下载依赖项。我得到的错误与 scala-maven-plugin 有关,该插件正在寻找在解析阶段未获取的不存在的依赖项。错误如下所示:
未能执行目标 net.alchim31.maven:scala-maven-plugin:3.4.0:compile (default) on 项目应用程序:包装: org.apache.maven.artifact.resolver.ArtifactNotFoundException:不能 访问...在 离线模式和神器 org.scala-lang:scala-compiler:jar:2.11.12 尚未从 以前的。
即使添加此依赖项也不够,因为它在其他依赖项上失败。
POM 中的插件长这样:
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.4.0</version>
<executions>
<execution>
<goals>
<!-- Need to specify this explicitly, otherwise plugin won't be called when doing e.g. mvn compile -->
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<args>
<!-- work-around for https://issues.scala-lang.org/browse/SI-8358 -->
<arg>-nobootcp</arg>
<arg>-Yresolve-term-conflict:package</arg>
</args>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
</plugin>
似乎插件并没有停止并再次下载所有内容。 谢谢各位。。
【问题讨论】:
-
为什么要构建maven?为什么要在 docker 内部构建?看起来像 x/y 问题
-
@cchantep 我在 docker 内部构建以利用多阶段功能来避免每次构建时下载所有库。对于 maven 部分 - 为什么不使用 maven?
-
问题不在于多级,而在于 docker 本身。在内部构建会增加显着的开销,这对于增量构建来说是很少能接受的。至于 maven ... SBT 是 Scala 的第一个公民构建工具 ...
标签: scala maven build dependencies offline