Java编译打包运行

Hello World 编译

不带package的HelloWorld的编译

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
javac HelloWorld.java && java HelloWorld

javac 命令用于编译生成HelloWorld.class文件

带package的HelloWorld的编译

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

执行javac HelloWorld.java && java HelloWorld 会提示:错误: 找不到或无法加载主类 HelloWorld。应为编译后的class要放在对应包名的目录中。
需要用javac 的-d参数指定路径才会生成package 对应的目录

├── HelloWorld.java
└── com
    └── demo
        └── hello
            └── HelloWorld.class
$  javac HelloWorld.java  -d ./ && java com/demo/hello/HelloWorld  # 这里/不是路径
Hello World
$  javac HelloWorld.java  -d ./ && java com.demo.hello.HelloWorld
Hello World

打包

用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
常用选项:(选项跟Linux下的tar 类似)
-c 创建新档案
-t 列出档案目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有档案**
-v 在标准输出中生成详细输出
-f 指定档案文件名
-m 包含指定清单文件中的清单信息
-e 为捆绑到可执行 jar 文件的独立应用程序
-C 更改为指定的目录并包含以下文件(cd 到指定目录下面)

$ jar cvf demo-hello.jar ./

打包后的结构为

x META-INF/
x META-INF/MANIFEST.MF
x com/
x com/demo/
x com/demo/hello/
x com/demo/hello/HelloWorld.class

META-INF/MANIFEST.MF的内容为

Manifest-Version: 1.0
Created-By: 1.8.0_342 (Azul Systems, Inc.)

运行

用法: java [-options] class [args...](执行类)
   或  java [-options] -jar jarfile [args...]  (执行 jar 文件)

其中选项包括:
    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 : 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。

上述选项-cp 和-classpath 是一样的。其中目录要用绝对路径。
执行类:

$ java -cp  demo-hello.jar com.demo.hello.HelloWorld
Hello World
$ java -cp /Users/jonson/Projects/demo-project/hello com.demo.hello.HelloWorld
Hello World

执行jar文件

$  java -jar demo-hello.jar
demo-hello.jar中没有主清单属性

这时候可以更新META-INF/MANIFEST.MF,往其中添加Main-Class: com.demo.hello.HelloWorld

$  jar -tf demo-hello.jar  # 查看文件列表
META-INF/
com/
com/demo/
com/demo/hello/
com/demo/hello/HelloWorld.class
META-INF/MANIFEST.MF

$  jar -xf demo-hello.jar META-INF/MANIFEST.MF   # 提取MANIFEST.MF文件,添加Main-Class
$  jar -ufvm demo-hello.jar META-INF/MANIFEST.MF #更新MANIFEST.MF文件,m参数指定清单文件,不加MANIFEST.MF会没了!!!
	

或者重新打包用e参数指定入口,e参数是有顺序的要放在f后面。

$  jar cfe demo-hello.jar com.demo.hello.HelloWorld ./com
$  java -jar demo-hello.jar
Hello World
posted @   簡素  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示