1. 程式人生 > >沒有JDK和Maven,用Docker也能構建Maven工程

沒有JDK和Maven,用Docker也能構建Maven工程

在編譯構建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. 下載的是個壓縮檔案:incubator-dubbo-dubbo-2.6.2.zip,解壓後是個資料夾:incubator-dubbo-dubbo-2.6.2;
  2. 在我的電腦上,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

以上的命令中有下面幾處需要注意:
1. –name mvn001:表示容器名稱為mvn001;
2. -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原始碼的目錄
3. -w /usr/src/mymaven maven:3.5.3-jdk-7:表示容器的工作目錄為/usr/src/mymaven maven:3.5.3-jdk-7;
4. 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/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

如何多次編譯構建

編譯Maven工程成功後,由於容器中的mvn程序不再佔有終端輸出,會導致容器自動停止了,執行docker ps -a可以見到容器狀態如下所示:

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包,這太慢了;

試試下面的方法:
1. 執行命令docker start mvn001,將容器啟動起來;
2. 執行命令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] 


3. 靜候構建結束,如下所示,這一次耗時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] ------------------------------------------------------------------------


4. 用docker ps -a命令檢視容器狀態,再次停止了;
5. 去工程的target目錄下,裡面有最新構建的工程結果;

小結:每次構建完成容器會自動停止,用docker start命令啟動容器後會自動開始構建;

以上就是Docker下通過Maven容器構建工程的全部實戰內容,如果您遇到沒有JDK或者不想變動JDK版本的情況,可以找一臺有Docker的電腦,用上述方法來快速構建工程;

另外提醒一句:pom.xml檔案中一般會配置JDK的版本,這個版本號要和Maven映象中的JDK版本一致,否則編譯期間會報錯;