2

我正在尝试为基于 maven 的 java 项目设置一个多阶段的 dockerfile。这是我目前使用的:

### STAGE 1: Build ###
FROM maven:3.6.1-jdk-8 as build

WORKDIR /usr/src/app

# Install app dependencies
COPY pom.xml .
RUN mvn dependency:go-offline

# Bundle app source
COPY src src
RUN mvn package

### STAGE 2: Production Environment ###
FROM jboss/wildfly:17.0.0.Final

COPY --from=build /usr/src/app/target/Appname.war /opt/jboss/wildfly/standalone/deployments/Appname.war

RUN /opt/jboss/wildfly/bin/add-user.sh admin admin123 --silent
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0"]

问题是关于mvn命令的。我看到它mvn dependency:go-offline下载了一些依赖项,这很棒。但随后会mvn package下载更多软件包。为什么?我怎样才能有两个步骤:

  • 一种用于解决和下载所有依赖项
  • 一种用于编译源代码和创建 .war 文件

编辑

使用mvn package -o,我找不到以下包:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:2.6:resources (default-resources) on project monolith: Execution default-resources of goal org.apache.maven.plugins:maven-resources-plugin:2.6:resources failed: Plugin org.apache.maven.plugins:maven-resources-plugin:2.6 or one of its dependencies could not be resolved: The following artifacts could not be resolved: org.apache.maven:maven-profile:jar:2.0.6, org.apache.maven:maven-repository-metadata:jar:2.0.6, org.apache.maven:maven-plugin-registry:jar:2.0.6, classworlds:classworlds:jar:1.1-alpha-2: Cannot access central (https://repo.maven.apache.org/maven2) in offline mode and the artifact org.apache.maven:maven-profile:jar:2.0.6 has not been downloaded from it before. -> [Help 1]

我认为这与pom.xml. 有什么想法吗?

<build>
    <finalName>Monolith</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.3</version>
            <!--<configuration>-->
                <!--<webXml>src\main\webapp\WEB-INF\web.xml</webXml>-->
            <!--</configuration>-->
        </plugin>
    </plugins>
</build>
4

2 回答 2

1

您很可能受到MDEP-82 go-offline / resolve-plugins 无法解决当前未解决的所有插件依赖问题的影响。

根据MDEP-82 问题中的此评论,这可以通过指定 maven-dependency-plugin 版本而不是使用默认版本来解决:

然后明确定义用于离线的 maven-dependency-plugin 版本不依赖于 Maven 内部定义的默认版本:

mvn -s settings.xml org.apache.maven.plugins:maven-dependency-plugin:2.8:go-offline

于 2019-06-20T08:55:15.717 回答
0

maven 依赖插件有一些限制,因此它不会下载所有依赖项。当您在本地工作时,这通常是可以的,因为一个mvn package命令就可以解决问题。

但这不太适合在 Docker 容器中运行的 maven。经过大量搜索,今天我偶然发现了go-offline-maven-plugin。我用我用来测试它的小项目尝试了它并且它有效。

以下是如何将其包含在您的 pom.xml 中:

<!-- ... -->
<build>
    <plugins>
        <plugin>
            <groupId>de.qaware.maven</groupId>
            <artifactId>go-offline-maven-plugin</artifactId>
            <version>1.2.1</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>
        <!-- ... -->
    </plugins>
    <!-- ... -->
</build>
<!-- ... -->

这些dynamicDependencies是依赖项,它们实际上并不存在于 anypom.xml中,而是硬编码在插件中。最常见的情况是 surefire 插件,它根据您的测试(例如 JUnit4/5、TestNG 等)加载所需的依赖项。

最后,您需要从Dockerfile. 这应该有效:

### STAGE 1: Build ###
FROM maven:3.6.1-jdk-8 as build

WORKDIR /usr/src/app

# Install app dependencies
COPY pom.xml .
RUN mvn -e -B de.qaware.maven:go-offline-maven-plugin:resolve-dependencies

# Bundle app source
COPY src src
RUN mvn -o -e -B package

### STAGE 2: Production Environment ###
FROM jboss/wildfly:17.0.0.Final

COPY --from=build /usr/src/app/target/Appname.war /opt/jboss/wildfly/standalone/deployments/Appname.war

RUN /opt/jboss/wildfly/bin/add-user.sh admin admin123 --silent
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0"]
于 2019-10-04T13:53:30.607 回答