在 Windows 系统下 JavaCC 的 Docker 镜像制作与运行方法
简介
本文介绍如何制作一个可运行 JavaCC 的 Docker 镜像及该镜像的使用办法。
环境准备
笔者使用的是 Win10(版本1803)。
先下载好 Docker for windows 并安装,安装时选择 Linux Container。首次启动时会提示开启 Hyper-V,按提示开启即可。
注意,开启 Hyper-V 之后 virtualbox 将不能再使用。
安装 docker 后环境即准备完成。
制作
-
拉取 Ubuntu 镜像作为基准镜像。
docker pull ubuntu:18.04
-
开启镜像开始配置
docker run -it --name javacc ubuntu:18.04 /bin/bash
上述命令中,
-it
代表交互模式(–interactive + --tty),基于ubuntu:18.04
镜像,并将 container 命名为javacc
,容器运行起来后将运行/bin/bash
提供一个可交互 Shell. -
在镜像中安装所需软件
apt update apt install -y openjdk-8-jdk javacc dos2unix
其中 openjdk 提供 java 环境。dos2unix 方便在 windows 下通过 docker 处理文件时调整文件换行符。
-
检查 javacc 安装结果
javacc
得到类似以下结果即为成功:
root@4519e4f9abb7:/# javacc Java Compiler Compiler Version 5.0 (Parser Generator) Usage: javacc option-settings inputfile "option-settings" is a sequence of settings separated by spaces. Each option setting must be of one of the following forms: -optionname=value (e.g., -STATIC=false) -optionname:value (e.g., -STATIC:false) -optionname (equivalent to -optionname=true. e.g., -STATIC) -NOoptionname (equivalent to -optionname=false. e.g., -NOSTATIC) Option settings are not case-sensitive, so one can say "-nOsTaTiC" instead of "-NOSTATIC". Option values must be appropriate for the corresponding option, and must be either an integer, a boolean, or a string value. The integer valued options are: LOOKAHEAD (default 1) CHOICE_AMBIGUITY_CHECK (default 2) OTHER_AMBIGUITY_CHECK (default 1) The boolean valued options are: STATIC (default true) SUPPORT_CLASS_VISIBILITY_PUBLIC (default true) DEBUG_PARSER (default false) DEBUG_LOOKAHEAD (default false) DEBUG_TOKEN_MANAGER (default false) ERROR_REPORTING (default true) JAVA_UNICODE_ESCAPE (default false) UNICODE_INPUT (default false) IGNORE_CASE (default false) COMMON_TOKEN_ACTION (default false) USER_TOKEN_MANAGER (default false) USER_CHAR_STREAM (default false) BUILD_PARSER (default true) BUILD_TOKEN_MANAGER (default true) TOKEN_MANAGER_USES_PARSER (default false) SANITY_CHECK (default true) FORCE_LA_CHECK (default false) CACHE_TOKENS (default false) KEEP_LINE_COLUMN (default true) The string valued options are: OUTPUT_DIRECTORY (default Current Directory) TOKEN_EXTENDS (default java.lang.Object) TOKEN_FACTORY (default none) JDK_VERSION (default 1.5) GRAMMAR_ENCODING (defaults to platform file encoding) EXAMPLE: javacc -STATIC=false -LOOKAHEAD:2 -debug_parser mygrammar.jj
-
使用
exit
退出容器然后 commit 变更exit docker commit --message "javacc done" javacc javacc:v1.0.0
-
测试做好的镜像。新建一个文件夹
tmp
然后在其中运行:docker run -it -v %CD%:/tmp/tests -w /tmp/tests --rm --name javacc_test javacc:v1.0.0 /bin/bash cat << 'EOF' > test.jj PARSER_BEGIN(Simple1) /** Simple brace matcher. */ public class Simple1 { /** Main entry point. */ public static void main(String args[]) throws ParseException { Simple1 parser = new Simple1(System.in); parser.Input(); } } PARSER_END(Simple1) /** Root production. */ void Input() : {} { MatchedBraces() ("\n"|"\r")* <EOF> } /** Brace matching production. */ void MatchedBraces() : {} { "{" [ MatchedBraces() ] "}" } EOF javacc test.jj javac *.java java Simple1
然后输入右大括号和左大括号 }{,再 Ctrl+D 结束,会得到下述提示,这样就是 JacaCC 成功运行了:
}{Exception in thread "main" ParseException: Encountered " "}" "} "" at line 2, column 1. Was expecting one of: <EOF> "\n" ... "\r" ... at Simple1.generateParseException(Simple1.java:234) at Simple1.jj_consume_token(Simple1.java:172) at Simple1.Input(Simple1.java:38) at Simple1.main(Simple1.java:8)
使用
手动使用
# 交互式运行,--rm 参数是运行结束后就删除该容器。
docker run -it --rm --name javacc_test -v %CD%:/tmp/tests -w /tmp/tests javacc:v1.0.0 /bin/bash
# 从语法文件生成 java
javacc test.jj
# 从 java 生成可执行文件
javac *.java
# 运行可执行文件(这个可执行文件的名称与语法文件中的定义相关)
java Simple1
导出导入镜像
# 导出
docker save -o javacc_v1.0.0.tar javacc:v1.0.0
# 导入
docker load -i javacc_v1.0.0.tar
以上命令方便在内网机器中使用在外网制作好的镜像。