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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通