利用 Docker 構建一個簡單的 java 開發編譯環境
阿新 • • 發佈:2020-11-12
目前 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