Java 编译和执行

1. WIN 下执行 java 单文件

1. class 方式

1. 编写程序,保证 import 正确

1
2
3
4
public class Hello{
public static void main(String[] args){
System.out.println("Hello World");
}

2. 编译

在文件所在文件夹,使用 javac ,可生成 class 文件

1
> javac Hello.java

3. 执行

执行 class 文件

1
> java Hello

2. jar 方式

1. 编写程序,同上

2. 编译

打包 jar 文件时,必须增加清单文件,首先在该文件目录下新建一个 manf 的文件清单,内容为指定主类

1
2
3
# manf
Main-Class: Hello

注意清单文件的规范,在冒号后面要有一个空格,行末不能有空格,最后一行是空行

1
> jar cvfm Hello.jar manf Hello.class

3. 执行

打包之后会生成一个 Hello.jar 文件,执行

1
> java -jar Hello.jar

2. 引用 class 文件打包

文件结构

1
2
3
│  Hello.java
├─test
│ │ Gen.java

1. 编写程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Hello.java
import test.Get;
public class Hello{
public static void main(String[] args){
Get aget=new Get();
aget.print();
}
}

# Get.java
package test;
public class Get{
public void print(){
System.out.println("Good Job");
}
}

2. 编译

Hello.javaimport test.Get 中将 test 作为包处理,所以需要在该文件中加上 package test 才能编译成功

1
> jar cvfm Hello.jar manf Hello.class test/Get.class

3. 执行

1
> java -jar Hello.jar

3. 引用 jar 打包

文件结构同上,但删除 test 及其下文件

1. 编译

当我们编译 Hello.java 时报错,因为找不到 test 包下面的 Get.class 的文件,但是 Hello.jar 内有 test.Get,因此打包时候需要将其引进来

1
2
# -cp:在java文件中,引入其他的jar包,多个jar包用分号隔开
> javac -cp Hello.jar Hello.java

此时会生成 Hello.class 文件,但执行需要增加 classpath 参数

1
2
# -classpath:要编译或执行的类引用了其它的类,但被引用类的.class文件不在当前目录下时,就需要通过-classpath来引入类
> java -classpath Hello.jar Hello

在清单文件中指明类加载路径,将 jar 的路径包含进来,避免找不到类的错误

1
2
3
4
# manf
Main-Class: Hello
Class-Path: Hello.jar

打包

1
> jar cvfm a4.jar manf Hello.class

2. 执行

1
> java -jar a4.jar

注意

  1. Main-Class 中类如果有限定名,则写成全限定名,比如 package.classname
  2. Class-Path 中引用多个 jar 包,则以换行分隔多个jar包的相对路径

4. Linux 下执行 jar 文件

1. java - jar

执行该命令时,会用到目录 META-INF\MANIFEST.MF 文件,在该文件中,有一个叫 Main-Class 的参数,它说明了 java -jar 命令执行的类

2. java -cp

指定类运行所依赖其他类的路径,通常是类库、jar包之类,需要全路径到jar包,表达式支持通配符

1
java -cp (jar包路径:...) (主类的全限定名称) (参数)