Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在开发环境中使用maven docker来避免重复下载JAR?_Java_Maven_Docker_Docker Compose_Development Environment - Fatal编程技术网

Java 如何在开发环境中使用maven docker来避免重复下载JAR?

Java 如何在开发环境中使用maven docker来避免重复下载JAR?,java,maven,docker,docker-compose,development-environment,Java,Maven,Docker,Docker Compose,Development Environment,这是我的Dockerfile,但是如果我更改了java代码,然后在terminal中输入“docker compose up-d--build”,maven将重新下载JAR,如何避免重复下载 Dockerfile: FROM maven:3.5.0-jdk-8 WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn verify ENTRYPOINT ["java","-jar","target/cloud-user.jar"] version:

这是我的Dockerfile,但是如果我更改了java代码,然后在terminal中输入“docker compose up-d--build”,maven将重新下载JAR,如何避免重复下载

Dockerfile:

FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn verify
ENTRYPOINT ["java","-jar","target/cloud-user.jar"]
version: "2"
services:
  user:
    build: user
    volumes:
      - $HOME/.m2/repository:/root/.m2/repository
      - ./user/src:/app/src
    ports:
      - "8080:8080"
FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
ENTRYPOINT ["mvn","spring-boot:run"]
docker-compose.yml:

version: "2"
services:
  cloud-nginx:
    build: cloud-nginx
    image: registry.cn-beijing.aliyuncs.com/wangdali/cloud-nginx
    restart: always
    ports: ["80:80"]
  cloud-consul:
    image: consul:0.9.2
    command: consul agent -dev -client 0.0.0.0
  cloud-front:
    build: cloud-front
    image: registry.cn-beijing.aliyuncs.com/wangdali/cloud-front
    restart: always
    volumes:
      - ./cloud-front/static:/app
  cloud-user:
    build: cloud-user
    image: registry.cn-beijing.aliyuncs.com/wangdali/cloud-user
    restart: always
  mysql: 
    image: mysql:5.7.19
    hostname: mysql
    volumes: 
      - ./docker/mysql/data:/var/lib/mysql 
      - ./docker/mysql/conf:/etc/mysql/conf.d 
      - /etc/localtime:/etc/localtime
    ulimits: 
      nproc: 65535
    mem_limit: 1024m 
    restart: always 
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3306:3306"
FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
ENTRYPOINT ["mvn","spring-boot:run"]

我简化了我的测试项目,然后使用maven的springboot插件

mvn spring启动:运行

要启动项目,现在先打开mount.m2文件夹,然后运行mvn命令。 但是在我修改java源代码后,它并没有被devtools自动加载,如何解决

这是我的Dockerfile/docker-compose.yml:

Dockerfile:

FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn verify
ENTRYPOINT ["java","-jar","target/cloud-user.jar"]
version: "2"
services:
  user:
    build: user
    volumes:
      - $HOME/.m2/repository:/root/.m2/repository
      - ./user/src:/app/src
    ports:
      - "8080:8080"
FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
ENTRYPOINT ["mvn","spring-boot:run"]
docker-compose.yml:

version: "2"
services:
  cloud-nginx:
    build: cloud-nginx
    image: registry.cn-beijing.aliyuncs.com/wangdali/cloud-nginx
    restart: always
    ports: ["80:80"]
  cloud-consul:
    image: consul:0.9.2
    command: consul agent -dev -client 0.0.0.0
  cloud-front:
    build: cloud-front
    image: registry.cn-beijing.aliyuncs.com/wangdali/cloud-front
    restart: always
    volumes:
      - ./cloud-front/static:/app
  cloud-user:
    build: cloud-user
    image: registry.cn-beijing.aliyuncs.com/wangdali/cloud-user
    restart: always
  mysql: 
    image: mysql:5.7.19
    hostname: mysql
    volumes: 
      - ./docker/mysql/data:/var/lib/mysql 
      - ./docker/mysql/conf:/etc/mysql/conf.d 
      - /etc/localtime:/etc/localtime
    ulimits: 
      nproc: 65535
    mem_limit: 1024m 
    restart: always 
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3306:3306"
FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
ENTRYPOINT ["mvn","spring-boot:run"]

已解决,我将目标文件夹装载到容器中,它可以自动加载,这是最终的dockerfile和docker-compose.yml,当然,在生产环境中,我们不能写入:

Dockerfile:

FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn verify
ENTRYPOINT ["java","-jar","target/cloud-user.jar"]
version: "2"
services:
  user:
    build: user
    volumes:
      - $HOME/.m2/repository:/root/.m2/repository
      - ./user/src:/app/src
    ports:
      - "8080:8080"
FROM maven:3.5.0-jdk-8
WORKDIR /app
COPY pom.xml .
COPY src ./src
ENTRYPOINT ["mvn","spring-boot:run"]
docker-compose.yml

version: "2"
services:
  user:
    build: user
    volumes:
      - $HOME/.m2/repository:/root/.m2/repository
      - ./user/target:/app/target
    ports:
      - "8080:8080"
      - "5005:5005"
pom.xml:

    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>cn.codeforfun.Application</mainClass>
          <jvmArguments>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005</jvmArguments>
        </configuration>
      </plugin>
    </plugins>

org.springframework.boot
springbootmaven插件
cn.codeforfun.Application
-agentlib:jdwp=transport=dt_套接字,服务器=y,挂起=n,地址=5005

将本地cach
$HOME/.m2/存储库装载到docker映像中……但为什么要在docker容器中构建?为什么不简单地通过Dockerfile将最终生成的war/jar文件复制到Docker容器中呢?@khmarbaise最初,我想添加jar并在容器中运行它,但代码在开发过程中更改更频繁,而且过程似乎太单调乏味。然后我考虑将$HOME/.m2/存储库作为容器中的数据卷,但我尝试了很多次,在执行mvn verify之前,没有弄清楚如何将.m2目录装入容器。@khmarbaise非常感谢您的建议。使用docker compose,您可以为m2使用命名卷,因此您可以使用卷:(卷:\n-m2data:/root/.m2/repository)而不是装载自己的.m2目录,然后在卷部分下指定m2data。当您上下组合时,它将保持卷在周围,因此每个连续的开始都将重用您的依赖项。您可以手动删除卷,也可以通过向docker compose down命令添加-v来删除卷。希望我在没有格式的情况下有意义。@NielsBechNielsen非常感谢你。你的建议给了我很大的启发,我想我需要尝试更多次。