写点什么

没有 JDK 和 Maven,用 Docker 也能构建 Maven 工程

作者:程序员欣宸
  • 2022 年 5 月 31 日
  • 本文字数:8508 字

    阅读完需:约 28 分钟

没有JDK和Maven,用Docker也能构建Maven工程

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

场景

  • 在编译构建 Maven 工程的时候,以下两种情况偶尔会遇到:


  1. 当前电脑上没装 Maven,甚至 JDK 都没装;

  2. 当前电脑装了 JDK8,但要用 JDK7 编译构建当前工程;


  • 遇到上述情况,一般会将 JDK 和 Maven 装好并设置环境变量,再去编译构建 Maven 工程,但如果您的电脑已装了 Docker,就能利用 Maven 的官方镜像快速创建一个编译环境,省去在当前电脑上安装 JDK 和 Maven 的操作;

实战环境

  • 本次实战涉及的电脑操作系统和 Docker 版本信息如下:


  1. 电脑:Ubuntu 16.04.3 LTS

  2. Docker:17.03.2-ce

实战步骤

  • 接下来我们开始实战 Docker 下编译构建 Maven 工程,整个实战由以下两部分组成:


  1. 准备一个 Maven 工程;

  2. 确定要用的 Maven 镜像;

  3. 用 Docker 来编译构建 Maven 工程;

  4. 如何多次编译构建;

准备一个 Maven 工程

  1. 本次实战要编译的工程是 dubbo-2.6.2,工程源码下载地址:https://codeload.github.com/apache/incubator-dubbo/zip/dubbo-2.6.2

  2. 下载的是个压缩文件:incubator-dubbo-dubbo-2.6.2.zip,解压后是个文件夹:incubator-dubbo-dubbo-2.6.2;

  3. 在我的电脑上,incubator-dubbo-dubbo-2.6.2 文件夹的完整路径是:/usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2

确定要用的 Maven 镜像

  • 在正式编译前,要根据所需的 JDK 和 Maven 版本来决定用哪个 Maven 镜像;


  1. 例如本次编译的 JDK 我需要版本 1.7,Maven 我需要 3.5.3 版本;

  2. 浏览器打开网站:https://hub.docker.com,在顶部输入框输入"Maven",开始搜索,如下图红框:

  3. 搜索结果的第一位就是 Maven 的官方镜像,点击“DETAILS”按钮进入详情页,如下图红框:

  4. 详情页列出了多个 JDK 和 Maven 版本的组合,如下图红框中就是 JDK1.7 和 Maven3.5.3 的组合,红框中是对应的 TAG 名称是 3.5.3-jdk-7,所以我们要用的镜像就是:maven:3.5.3-jdk-7

Docker 下编译构建 Maven 工程

  • 执行以下命令即可创建 Maven 容器,并自动编译构建 dubbo 工程:


docker run -it \--name mvn001 \-v /usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2:/usr/src/mymaven \-w /usr/src/mymaven maven:3.5.3-jdk-7 \mvn clean package -U -DskipTests
复制代码


  • 以上的命令中有下面几处需要注意:

  • --name mvn001:表示容器名称为 mvn001;

  • -v /usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2:/usr/src/mymaven:表示将当前电脑的 /usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2 目录映射到 Docker 容器的/usr/src/mymaven 目录,也就是 dubbo 源码的目录

  • -w /usr/src/mymaven maven:3.5.3-jdk-7:表示容器的工作目录为/usr/src/mymaven maven:3.5.3-jdk-7;

  • mvn clean package -U -DskipTests:表示启动容器后在工作目录下执行的命令;

  • 上述 docker run 命令执行后,在控制台可以看到 Maven 工程的构建情况,我的电脑处理器是 Intel i5-6300HQ,耗时 16 分钟 40 秒完成构建,部分输出信息如下:


