Java 命令行 编译、执行、打包

Java 命令行 编译、执行、打包

一般来说 IDE 或项目管理工具打包很方便。
我遇到了不能使用任何开发工具的情况,简单记录一下相关操作,不做深入探讨。

环境

linux
jdk 1.8

简单的编译执行

# 测试目录
cd /usr/local/mytest

创建文件 src/com/demo/Hello.java

package com.demo;

public class Hello {
    public static void main(String[] args) {
        System.out.println("hello");
    }
}

看下目录结构

编译,生成 class 文件

javac src/com/demo/Hello.java

下面的截图可以看到,在 java 文件同级目录,生成了 class 文件

执行

# -cp src 这个参数是把 src 目录添加到 classpath 目录
java -cp src com.demo.Hello

打包

打包只应当包含 .class 文件,需要创建一个目录,用来专门存放 .class 文件

mkdir /usr/local/mytest/target

编译

# -d target 参数,指定 class 文件生成在 target 目录
javac src/com/demo/Hello.java -d target


看一下 target 目录下生成了 .class 文件

打包

# -C target . 参数,指定把 target 目录下的所有文件打包
jar -cvf my.jar -C target .

执行

java -jar my.jar


报错了,这是正常的,因为我们没有指定入口,java 不知道应该执行什么。
正确的执行方式

# -cp my.jar 把 jar 包添加到 classpath 目录
# com.demo.Hello 说明哪个类是入口
java -cp my.jar com.demo.Hello

可执行的 jar 包

可以直接执行,无需指定入口
创建 /usr/local/mytest/MANIFEST.MF,在文件内说明程序入口:

Main-Class: com.demo.Hello

再次打包

# 添加了 m 参数,指定 MANIFEST.MF,这个文件的内容会被添加到 jar 包的清单,用于说明 my.jar 的入口
jar -cvfm my.jar MANIFEST.MF -C target .

执行

java -jar my.jar

成功输出 hello

依赖第三方 jar 包的 java 代码的编译执行

创建文件 src/com/demo/HelloGson.java,这个代码依赖 gson 包:

package com.demo;

import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

public class HelloGson {
    public static void main(String[] args) {

        Gson gson = new Gson();
        Map<String, String> map = new HashMap<String, String>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        String json = gson.toJson(map);
        System.out.println(json);
    }
}

直接编译:

javac src/com/demo/HelloGson.java -d target

理所当然的报错 error: package com.google.gson does not exist,依赖包不存在
创建 libs 目录,把依赖包 gson-2.8.5.jar 放进去,最后整个目录结构如下:

再次编译,使用 -cp libs/gson-2.8.5.jar 参数添加依赖包:

javac -cp libs/gson-2.8.5.jar src/com/demo/HelloGson.java -d target

编译成功,生成 HelloGson.class 文件:

执行:

java -cp target com.demo.HelloGson

报错 java.lang.ClassNotFoundException: com.google.gson.Gson 还是缺少依赖。
执行时也需把 libs/gson-2.8.5.jar 添加到 classpath 路径中:

java -cp target:libs/gson-2.8.5.jar com.demo.HelloGson

成功输出:

{"key1":"value1","key2":"value2"}
posted @ 2020-02-19 20:47  吴思老  阅读(11918)  评论(1编辑  收藏  举报