Java Docker如何使用maven重新编译jar文件

Java Docker如何使用maven重新编译jar文件,java,docker,maven,Java,Docker,Maven,我是docker的新手,我正在尝试为SpringBoot项目设置docker 这是我的文件 FROM maven:3.6.3-jdk-11-slim AS build WORKDIR usr/src/springboot COPY . ./ RUN mvn install RUN mvn clean package # # Package stage # FROM openjdk:11-jre-slim ARG JAR_NAME="springboot-0.0.1-SNAPSHOT

我是docker的新手,我正在尝试为SpringBoot项目设置docker

这是我的文件

FROM maven:3.6.3-jdk-11-slim AS build
WORKDIR usr/src/springboot
COPY . ./
RUN mvn install
RUN mvn clean package 
#
# Package stage
#
FROM openjdk:11-jre-slim 
ARG JAR_NAME="springboot-0.0.1-SNAPSHOT"
WORKDIR /usr/src/springboot
EXPOSE 8080
COPY --from=build /usr/src/springboot/target/${JAR_NAME}.jar ./springboot.jar
CMD ["java","-jar", "./springboot.jar"]
它工作完全正常,我可以从localhost:8080访问hello world

但我的困惑是如何使java文件中的任何更改反映在docker容器中?如何重新编译.jar文件

我尝试了类似于docker exec-it strange_shaw的“mvn清洁包”

但它抛出错误
exec:“mvn clean package”:在$PATH中找不到可执行文件:unknown

当您在Dockerfile中使用double-FROM指令时,Docker将只保留最新的FROM并使用以前的FROM构建下一个

因此很容易找到这个错误,因为maven:3.6.3-jdk-11-slim AS build中的仅用于从openjdk:11 jre slim中构建下一步,并将从最终映像中删除(此策略用于最小化docker映像大小)


我希望这能让你对Dockerfile有一个清晰的认识。在Dockerfile完成后,在外面构建你的jar如下:

来自openjdk:11jre-slim的

ARG JAR_NAME=“springboot-0.0.1-SNAPSHOT”
WORKDIR/usr/src/springboot
曝光8080
复制/usr/src/springboot/target/${JAR_NAME}.JAR./springboot.JAR
CMD[“java”、“-jar”、“/springboot.jar”]

问题在于容器中没有安装maven。所以我把我的Dockerfile改为

FROM openjdk:11
ARG JAR_NAME="springboot-0.0.1-SNAPSHOT"
WORKDIR /usr/src/springboot
EXPOSE 8080
#COPY --from=build /usr/src/springboot/target/${JAR_NAME}.jar ./springboot.jar
#CMD ["java","-jar", "./springboot.jar"]
RUN apt-get update; apt-get install curl -y

ARG MAVEN_VERSION=3.6.3

# 2- Define a constant with the working directory
ARG USER_HOME_DIR="/root"

# 4- Define the URL where maven can be downloaded from
ARG BASE_URL=https://apache.osuosl.org/maven/maven-3/${MAVEN_VERSION}/binaries

# 5- Create the directories, download maven, validate the download, install it, remove downloaded file and set links
RUN mkdir -p /usr/share/maven /usr/share/maven/ref \
  && echo "Downloading maven" \
  && curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
  \
  && echo "Unziping maven" \
  && tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 \
  \
  && echo "Cleaning and setting links" \
  && rm -f /tmp/apache-maven.tar.gz \
  && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn

# 6- Define environmental variables required by Maven, like Maven_Home directory and where the maven repo is located
ENV MAVEN_HOME /usr/share/maven
ENV MAVEN_CONFIG "$USER_HOME_DIR/.m2"
这将在容器中安装maven并设置$PATH

docker run -it -v "$(pwd)":/usr/src/springboot -p 8080:8080 spring-boot-app
运行上述命令以启动容器,并将项目文件夹映射到容器文件夹,将本地端口映射到容器端口。所以,若您在项目中做了任何更改,这两者都是同步的

docker exec -it <container_name> mvn verify
docker exec-it mvn验证
上面的命令将创建.jar文件。重新启动容器

docker exec -it <container_name> java -jar target/<file_name>.jar
docker exec-it java-jar target/.jar

将在端口8080中执行jar文件,并可在本地主机中访问:8080

首先安装所有
install
,然后
clean package
尝试mvn clean install,这是没有意义的,只有
mvn verify
就足够了。除此之外还有一个问题:您是否需要在容器中构建?我建议在容器外部构建(速度更快),只需将最终的jar复制到容器中即可。此外,您可以配置
${project.artifactId}..
,并且您总是可以获得
target/aname
,而不需要简化到容器中的版本…@khmarbaise是的,我想在容器外部构建。执行该操作的命令是什么?
mvn clean verify
?那么我该如何声明maven?您只需要在第一个阶段内执行该操作,然后从第二个阶段开始执行。如果我对java文件进行了任何更改,我不应该再次重新创建整个图像,这对我来说没有意义。我只想用maven重新编译jar文件并将其复制到容器中。那么,我需要在dockerfile中做什么更改呢?是的,如果您在外部使用IDE(intellij,eclipse)构建jar文件,您可以只保留包阶段:您需要重建整个映像,就像重建整个
.jar
文件一样。