目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本。如果想切换自己本地的 Java 开发环境,折腾起来还是需要花费一些时间的,并且日后在不同版本间切换每次都要折腾一次。

Docker 的出现让我们维护不同版本的开发编译环境变得简单,如果你还不知道什么是 Docker 可以看看 Docker 入门介绍。我们可以采用两种方式来构建 java 的开发环境,一种是在容器内编译运行,一种是在容器外编译运行,下面分别来看看具体如何操作。

准备工作:首先确保已经安装了 Docker ,如果方便可以提前把 openjdk:8 的镜像拉取下来,到时可以节省大家的时间。本文在 macOs 10.15.7 、Docker 19.03.8 的环境下验证通过。

容器内编译与运行

本文以一个简单的 Helloworld 程序为例,工程的文件目录结构及代码如下。

$ 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

代码的内容。

public class Helloworld {
public static void main(String args[]){
System.out.println("Hello world.\n");
}
}

做好以上准备后,就可以编辑 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

构建镜像文件。

$ docker build -t java_in_docker_env_8 .
$ docker images # 使用 docker images 命令可以看到构建出来的 java_in_docker_env_8 镜像

运行容器。

$ 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 文件与上一节略有不同。

FROM openjdk:8
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp

构建镜像文件。

$ docker build -t java_env_8
$ docker images # 使用 docker images 命令可以看到构建出来的 java_env_8 镜像

编译文件。

$ 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

运行程序。

$ 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 的相关知识,可以参考我之前的文章。

参考资料

  1. Docker - Create a Java development environment

最新文章

  1. WdatePicker小结
  2. Windows上管理远程Linux VPS/服务器文件工具 - winscp
  3. (基础篇)echo、print、print_r、printf、sprintf、var_dump的区别比较
  4. 三大域对象的使用总结request域 + session域 +
  5. static 与 final 修饰符
  6. SQL SERVER ->> Data Compression
  7. Tkinter教程之Checkbutton篇
  8. 为zend studio增加Extjs代码提示功能
  9. [Laravel] 获取执行的Sql
  10. Android GridView 一行显示数据(包括图片和文本),解决的办法是计算数据占该行的宽度是多少
  11. [Redux] Avoiding Object Mutations with Object.assign() and ...spread
  12. 在JavaScript中创建命名空间的几种写法
  13. Java类锁和对象锁实践(good)
  14. cat命令汇总整理
  15. CountDownLatch、CyclicBarrier和 Semaphore比较
  16. webservice访问的几种方式
  17. angularJs学习笔记-路由
  18. JavaScript 排序算法
  19. LOJ550 Matching 构造
  20. .NET开发微信小程序-生成二维码 - 转

热门文章

  1. IDEA2020.2的破解
  2. ng2 父子组件传值 - 状态管理
  3. MySQL【灵魂拷问】
  4. 使用docker安装E
  5. 市场清仓价格算法 python求矩阵不同行不同列元素和的最大值
  6. 基于SSM框架的JavaWeb通用权限管理系统
  7. 渗透测试之nmap
  8. mock.js 学习
  9. E. Xenia and Tree 解析(思維、重心剖分)
  10. pandas dataframe 时间字段 diff 函数