没有 JDK 和 Maven,用 Docker 也能构建 Maven 工程
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
场景
当前电脑上没装 Maven,甚至 JDK 都没装;
当前电脑装了 JDK8,但要用 JDK7 编译构建当前工程;
实战环境
电脑:Ubuntu 16.04.3 LTS
Docker:17.03.2-ce
实战步骤
准备一个 Maven 工程;
确定要用的 Maven 镜像;
用 Docker 来编译构建 Maven 工程;
如何多次编译构建;
准备一个 Maven 工程
本次实战要编译的工程是 dubbo-2.6.2,工程源码下载地址:https://codeload.github.com/apache/incubator-dubbo/zip/dubbo-2.6.2
下载的是个压缩文件:incubator-dubbo-dubbo-2.6.2.zip,解压后是个文件夹:incubator-dubbo-dubbo-2.6.2;
在我的电脑上,incubator-dubbo-dubbo-2.6.2 文件夹的完整路径是:/usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2;
确定要用的 Maven 镜像
例如本次编译的 JDK 我需要版本 1.7,Maven 我需要 3.5.3 版本;
浏览器打开网站:https://hub.docker.com,在顶部输入框输入"Maven",开始搜索,如下图红框:
搜索结果的第一位就是 Maven 的官方镜像,点击“DETAILS”按钮进入详情页,如下图红框:
详情页列出了多个 JDK 和 Maven 版本的组合,如下图红框中就是 JDK1.7 和 Maven3.5.3 的组合,红框中是对应的 TAG 名称是 3.5.3-jdk-7,所以我们要用的镜像就是:maven:3.5.3-jdk-7
Docker 下编译构建 Maven 工程
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] ------------------------------------------------------------------------
复制代码
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/target
root@maven:/usr/local/work/dubbo262/incubator-dubbo-dubbo-2.6.2/dubbo-monitor/dubbo-monitor-api/target# ls
classes dubbo-monitor-api-2.6.2-sources.jar generated-test-sources maven-status
dubbo-monitor-api-2.6.2.jar generated-sources maven-archiver test-classes
复制代码
如何多次编译构建
root@maven:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
184591657e9c 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]
复制代码
[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
评论