利用 Docker 构建简单的 java 开发编译环境的方法详解

目前 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 - Create a Java development environment

到此这篇关于利用 Docker 构建简单的 java 开发编译环境的文章就介绍到这了,更多相关docker构建java开发编译环境内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-11-11

详解docker镜像centos7配置Java运行环境

1.拉取centos镜像 docker pull centos:7 2.基于拉取到的镜像运行一个容器 docker run -it --name mycentos docker.io/centos:7 /bin/bash 运行起来就直接进入了容器的交互界面 3.容器中安装jdk 首先查询可用的jdk版本 yum search java|grep jdk 根据搜索到jdk进行安装 yum install java-1.7.0-openjdk 安装完成之后可以不用配置环境变量,因为安装完成之后貌似是

Dockerfile 部署java web的环境详解

Dockerfile 构建java web 环境 Dockfile 介绍: Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命令.Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile.Docker程序将读取Dockerfile,根据指令生成定制的image.相比image这种黑盒子,Doc

使用Docker搭建Java环境的步骤方法

Docker是干什么的 Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,源代码托管在 Github 上, 遵从Apache2.0协议开源.Docker的目标是实现轻量级的操作系统虚拟化解决方案. 学习Docker首先要了解几个概念: 镜像-Docker的镜像和常见的系统ISO镜像类似,包含了应用程序的信息: 容器-容器相当于一个可以运行起来的虚拟机,应用程序运行在容器中,Docker运行在"Docker"上: 仓库-仓库

使用Dockerfile构建java web环境

用dockerfile构建一个Java的web环境,主要分为2步,第一步是在镜像中安装jdk并配置环境变量,第二步是安装tomcat. 先贴一下完整的dockerfile FROM ubuntu:14.04 MAINTAINER *** "***@******.com" RUN apt-get update ADD jdk-8u77-linux-x64.tar.gz /usr/local/java ENV JAVA_HOME /usr/local/java/jdk1.8.0_77 EN

docker 的java编译环境构建详细介绍

用Dockerfile 构建一个java的编译环境,这里整理下实现步骤: 1.包括以下软件包 ubuntu jdk maven svn 2.jdk.maven 需要手动下载,下载之后分别为 jdk-8u51-linux-x64.gz apache-maven-3.3.3-bin.tar.gz 3.创建一个Dockerfile文件,包含以下内容 FROM ubuntu RUN apt-get update RUN apt-get -y install subversion ADD jdk-8u51

Java类加载基本过程详细介绍

Java类加载基本过程详细介绍 基本过程: 根据类的全限定名称加载定义类的二进制字节流. 将字节流代表的静态存储结构转化为方法区的运行时数据结构 内存中生成一个代表这个类的java.lang.Class对象,作为方法去这个类的各种数据访问入口 数组类本身不通过类加载器创建,由java虚拟机直接创建,数组类的元素类型由类加载器加载. 数组类的元素类型:数组去掉所有维度后的类型, 文件格式验证: 0xCAFEBABY 魔数开头: 主次版本号当前虚拟机可处理: 常量类型: 索引执行类型: utf8编码

java 注解的基础详细介绍

java 注解的基础详细介绍 前言 注解是Java引入的一项非常受欢迎的补充,它提供了一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读.使用注解能够帮助我们避免编写累赘的部署描述文件,以及其他生成的文件. 注解的语法比较简单,除了@符号的使用之外,它基本与java固有的语法一致.但由于java源码中提供的内置注解很少,所以大部分同学对注解都不是很了解,虽然我们都接触过,比如java内置的几种注解: @Override,表示当前的方法定义

vscode 配置 C/C++ 编译环境的详细图文教程

vscode c++ 环境配置 第一步:下载安装 下载MinGW-W64 GCC-8.1.0编译器(32和64版本都有) MinGW-W64 GCC下载地址:https://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win32/Personal Builds/mingw-builds/installer/mingw-w64-install.exe 离线下载地址:https://sourceforge.net/pr

vue中mint-ui环境搭建详细介绍

 vue中mint-ui环境搭建详细介绍 首先需要如下配置node (最好用淘宝源) $ npm install -g cnpm --registry=https://registry.npm.taobao.org 以及git 从官方github拉下来mint-ui git clone https://github.com/ElemeFE/mint-ui.git 进入mint-ui npm run dev 全程大概5-10分钟,出现 Build completed in 34.926s Chil

java并发之ArrayBlockingQueue详细介绍

java并发之ArrayBlockingQueue详细介绍 ArrayBlockingQueue是常用的线程集合,在线程池中也常常被当做任务队列来使用.使用频率特别高.他是维护的是一个循环队列(基于数组实现),循环结构在数据结构中比较常见,但是在源码实现中还是比较少见的. 线程安全的实现 线程安全队列,基本是离不开锁的.ArrayBlockingQueue使用的是ReentrantLock,配合两种Condition,实现了集合的线程安全操作.这里稍微说一个好习惯,下面是成员变量的声明. pri

Java 开发环境配置步骤(介绍)

背景 当要求系统启动一个应用程序时,系统会先查找当前命令是否是内部命令,若不是,则在当前目录下查找,如果仍没有找到,则在系统变量 Path 指定的路径去查找.JDK(Java Development Kit)包含了一系列开发工具,这些开发工具都在 JDK 的安装目录下,为了方便使用这些开发工具,我们有必要把 JDK 的安装目录设置了系统变量. 步骤 为了配置 JDK 的系统变量环境,我们需要设置三个系统变量,分别是 JAVA_HOME(可选),Path 和 CLASSPATH,下面是这三个变量的

java数据类型与二进制详细介绍

java数据类型与二进制详细介绍 在java中 Int 类型的变量占 4个字节 Long 类型的变量占8个字节 一个程序就是一个世界,变量是这个程序的基本单位. Java基本数据类型 1.        整数类型 2.        小数(浮点数)类型 3.        布尔类型 4.        字符类型 整数类型 整数类型可以表示一个整数,常用的整数类型有:byte,short,int,long Byte  一个字节  -128到127 注:0有两个表示0000 0000正零  1000

Docker 数据卷,数据卷容器详细介绍

Docker 数据卷,数据卷容器详细介绍 引子 有些时候,我们的服务运行时必不可少的会产生一些日志,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷 数据卷容器 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: - 数据卷可以在容器之间共享和重用 - 对数据卷的修改会立马生效 - 对数据卷的更新,不会影响镜像 - 卷会一直存在,直到没有容器使用 #(类似linux下的挂载(moun

Java多线程的用法详细介绍

Java多线程的用法详细介绍 最全面的Java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); publi