最近做某门课助教,基于antlr的一个Lab,就在考虑如何不用任何项目管理工具例如maven/gradle这种,然后又能获取同学提交的Java代码(里面引用了antlr的包的内容)并且在服务器本地跑OJ,就要熟悉Java的原生命令java,javac等等。
最后的解决办法就是写了一个makefile,在本地可以通过makefile运行自己写的java程序,在服务器可以通过makefile编译得到字节码,然后通过字节码,用java命令直接运行。本来想打jar包的,但测试中发现时间的提升并没有很显著,就懒得改了,毕竟已经做到实验一半了。
编译
使用javac命令,如果在java文件中引用了外部的包,那么可以这样写
1 | javac -cp xxx.jar:xxxx.jar xxx.java xxxx.java |
如果不想那么麻烦,可以在环境变量中添加CLASSPATH变量,如下
1 | export CLASSPATH=xxx.jar:. |
然后你的javac就不用-cp指定需要的包了,就可以这样:
1 | javac xxx.java xxxx.java |
额外可以增加其他参数例如
得到了class文件后,如何使用 java 命令运行,冒号后面必须添加引用的包的地址,然后选择启动类,这里是Main,最后可以跟各种参数
1 | java -classpath ./classes:xxxx.jar:xxx.jar Main args[0] args[1] ... |
打包
打包的话会复杂一些,需要先编译结束过后,创建一个MANIFEST. MF文件
1 | jar cvfm Main.jar MANIFEST.MF *.class |
MANIFEST. MF的内容如下:
1 | Manifest-Version: 1.0 |
一般来说需要跟编译后的.class文件放在一个目录下,然后执行下面的命令,如果不在一个目录下,记得改Main-Class里面的Main类的地址。
如果引用了多个jar包,用空格空开
运行包
1 | java -jar Main.jar |