JAVA的命令行使用
最基本的命令行工具是
javac
和java
,使用javac
进行编译,使用java
进行运行,
- 对于没有包结构的
java
文件,可以用以下的方法进行操作,示例如下:javac hello.java
即可在当前文件夹下获得
hello.class
的文件,执行class
文件的命令如下java -cp ./ hello
其中
-cp
选项指定java
工具寻找后面类文件的路径。由于没有包结构,所以该文件在当前文件夹下,是./
。
注意,文件名不能带有·.class
,因为java
是按照模块寻找执行的
- 对于有包结构的代码文件则很特殊,示例如下,若包结构入下如所示
. ├── out └── src ├── P1 │ ├── Lp1 │ │ ├── a.java │ │ └── b.java │ └── Lp2 └── P2
其中
b.java
的内容如下,并且a.java
和b.java
正好相反,即互相引用,输出时输出自己的文件名package src.P1.Lp1; import src.P1.Lp1.a; public class b { public static void main(String[] args) { System.out.println("this is " + System.getProperty("user.dir") + " b.java"); } }
可以使用如下命令行进行编译:
javac -d out -cp ./ src/P1/Lp1/b.java
其中
-d
选项表示输出文件夹,-cp
选项表示寻找import的类的起始路径,之后紧接着文件就好
可以使用如下指令进行运行java -cp ./out src.P1.Lp1.b
这里的
-cp
选项表示寻找类名的起始路径在了解了以上内容之后,就可以应付一些简单的工程了,比如说lab1的工程,结构如下
. ├── lib │ ├── hamcrest-core-1.3.jar │ └── junit-4.13.2.jar ├── src │ ├── P1 │ │ ├── MagicSquare.java │ │ ├── MagicSquare.java │ │ └── txt │ │ ├── 1.txt │ │ ├── 2.txt │ │ ├── 3.txt │ ├── P2 │ │ ├── rules │ │ │ ├── RulesOf6005.java │ │ │ └── RulesOf6005Test.java │ │ └── turtle │ │ ├── Action.java │ │ ├── DrawableTurtle.java │ │ ├── LineSegment.java │ │ ├── PenColor.java │ │ ├── Point.java │ │ ├── TurtleGUI.java │ │ ├── Turtle.java │ │ ├── TurtleSoup.java │ │ └── TurtleSoupTest.java │ └── P3 │ ├── FriendshipGraph.java │ └── Person.java └── test ├── P1 │ └── MagicSquareTest.java └── P3 ├── FriendshipGraphTest.java └── PersonTest.java 12 directories, 29 files
为了管理这个简单的工程,我决定使用makefile(主要是不会maven和gradle),makefile脚本如下:
# 使用说明:这是一个Makefile的build文件 # # 该文件有以下几条指令 # # make all :编译所有源文件 # # make runP1 :运行P1文件夹中的MagicSquare 中的主方法,如果MagicSquare 没有 被编译则会先运行make all # # make runP2 :运行P2文件夹中的TurtleSoup 中的主方法,如果TurtleSoup 没有 被编译则会先运行make all # # make runP3 :运行P3文件夹中的FriendshipGraph中的主方法,如果FriendshipGraph没有 被编译则会先运行make all # # make runP1test :运行test文件夹中的MagicSquareTest的测试 # # make runP2test :运行P2中的TurtleSoupTest的测试 # # make runP3test :运行test文件夹中的FriendshipGraphTest的测试 # # make clean :清除所有编译出的class文件 # 错误说明:如果使用以上指令出现错误,请看这边 # # 可能原因:版本号为11的java和javac指令没有添加您的电脑的环境变量。 # # 如果这样,不用添加环境变量请尝试修改以下两条配置即可 # # 例如:您的java在/usr/bin/java路径下,您的javac在/usr/lib/jvm /openjdk-11/javac # # 请将以下两条修改为 # # JAVA:=/usr/bin/java # # JAVAC := /usr/lib/jvm/openjdk-11/javac # # 如果还是编译错误,请助教老师及时联系我,告知错误信息,我将迅 速改正 ##================================================================================= JAVA := java JAVAC := javac ##================================================================================= SRCFILE := $(shell find src -name *.java | sed 's/.*\///' | cat | xargs) TESTFILE := $(shell find test -name *.java | sed 's/.*\///' | cat | xargs) SRCPATH := src OBJFILE := $(SRCFILE:.java=.class) $(TESTFILE:.java=.class) CLASSPA := lib/junit-4.13.2.jar:lib/hamcrest-core-1.3.jar TEST := org.junit.runner.JUnitCore CLASSOUT := out/classes OUT := out CLASSFILEPATH = $(shell find out -type d -wholename */\* | xargs | sed 's/ /:/g') JAVAFILEPATH = $(shell find src -type d -wholename */\* | xargs | sed 's/ /:/g') TESTFILEPATH = $(shell find test -type d -wholename */\* | xargs | sed 's/ /:/g') VPATH = $(JAVAFILEPATH):$(CLASSFILEPATH):$(TESTFILEPATH) .PHONY:all clean P1 P2 P3 P2test all: $(OBJFILE) P1: MagicSquare.class java -cp $(CLASSOUT):$(CLASSPA) P1.MagicSquare P2: TurtleSoup.class java -cp $(CLASSOUT):$(CLASSPA) P2.turtle.TurtleSoup P3: java -cp $(CLASSOUT):$(CLASSPA) P3.FriendshipGraph P1test: MagicSquareTest.class java -cp $(CLASSOUT):$(CLASSPA) $(TEST) P1.MagicSquareTest P2test: TurtleSoupTest.class java -cp $(CLASSOUT):$(CLASSPA) $(TEST) P2.turtle.TurtleSoupTest P3test: FriendshipGraphTest.class java -cp $(CLASSOUT):$(CLASSPA) $(TEST) P3.FriendshipGraphTest $(OBJFILE): %.class:%.java $(JAVAC) -cp $(CLASSPA):$(SRCPATH) -d $(CLASSOUT) $< clean: rm -f -r $(OUT)/*