[INFO] ------------------------------------------------------------------------[INFO] Reactor Summary:[INFO][INFO] dubbo-parent 2.6.2 ................................. SUCCESS [04:01 min][INFO] Hessian Lite(Alibaba embed version) ................ SUCCESS [01:03 min][INFO] dubbo-common ....................................... SUCCESS [ 28.003 s][INFO] dubbo-container .................................... SUCCESS [  0.055 s][INFO] dubbo-container-api ................................ SUCCESS [  1.232 s][INFO] dubbo-container-spring ............................. SUCCESS [ 12.893 s][INFO] dubbo-container-log4j .............................. SUCCESS [  2.347 s][INFO] dubbo-container-logback ............................ SUCCESS [  7.851 s][INFO] dubbo-serialization ................................ SUCCESS [  0.038 s][INFO] dubbo-serialization-api ............................ SUCCESS [  1.243 s][INFO] dubbo-serialization-hessian2 ....................... SUCCESS [  2.962 s][INFO] dubbo-remoting ..................................... SUCCESS [  0.085 s][INFO] dubbo-remoting-api ................................. SUCCESS [  5.449 s][INFO] dubbo-remoting-netty ............................... SUCCESS [  6.837 s][INFO] dubbo-remoting-mina ................................ SUCCESS [  5.502 s][INFO] dubbo-remoting-grizzly ............................. SUCCESS [  9.261 s][INFO] dubbo-remoting-p2p ................................. SUCCESS [  2.661 s][INFO] dubbo-remoting-http ................................ SUCCESS [ 18.184 s][INFO] dubbo-remoting-zookeeper ........................... SUCCESS [ 18.372 s][INFO] dubbo-remoting-netty4 .............................. SUCCESS [  8.807 s][INFO] dubbo-rpc .......................................... SUCCESS [  0.078 s][INFO] dubbo-rpc-api ...................................... SUCCESS [  3.656 s][INFO] dubbo-rpc-dubbo .................................... SUCCESS [  3.874 s][INFO] dubbo-rpc-injvm .................................... SUCCESS [  2.041 s][INFO] dubbo-rpc-rmi ...................................... SUCCESS [  2.182 s][INFO] dubbo-rpc-hessian .................................. SUCCESS [  3.967 s][INFO] dubbo-rpc-http ..................................... SUCCESS [  3.702 s][INFO] dubbo-rpc-webservice ............................... SUCCESS [ 20.707 s][INFO] dubbo-cluster ...................................... SUCCESS [  4.267 s][INFO] dubbo-registry ..................................... SUCCESS [  0.035 s][INFO] dubbo-registry-api ................................. SUCCESS [  3.252 s][INFO] dubbo-monitor ...................................... SUCCESS [  0.105 s][INFO] dubbo-monitor-api .................................. SUCCESS [  2.197 s][INFO] dubbo-filter ....................................... SUCCESS [  0.038 s][INFO] dubbo-filter-validation ............................ SUCCESS [  2.611 s][INFO] dubbo-filter-cache ................................. SUCCESS [  3.488 s][INFO] dubbo-registry-default ............................. SUCCESS [  2.697 s][INFO] dubbo-monitor-default .............................. SUCCESS [  2.153 s][INFO] dubbo-registry-multicast ........................... SUCCESS [  2.201 s][INFO] dubbo-serialization-jdk ............................ SUCCESS [  2.756 s][INFO] dubbo-config ....................................... SUCCESS [  0.030 s][INFO] dubbo-config-api ................................... SUCCESS [ 14.171 s][INFO] dubbo-config-spring ................................ SUCCESS [  8.311 s][INFO] dubbo-rpc-thrift ................................... SUCCESS [ 10.473 s][INFO] dubbo-rpc-memcached ................................ SUCCESS [  3.533 s][INFO] dubbo-rpc-redis .................................... SUCCESS [  4.025 s][INFO] dubbo-rpc-rest ..................................... SUCCESS [ 25.898 s][INFO] dubbo-registry-zookeeper ........................... SUCCESS [  2.448 s][INFO] dubbo-registry-redis ............................... SUCCESS [ 11.810 s][INFO] dubbo-demo ......................................... SUCCESS [  0.045 s][INFO] dubbo-demo-api ..................................... SUCCESS [  0.970 s][INFO] dubbo-demo-provider ................................ SUCCESS [  1.461 s][INFO] dubbo-demo-consumer ................................ SUCCESS [  1.457 s][INFO] dubbo-plugin ....................................... SUCCESS [  0.037 s][INFO] dubbo-qos .......................................... SUCCESS [  6.069 s][INFO] dubbo-serialization-fastjson ....................... SUCCESS [  2.810 s][INFO] dubbo-serialization-kryo ........................... SUCCESS [  2.859 s][INFO] dubbo-serialization-fst ............................ SUCCESS [  3.499 s][INFO] dubbo-dependencies-bom ............................. SUCCESS [  4.641 s][INFO] dubbo-bom .......................................... SUCCESS [  0.009 s][INFO] dubbo-all .......................................... SUCCESS [05:26 min][INFO] dubbo-test ......................................... SUCCESS [  0.111 s][INFO] dubbo-test-benchmark ............................... SUCCESS [ 51.229 s][INFO] dubbo-test-compatibility ........................... SUCCESS [  0.103 s][INFO] dubbo-test-spring3 ................................. SUCCESS [  5.693 s][INFO] dubbo-test-integration ............................. SUCCESS [  0.203 s][INFO] dubbo-test-examples 2.6.2 .......................... SUCCESS [  3.866 s][INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 16:40 min[INFO] Finished at: 2018-05-20T13:53:50Z[INFO] ------------------------------------------------------------------------
复制代码


  • 构建成功后,去当前电脑的/usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2 目录下,打开每个子工程都能见到对应的 target 目录,以 dubbo-monitor/dubbo-monitor-api 为例,target 中的内容如下:


root@maven:/usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2/dubbo-monitor/dubbo-monitor-api/target# pwd/usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2/dubbo-monitor/dubbo-monitor-api/targetroot@maven:/usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2/dubbo-monitor/dubbo-monitor-api/target# lsclasses                      dubbo-monitor-api-2.6.2-sources.jar  generated-test-sources  maven-statusdubbo-monitor-api-2.6.2.jar  generated-sources                    maven-archiver          test-classes
复制代码

如何多次编译构建

  • 编译 Maven 工程成功后,由于容器中的 mvn 进程不再占有终端输出,会导致容器自动停止了,执行 docker ps -a 可以见到容器状态如下所示:


root@maven:~# docker ps -aCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES184591657e9c        maven:3.5.3-jdk-7   "/usr/local/bin/mv..."   30 minutes ago      Exited (0) About a minute ago                       mvn001
复制代码


  • 可见状态是 Exited (0),容器确实停止了;

  • 那么问题来了:如果我们修改代码后要再编译构建工程,该怎么做呢?再次通过 docker run 命令重新创建一个容器?新的容器要重新下载所有依赖的 jar 包,这太慢了;

  • 试试下面的方法:

  • 执行命令 docker start mvn001,将容器启动起来;

  • 执行命令 docker logs -f mvn001,你会发现容器已经开始自动编译构建了,以下是正在滚动中的控制台输出:


[INFO][INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ dubbo-rpc-api ---[INFO] Deleting /usr/src/mymaven/dubbo-rpc/dubbo-rpc-api/target[INFO][INFO] --- maven-enforcer-plugin:1.0:enforce (enforce-maven) @ dubbo-rpc-api ---[INFO][INFO] --- jacoco-maven-plugin:0.8.1:prepare-agent (jacoco-initialize) @ dubbo-rpc-api ---[INFO] jacocoArgLine set to -javaagent:/root/.m2/repository/org/jacoco/org.jacoco.agent/0.8.1/org.jacoco.agent-0.8.1-runtime.jar=destfile=/usr/src/mymaven/dubbo-rpc/dubbo-rpc-api/target/jacoco.exec[INFO][INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ dubbo-rpc-api ---[INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO] Copying 4 resources[INFO] Copying 0 resource to META-INF/[INFO] Copying 2 resources to META-INF/[INFO][INFO] --- maven-compiler-plugin:3.6.0:compile (default-compile) @ dubbo-rpc-api ---[INFO] Changes detected - recompiling the module![INFO] Compiling 62 source files to /usr/src/mymaven/dubbo-rpc/dubbo-rpc-api/target/classes[INFO]
复制代码


  • 静候构建结束,如下所示,这一次耗时 8 分钟 14 秒,明显减少了:


[INFO] ------------------------------------------------------------------------[INFO] Reactor Summary:[INFO][INFO] dubbo-parent 2.6.2 ................................. SUCCESS [  1.950 s][INFO] Hessian Lite(Alibaba embed version) ................ SUCCESS [  9.596 s][INFO] dubbo-common ....................................... SUCCESS [ 10.491 s][INFO] dubbo-container .................................... SUCCESS [  0.080 s][INFO] dubbo-container-api ................................ SUCCESS [  1.615 s][INFO] dubbo-container-spring ............................. SUCCESS [  2.636 s][INFO] dubbo-container-log4j .............................. SUCCESS [  2.465 s][INFO] dubbo-container-logback ............................ SUCCESS [  2.450 s][INFO] dubbo-serialization ................................ SUCCESS [  0.060 s][INFO] dubbo-serialization-api ............................ SUCCESS [  1.490 s][INFO] dubbo-serialization-hessian2 ....................... SUCCESS [  3.361 s][INFO] dubbo-remoting ..................................... SUCCESS [  0.082 s][INFO] dubbo-remoting-api ................................. SUCCESS [  6.229 s][INFO] dubbo-remoting-netty ............................... SUCCESS [  3.264 s][INFO] dubbo-remoting-mina ................................ SUCCESS [  2.826 s][INFO] dubbo-remoting-grizzly ............................. SUCCESS [  1.837 s][INFO] dubbo-remoting-p2p ................................. SUCCESS [  2.885 s][INFO] dubbo-remoting-http ................................ SUCCESS [  3.074 s][INFO] dubbo-remoting-zookeeper ........................... SUCCESS [  3.117 s][INFO] dubbo-remoting-netty4 .............................. SUCCESS [  3.162 s][INFO] dubbo-rpc .......................................... SUCCESS [  0.037 s][INFO] dubbo-rpc-api ...................................... SUCCESS [  4.591 s][INFO] dubbo-rpc-dubbo .................................... SUCCESS [  4.493 s][INFO] dubbo-rpc-injvm .................................... SUCCESS [  2.519 s][INFO] dubbo-rpc-rmi ...................................... SUCCESS [  2.615 s][INFO] dubbo-rpc-hessian .................................. SUCCESS [  2.821 s][INFO] dubbo-rpc-http ..................................... SUCCESS [  1.617 s][INFO] dubbo-rpc-webservice ............................... SUCCESS [  1.874 s][INFO] dubbo-cluster ...................................... SUCCESS [  5.554 s][INFO] dubbo-registry ..................................... SUCCESS [  0.088 s][INFO] dubbo-registry-api ................................. SUCCESS [  3.673 s][INFO] dubbo-monitor ...................................... SUCCESS [  0.053 s][INFO] dubbo-monitor-api .................................. SUCCESS [  2.580 s][INFO] dubbo-filter ....................................... SUCCESS [  0.022 s][INFO] dubbo-filter-validation ............................ SUCCESS [  1.583 s][INFO] dubbo-filter-cache ................................. SUCCESS [  2.794 s][INFO] dubbo-registry-default ............................. SUCCESS [  3.081 s][INFO] dubbo-monitor-default .............................. SUCCESS [  2.577 s][INFO] dubbo-registry-multicast ........................... SUCCESS [  2.492 s][INFO] dubbo-serialization-jdk ............................ SUCCESS [  3.903 s][INFO] dubbo-config ....................................... SUCCESS [  0.046 s][INFO] dubbo-config-api ................................... SUCCESS [  4.661 s][INFO] dubbo-config-spring ................................ SUCCESS [  5.146 s][INFO] dubbo-rpc-thrift ................................... SUCCESS [  6.081 s][INFO] dubbo-rpc-memcached ................................ SUCCESS [  1.538 s][INFO] dubbo-rpc-redis .................................... SUCCESS [  1.696 s][INFO] dubbo-rpc-rest ..................................... SUCCESS [  2.224 s][INFO] dubbo-registry-zookeeper ........................... SUCCESS [  2.971 s][INFO] dubbo-registry-redis ............................... SUCCESS [  2.872 s][INFO] dubbo-demo ......................................... SUCCESS [  0.064 s][INFO] dubbo-demo-api ..................................... SUCCESS [  1.197 s][INFO] dubbo-demo-provider ................................ SUCCESS [  1.849 s][INFO] dubbo-demo-consumer ................................ SUCCESS [  1.662 s][INFO] dubbo-plugin ....................................... SUCCESS [  0.028 s][INFO] dubbo-qos .......................................... SUCCESS [  3.424 s][INFO] dubbo-serialization-fastjson ....................... SUCCESS [  3.242 s][INFO] dubbo-serialization-kryo ........................... SUCCESS [  3.567 s][INFO] dubbo-serialization-fst ............................ SUCCESS [  3.159 s][INFO] dubbo-dependencies-bom ............................. SUCCESS [  0.079 s][INFO] dubbo-bom .......................................... SUCCESS [  0.011 s][INFO] dubbo-all .......................................... SUCCESS [05:16 min][INFO] dubbo-test ......................................... SUCCESS [  0.143 s][INFO] dubbo-test-benchmark ............................... SUCCESS [ 12.323 s][INFO] dubbo-test-compatibility ........................... SUCCESS [  0.087 s][INFO] dubbo-test-spring3 ................................. SUCCESS [  1.665 s][INFO] dubbo-test-integration ............................. SUCCESS [  0.146 s][INFO] dubbo-test-examples 2.6.2 .......................... SUCCESS [  4.511 s][INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 08:14 min[INFO] Finished at: 2018-05-20T14:36:42Z[INFO] ------------------------------------------------------------------------
复制代码


  • docker ps -a 命令查看容器状态,再次停止了;

  • 去工程的 target 目录下,里面有最新构建的工程结果;

  • 小结:每次构建完成容器会自动停止,用 docker start 命令启动容器后会自动开始构建;

  • 以上就是 Docker 下通过 Maven 容器构建工程的全部实战内容,如果您遇到没有 JDK 或者不想变动 JDK 版本的情况,可以找一台有 Docker 的电脑,用上述方法来快速构建工程;

  • 另外提醒一句:pom.xml 文件中一般会配置 JDK 的版本,这个版本号要和 Maven 镜像中的 JDK 版本一致,否则编译期间会报错;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 2022 年 05 月 31 日阅读数: 41
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
没有JDK和Maven,用Docker也能构建Maven工程_Java_程序员欣宸_InfoQ写作社区