目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本。如果想切换自己本地的 Java 开发环境,折腾起来还是需要花费一些时间的,并且日后在不同版本间切换每次都要折腾一次。
Docker 的出现让我们维护不同版本的开发编译环境变得简单,如果你还不知道什么是 Docker 可以看看 Docker 入门介绍。我们可以采用两种方式来构建 java 的开发环境,一种是在容器内编译运行,一种是在容器外编译运行,下面分别来看看具体如何操作。
准备工作:首先确保已经安装了 Docker ,如果方便可以提前把
openjdk:8
的镜像拉取下来,到时可以节省大家的时间。本文在 macOs 10.15.7 、Docker 19.03.8 的环境下验证通过。
容器内编译与运行
本文以一个简单的 Helloworld 程序为例,工程的文件目录结构及代码如下。
1 | ls -lh |
代码的内容。
1 | public class Helloworld { |
做好以上准备后,就可以编辑 Dockerfile 的内容。
1 | FROM openjdk:8 #基于 openjdk:8 构建镜像 |
构建镜像文件。
1 | docker build -t java_in_docker_env_8 . |
运行容器。
1 | docker run -it --rm java_in_docker_env_8 |
可以看到程序的输出,并且看到当前目录下并有没编译出来的结果。但是这种方式每次启动容器的时候都要进行编译,并且没有办法把编译结果进行分享,下一节的内容介绍如何在容器外保存编译结果。
容器外编译与运行
工作目录和代码准备与上一节相同,Dockerfile 文件与上一节略有不同。
1 | FROM openjdk:8 |
构建镜像文件。
1 | docker build -t java_env_8 |
编译文件。
1 | docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp java_env_8 javac Helloworld.java |
运行程序。
1 | docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp java_env_8 java Helloworld |
docker -v
命令表示将本地目录挂在稻容器内。
docker -w
命令表示指定工作命令,容器启动时的执行命令会在该目录下执行。
docker --rm
表示当容器结束后自动删除,这样就不会在系统中残存冗余的容器。
写在最后
本文仅仅构建了一个简单的 java 开发环境,使用这种方式编译运行 java 程序的好处是无需在本地安装 jdk ,在需要为多个 jdk 版本编译程序的时候更加方便。但是对于复杂的工程常常使用 maven 或者 graddle 进行构建,这种项目能否使用本文提到的方式来构建呢,敬请期待本系列的下一篇文章,也欢迎大家关注公众号获得最新的文章推送。如果想要进一步了解 Docker 的相关知识,可以参考我之前的文章。
- Docker 入门介绍
- Docker Compose 使用介绍
- 在Redhat 7.3中采用离线方式安装Docker
- 创建自己的Docker基础镜像
- Docker存出载入镜像
- 使用 Docker 快速搭建PHP开发环境
- Docker Compose 建立ELK集群