JDK工具使用总结

javac

常用参数:

  • -d <directory>:指定输出目录,编译后的 .class 文件将放在该目录中
  • -classpath <path> 或 -cp <path>:指定类路径,包含其他 .class 文件或库的路径。javac -cp lib/* src/MyClass.java
  • -source <version>:指定源代码的版本
  • -target <version>:指定生成的字节码的版本,javac -target 11 src/MyClass.java
  • -encoding <encoding>:指定源文件的编码格式(例如 UTF-8)

Bash:编译指定多个jar包作为类路径,使用:隔开

javac -d classes -cp lib/jackson-annotations-2.6.7.jar:lib/jackson-core-2.6.7.jar:lib/jackson-databind-2.6.7.jar $(find src/ -name '*.java')

PowerShell

javac -d classes -cp "lib\jackson-annotations-2.6.7.jar;lib\jackson-core-2.6.7.jar;lib\jackson-databind-2.6.7.jar" (Get-ChildItem -Path src -Filter *.java -Recurse).FullName

CMD

javac -d classes -cp lib\jackson-annotations-2.6.7.jar;lib\jackson-core-2.6.7.jar;lib\jackson-databind-2.6.7.jar src\**\*.java

jar

jar命令用于创建、提取、列出和更新jar包的工具。

jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...

主要操作参数

  1. c - 创建新的JAR文件
  2. t - 列出JAR文件的内容
  3. x - 提取JAR文件中的指定文件(或所有文件)
  4. u - 更新现有的JAR文件
  5. i - 为指定的JAR文件生成索引信息

修饰参数

  1. v - 在标准输出中生成详细输出
  2. f - 指定JAR文件名(第二个参数)
  3. m - 包含指定清单文件(manifest)中的信息
  4. n - 执行创建JAR文件后对其规范化
  5. 0 - 仅存储,不使用ZIP压缩
  6. P - 保留绝对路径(不推荐使用)
  7. M - 不创建清单文件(manifest)
  8. e - 为捆绑到可执行JAR文件的独立应用程序设置入口点

以下是一些常用的jar命令:

创建jar包

PS:对于实际项目,建议使用构建工具如Maven或Gradle来管理 Jar 构建过程,使用命令过于繁琐了

创建一个新的jar包,将指定的文件或目录添加到jar包中。jar cf <jar包名.jar> <文件或目录>,例如: 将MyClass.class和MyOtherClass.class添加到myapp.jar中

jar cf myapp.jar MyClass.class MyOtherClass.class

jar cvf <jar包名.jar> <文件或目录>: 与jar cf类似,但会显示详细的打包过程信息.

jar cfm <jar包名.jar> <清单文件> <文件或目录>: 创建一个包含清单文件的jar包。清单文件是一个文本文件,包含了jar包的元数据,例如主类、版本信息等。

jar cvfm <jar包名.jar> <清单文件> <文件或目录> 会显示详细的打包过程信息.

指定MANIFEST.MF文件

jar cvfm MyFatApp.jar META-INF/MANIFEST.MF -C target/classes . -C target/dependency .

批量添加多个目录下的所有classes,-C后面指定的目录是自动递归查找目录的

jar cvfe MyApp.jar com.example.MainClass -C build/classes . -C resources .
  • cvfe:创建(c)详细(v)JAR文件(f)并设置入口点(e)
  • MyApp.jar:输出的JAR文件名
  • com.example.MainClass:主类(入口点)
  • -C build/classes .:切换到build/classes目录,包含当前目录(切换后的目录)所有文件(.)
  • -C resources .:切换到resources目录,包含当前目录(切换后的目录)所有文件(.)

创建带索引的JAR文件以提高类加载性能

# 首先创建普通JAR
jar cf MyApp.jar -C target/classes .

# 然后生成索引
jar i MyApp.jar

创建模块化JAR文件(Java 9+)

jar --create --file=mlib/my.module.jar \
    --module-version=1.0 \
    --main-class=com.example.MainClass \
    -C mods/my.module .

清单文件

https://docs.oracle.com/javase/tutorial/deployment/jar/defman.html

  1. 清单文件必须以空行结束,否则最后一行可能不会被识别

更新JAR文件中的特定资源

# 更新JAR中的配置文件
jar uvf MyApp.jar config.properties

# 更新JAR中的特定类文件
jar uvf MyApp.jar com/example/MyClass.class

签名JAR文件

# 首先创建JAR
jar cvf MyApp.jar -C target/classes .

# 然后签名
jarsigner -keystore myKeystore -storepass password MyApp.jar myAlias

验证签名的JAR

jarsigner -verify -verbose -certs MyApp.jar

查看jar包内容

jar tf <jar包名.jar>: 列出jar包中所有文件和目录的名称.
jar tvf <jar包名.jar>: 显示jar包中所有文件和目录的详细信息,例如大小、修改日期等.

提取jar包内容

jar xf <jar包名.jar>: 将jar包中的所有内容提取到当前目录.
jar xvf <jar包名.jar>: 与jar xf类似,但会显示详细的提取过程信息.

# 提取单个文件
jar xvf MyApp.jar META-INF/MANIFEST.MF

# 提取整个目录
jar xvf MyApp.jar com/example/

运行jar包

使用java命令运行指定的jar包

java -jar <jar包名.jar>

java -jar <jar包名.jar> [参数]

# 在后台不挂断地运行jar包
nohup java -jar <jar包名.jar> &
# 在后台不挂断地运行jar包,并将输出重定向到log.txt文件
nohup java -jar <jar包名.jar> > log.txt 2>&1 &

其他常用命令

jar -C <目录> <文件或目录>: 在打包或提取时,指定一个工作目录.
jar -i <jar包名.jar>: 为jar包生成索引,用于模块化开发.
jar -M: 在打包时,不生成META-INF/MANIFEST.MF文件.

java

  • -classpath 或 -cp:指定类路径,用于查找类和资源文件。

java -cp "lib/*:." com.example.MainClass

使用 -cp 选项时,类路径中的多个路径用冒号 : (Linux)或分号 ; (Windows)分隔。
JAR 文件中的 META-INF/MANIFEST.MF 文件需要指定 Main-Class,以便使用 -jar 选项时正常运行。
通过这些常用选项和示例,你可以更有效地使用 java 命令来运行 Java 应用程序。

  • -D=:设置系统属性。例如:

java -Denv=production -cp . com.example.MainClass

  • -jar :运行一个 JAR 文件。必须在 JAR 文件中指定 Main-Class。

java -jar myapp.jar

  • -Xmx:设置最大堆内存大小。例如:

java -Xmx512m -cp . com.example.MainClass

  • -Xms:设置初始堆内存大小。例如:

java -Xms256m -cp . com.example.MainClass

  • -version:显示 Java 版本信息。

java -version

  • -help:显示帮助信息。

  • -verbose:开启详细输出,显示类加载信息。

java -verbose -cp . com.example.MainClass

posted @ 2025-07-08 20:56  vonlinee  阅读(22)  评论(0)    收藏  举报