1. 程式人生 > >利用 Docker 構建一個簡單的 java 開發編譯環境

利用 Docker 構建一個簡單的 java 開發編譯環境

目前 Java 語言的版本很多,除了常用的 Java 8,有一些遺留專案可能使用了 Java 7,也可能有一些比較新的的專案使用了 Java 10 以上的版本。如果想切換自己本地的 Java 開發環境,折騰起來還是需要花費一些時間的,並且日後在不同版本間切換每次都要折騰一次。 Docker 的出現讓我們維護不同版本的開發編譯環境變得簡單,如果你還不知道什麼是 Docker 可以看看 [Docker 入門介紹](http://edulinks.cn/2018/06/20/20180620-docker-overview/)。我們可以採用兩種方式來構建 java 的開發環境,一種是在容器內編譯執行,一種是在容器外編譯執行,下面分別來看看具體如何操作。 > 準備工作:首先確保已經安裝了 Docker ,如果方便可以提前把 `openjdk:8` 的映象拉取下來,到時可以節省大家的時間。本文在 macOs 10.15.7 、Docker 19.03.8 的環境下驗證通過。 ## 容器內編譯與執行 本文以一個簡單的 Helloworld 程式為例,工程的檔案目錄結構及程式碼如下。 ```shell $ ls -lh total 24 -rw-r--r-- 1 shiqiang staff 60B 11 11 19:02 Dockerfile -rw-r--r-- 1 shiqiang staff 123B 11 11 19:02 Helloworld.java ``` 程式碼的內容。 ```java public class Helloworld { public static void main(String args[]){ System.out.println("Hello world.\n"); } } ``` 做好以上準備後,就可以編輯 Dockerfile 的內容。 ```dockerfile FROM openjdk:8 #基於 openjdk:8 構建映象 COPY . /usr/src/myapp #將目錄內的程式碼拷貝到映象中 /usr/src/myapp 的位置 WORKDIR /usr/src/myapp #將 /usr/src/myapp 設為工作目錄 RUN javac Helloworld.java #執行編譯命令,編譯 Helloworld.java 程式 CMD ["java", "Helloworld"] #執行編譯出來的 Helloworld ``` 構建映象檔案。 ```shell $ docker build -t java_in_docker_env_8 . $ docker images # 使用 docker images 命令可以看到構建出來的 java_in_docker_env_8 映象 ``` 執行容器。 ```shell $ docker run -it --rm java_in_docker_env_8 Hello world. $ ls -lh total 24 -rw-r--r-- 1 shiqiang staff 112B 11 12 10:53 Dockerfile -rw-r--r-- 1 shiqiang staff 123B 11 12 10:49 Helloworld.java ``` 可以看到程式的輸出,並且看到當前目錄下並有沒編譯出來的結果。但是這種方式每次啟動容器的時候都要進行編譯,並且沒有辦法把編譯結果進行分享,下一節的內容介紹如何在容器外儲存編譯結果。 ## 容器外編譯與執行 工作目錄和程式碼準備與上一節相同,Dockerfile 檔案與上一節略有不同。 ```dockerfile FROM openjdk:8 COPY . /usr/src/myapp WORKDIR /usr/src/myapp ``` 構建映象檔案。 ```shell $ docker build -t java_env_8 $ docker images # 使用 docker images 命令可以看到構建出來的 java_env_8 映象 ``` 編譯檔案。 ```shell $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp java_env_8 javac Helloworld.java $ ls -lh # 可以看到編譯出來的結果 total 32 -rw-r--r-- 1 shiqiang staff 112B 11 12 10:53 Dockerfile -rw-r--r-- 1 shiqiang staff 427B 11 12 11:09 Helloworld.class -rw-r--r-- 1 shiqiang staff 123B 11 12 10:49 Helloworld.java ``` 執行程式。 ```shell $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp java_env_8 java Helloworld Hello world. ``` ## 寫在最後 本文僅僅構建了一個簡單的 java 開發環境,使用這種方式編譯執行 java 程式的好處是無需在本地安裝 jdk ,在需要為多個 jdk 版本編譯程式的時候更加方便。但是對於複雜的工程常常使用 maven 或者 graddle 進行構建,這種專案能否使用本文提到的方式來構建呢,敬請期待本系列的下一篇文章,也歡迎大家關注公眾號獲得最新的文章推送。如果想要進一步瞭解 Docker 的相關知識,可以參考我之前的文章。 * [Docker 入門介紹](http://edulinks.cn/2018/06/20/20180620-docker-overview/) * [Docker Compose 使用介紹](http://edulinks.cn/2020/04/15/20200415-docker-compose/) * [在Redhat 7.3中採用離線方式安裝Docker](http://edulinks.cn/2018/07/11/20180711-install-docker-ce-in-redhat-73/) * [建立自己的Docker基礎映象](http://edulinks.cn/2018/06/27/20180627-make-your-own-base-docker-image/) * [Docker存出載入映象](http://edulinks.cn/2018/07/16/20180716-docker-save-load-image/) * [使用 Docker 快速搭建PHP開發環境](http://edulinks.cn/2020/04/17/20200415-qucik-lnmp-dev-environment/) * [Docker Compose 建立ELK叢集](http://edulinks.cn/2020/01/15/20200115-docker-compose-elk-cluster/) ## 參考資料 1. [Docker - Create a Java development environment](https://childofcode.com/docker-create-a-java-development-enviro