java原始命令打jar包及idea打jar包

原始命令打jar包

简述:

jar包(文件)就是 Java Archive File(Java档案[归档]文件),是 Java 的一种文件格式,可将多个文件组合成一个文件。一个JAR文件由一系列采用Zip压缩格式的文件构成,同时还有一张“清单(Manifest)”,对所有这些文件进行了描述。JDK提供的许多类,也是以jar包的形式提供的。
jar包用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。jar文件中有一个特定目录——META-INF,其中包含特殊的文件——MANIFEST.MF,用来定义扩展与档案打包相关数据信息,运行时向JVM提供应用程序的有关数据信息。

清单(Manifest)文件格式规则:

1.文件中的内容以键值对的形式出现,键值对之间采用”冒号和空格”进行分隔(注意:冒号后的空格必须有,不然格式有错误).

2.每行最多72个字符,换行继续必须以空格开头 。

3.Class-Path指定引用jar包的目录。调用多个jar时,每一个用空格(由一个或多个空格)隔开,不是逗号或分号,一行写不下(超过72个字符),从第二行开始,每行开头要至少一个空格。如:

Class-Path: lib/tools.jar lib/guava-r09.jar lib/guice-2.0.jar

lib/jakarta.commons.lang-2.2.jar

  1. 文件的最后必需要空行,而且必须顶格。

官网说明:https://docs.oracle.com/en/java/javase/18/docs/specs/jar/jar.html

jar 命令的一些说明:jar -h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
用法: jar [OPTION...] [ [--release VERSION] [-C dir] files] ...
jar 创建类和资源的档案, 并且可以处理档案中的
单个类或资源或者从档案中还原单个类或资源。

示例:
# 创建包含两个类文件的名为 classes.jar 的档案:
jar --create --file classes.jar Foo.class Bar.class
# 使用现有的清单创建档案, 其中包含 foo/ 中的所有文件:
jar --create --file classes.jar --manifest mymanifest -C foo/ .
# 创建模块化 jar 档案, 其中模块描述符位于
# classes/module-info.class:
jar --create --file foo.jar --main-class com.foo.Main --module-version 1.0
-C foo/ classes resources
# 将现有的非模块化 jar 更新为模块化 jar:
jar --update --file foo.jar --main-class com.foo.Main --module-version 1.0
-C foo/ module-info.class
# 创建包含多个发行版的 jar, 并将一些文件放在 META-INF/versions/9 目录中:
jar --create --file mr.jar -C foo classes --release 9 -C foo9 classes

要缩短或简化 jar 命令, 可以在单独的文本文件中指定参数,
并使用 @ 符号作为前缀将此文件传递给 jar 命令。

示例:
# 从文件 classes.list 读取附加选项和类文件列表
jar --create --file my.jar @classes.list


主操作模式:

-c, --create 创建档案
-i, --generate-index=FILE 为指定的 jar 档案生成
索引信息
-t, --list 列出档案的目录
-u, --update 更新现有 jar 档案
-x, --extract 从档案中提取指定的 (或全部) 文件
-d, --describe-module 输出模块描述符或自动模块名称

在任意模式下有效的操作修饰符:

-C DIR 更改为指定的目录并包含
以下文件
-f, --file=FILE 档案文件名。省略时, 基于操作
使用 stdin 或 stdout
--release VERSION 将下面的所有文件都放在
jar 的版本化目录中 (即 META-INF/versions/VERSION/)
-v, --verbose 在标准输出中生成详细输出

在创建和更新模式下有效的操作修饰符:

-e, --main-class=CLASSNAME 捆绑到模块化或可执行
jar 档案的独立应用程序
的应用程序入口点
-m, --manifest=FILE 包含指定清单文件中的
清单信息
-M, --no-manifest 不为条目创建清单文件
--module-version=VERSION 创建模块化 jar 或更新
非模块化 jar 时的模块版本
--hash-modules=PATTERN 计算和记录模块的散列,
这些模块按指定模式匹配并直接或
间接依赖于所创建的模块化 jar 或
所更新的非模块化 jar
-p, --module-path 模块被依赖对象的位置, 用于生成
散列

只在创建, 更新和生成索引模式下有效的操作修饰符:

-0, --no-compress 仅存储; 不使用 ZIP 压缩

其他选项:

-?, -h, --help[:compat] 提供此帮助,也可以选择性地提供兼容性帮助
--help-extra 提供额外选项的帮助
--version 输出程序版本

如果模块描述符 'module-info.class' 位于指定目录的
根目录中, 或者位于 jar 档案本身的根目录中, 则
该档案是一个模块化 jar。以下操作只在创建模块化 jar,
或更新现有的非模块化 jar 时有效: '--module-version',
'--hash-modules''--module-path'

如果为长选项提供了必需参数或可选参数, 则它们对于
任何对应的短选项也是必需或可选的。

测试

创建文件夹test-jar

在test-jar下创建lib文件夹并把fastjson-1.2.78.jar放到lib目录下。

创建User.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class User {
String id;

public User(String id) {
this.id = id;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

创建Main.java

1
2
3
4
5
6
7
8
9
import com.alibaba.fastjson.JSONObject;

public class Main {

public static void main(String[] args) {
System.out.println(JSONObject.toJSONString(new User("testUser")));
}

}

java -c Main.java

Java -c User.java

新建一个文件myapplication.mf

1
2
3
4
Manifest-Version: 1.0
Created-By: 11.0.15 (Azul Systems, Inc.)
Main-Class: Main
Class-Path: lib/fastjson-1.2.78.jar

新建一个文件夹out,并把Main.class、user.class和lib文件复制到out文件夹下

打包:

1
2
cd test-jar/
jar --create --verbose --file test-jar.jar --manifest myapplication.mf -C ./out/ .

执行:

1
java -jar test-jar.jar

使用idea打包

英文:

​ File -> Project Structure -> artifacts -> + -> jar -> from modules ->选主类和第一个单选按钮 ->确定后会生成Manifest文件

生成:

​ 菜单栏build -> build artifacts ->build

执行:

​ java -jar test-jar.jar

中文:

​ 文件 -> 项目结构 -> 工件 -> + -> jar - > 来自具有依赖项的模块 -> 主类 + 提取到目标jar -> 确定后会生成Manifest文件

生成:

​ 构建 -> 构建工件 -> 构建

使用maven打jar包

方法1:

1.在pom.xml中添加如下配置;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<archive>
<manifest>
<mainClass>EchoServer</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>

2.点击maven project(右边栏)->选择Plugins->选择assembly->点击assembly:assembly

3.执行 java -jar test-netty-1.0-SNAPSHOT-jar-with-dependencies.jar

方法2:

1.在pom.xml中添加如下配置;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>EchoServer</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
  1. maven clean 并且 maven package
  2. java -jar test-netty-1.0-SNAPSHOT.jar

java原始命令打jar包及idea打jar包
http://hanqichuan.com/2022/05/12/java/java原始命令打jar包及idea打jar包/
作者
韩启川
发布于
2022年5月12日
许可协议