Linux下用命令行编译运行Java总结
最近使用腾讯云的Cloud Studio写Java,只能使用命令行进行编译运行,趁此机会,学习一下Linux的一些常用命令。平时windows下IDE用习惯了,现在用命令行进行编译运行,发现其实问题还是挺多的,所以写下这篇文章。
1.javac命令行
javac用于编译java源文件,生成.class文件。形式如下
javac [option] source
常用的option选项有如下
-classpath <路径>(可以简写成 -cp):指定要使用的类路径或要使用的jar包的路径。
-d <路径>:指定源文件编译后生成的.class文件的存放位置。
2.java命令行
java用于运行生成的.class文件。形式如下
java [option] classname [arguments]
常用的option选项有如下
-classpath <路径>(可以简写成 -cp):指定要使用的类路径或要使用的jar包的路径。
[arguments]:传递给main函数的参数。
3.编译运行一个单独的Java文件
在test文件夹下有一个Test.java文件,结构如下
Test.java代码如下
public class Test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
(1)编译生成的.class文件在当前文件夹下
// 编译
javac Test.java
// 运行
java Test
// 输出
Hello World!
(2)也可以指定编译生成的.class文件的路径,比如生成在当前文件夹下的bin文件夹下
// 编译
javac -d ./bin Test.java
// 运行
java -cp ./bin Test
// 输出
Hello World!
当指定生成的目录后,运行时也得指定相应的目录,不然会找不到文件。
4.编译运行一个带包的java文件
Test.java代码如下
package com.codeliu;
public class Test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
(1)编译生成的.class文件在当前文件夹下
// 首先得进入到.java文件所在的文件加下,再进行编译
javac Test.java
// 退出到最外层包,再运行,否则找不到文件
java com.codeliu.Test
// 输出
Hello World!
对于在包下的文件,如果编译后直接运行,会找不到文件,必须得退出到最外层包,然后使用完整的包名+文件名进行运行。
(2)指定.class文件的生成路径,使用IDE自动编译的时候,我们可以看到源文件一般在src文件夹下,而.class文件在bin文件夹下,这是因为JVM指定了.class文件的路径。
// 编译,生成在与最外层包同级的bin文件夹下,首先退出到最外层包
javac -d ./bin com/codeliu/*
// 运行(windows中把:改成;),-cp表示告诉jvm去该路径下寻找文件
java -cp bin: com.codeliu.Test
// 输出
Hello World!
5.同一个包下,一个类调用另一个类
在同一个包下有Test01.java和Test02.java,代码如下
package com.codeliu;
public class Test01 {
public void print() {
System.out.println("I'm Test01");
}
}
package com.codeliu;
public class Test02 {
public static void main(String[] args) {
Test01 t = new Test01(); t.print();
}
}
因为Test02引用了Test01,所以我们得先编译Test01,再编译Test02。
// 编译Test01.java,生成的.class文件在当前文件夹下,首先得进入到文件所在的文件夹下,然后进行编译
javac Test01.java
// 退出到包的最外层,然后编译Test02.java
javac -cp . com/codeliu/Test02.java
// 运行Test02.java
java com.codeliu.Test02
// 输出
I'm Test01
编译Test02的时候,我们使用-cp告诉编译器在当前路径下(.)去寻找Test01.class。
当然,我们也可以指定.class生成的路径,使用-d即可。
6.一个包中的类调用另一个包中的类
文件目录结构如下
在package1包下有类Test01.java,package2包下有Test02.java。代码分别如下
package com.package1;
public class Test01 {
public void print() {
System.out.println("I'm Test01");
}
}
package com.package2;
import com.package1.Test01;
public class Test02 {
public static void main(String[] args) {
Test01 t = new Test01();
t.print();
}
}
还是同样,得先编译Test01.java。
// 编译Test01.java,指定生成的路径是test文件夹下的bin文件夹下
javac -d ./bin com/package1/*
// 编译Test02.java,-cp告诉编译器去当前文件夹下的bin文件夹下找Test01.class,-d指定生成的路径
javac -cp bin: -d ./bin com/package2/*
// 运行Test02
java -cp bin: com.package2.Test02
// 输出
I'm Test01
7.运行一个工程
我们平时的项目肯定不可能是这么简单的,肯定有好多包和以及jar包,这样的情况下,我们使用shell脚本去编译它们。
等下吃完饭举个栗子。
温饱思淫欲,吃饱了我就不想写了。暂时先不写了,俺得学习其他的知识了。
个人网站https://www.codeliu.com,欢迎各位志同道合的盆友!