沒有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工程
- 下載的是個壓縮檔案: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和Maven版本來決定用哪個Maven映象;
1. 例如本次編譯的JDK我需要版本1.7,Maven我需要3.5.3版本;
2. 瀏覽器開啟網站:https://hub.docker.com
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版本一致,否則編譯期間會報錯;