# java打jar
# 通过IDEA打包纯jar包
只含有字节码文件,即只含有class文件的jar包怎么制作,这是最简单的形式
# 制作只含有字节码文件的jar包
# 直接输出hello
最终生成的jar包结构
META-INF
Hello.class
1
2
2
- 用记事本写一个Hello.java的文件
class Hello{
public static void main(String[] agrs){
System.out.println("hello");
}
}
1
2
3
4
5
2
3
4
5
- 用命令行进入到该目录下,编译这个文件
- 将编译后的Hello.class文件打成jar包
jar -cvf hello.jar Hello.class
1
c表示要创建一个新的jar包,v表示创建的过程中在控制台输出创建过程的一些信息,f表示给生成的jar包命名
- 运行jar包
java -jar hello.jar
1
这时会报如下错误 hello.jar中没有主清单属性
添加Main-Class属性
用压缩软件打开hello.jar,会发现里面多了一个META-INF文件夹,里面有一个MENIFEST.MF的文件,用记事本打开
在第三行的位置写入 Main-Class: Hello (注意冒号后面有一个空格,整个文件最后有一行空行),保存
# 含有两个类的jar包
最终生成的jar包结构
META-INF
Tom.class
Hello.class
1
2
3
2
3
- 用记事本写一个Hello.java和一个Tom.java的文件
class Hello{
public static void main(String[] agrs){
Tom.speak();
}
}
class Tom{
public static void speak(){
System.out.println("hello");
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 编译: javac Hello.java
此时Hello.java和Tom.java同时被编译,因为Hello中调用了Tom,在编译Hello的过程中发现还需要编译Tom
- 打jar包,这次我们换一种方式直接定义Main-Class。
Manifest-Version: 1.0
Created-By: 1.8.0_121 (Oracle Corporation)
Main-Class: Hello
1
2
3
2
3
事先准备好上述的MENIFEST.MF文件,并存放在META-INF文件夹下,此时打jar包的命令如下
jar -cvfm hello.jar META-INF\MENIFEST.MF Hello.class Tom.class
1
该命令表示用第一个文件当做MENIFEST.MF文件,hello.jar作为名称,将Hello.class和Tom.class打成jar包。其中多了一个参数m,表示要定义MENIFEST文件
- 运行 java -jar hello.jar ,此时成功在控制台看到 hello ,成功
# 有目录结构的jar包
最终生成的jar包结构
META-INF
com
Tom.class
Hello.class
1
2
3
4
2
3
4
- 同样准备好MENIFEST文件
jar -cvfm hello.jar META-INF\MENIFEST.MF Hello.class com
1
注意,最后一个com表示把com这个文件夹下的所有文件都打进jar包
- 运行 java -jar hello.jar ,此时成功在控制台看到 hello
# 制作含有资源文件的jar包
# 资源文件在jar包内部
最终生成的jar包结构
META-INF
Hello.class
text.txt
1
2
3
2
3
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
class Hello{
public static void main(String[] args) throws Exception{
Hello hello = new Hello();
InputStream is = hello.getClass().getResourceAsStream("text.txt");
print(is);
}
/**
* 读取文件,输出里面的内容,通用方法
*/
public static void print(InputStream inputStream) throws Exception {
InputStreamReader reader = new InputStreamReader(inputStream, "utf-8");
BufferedReader br = new BufferedReader(reader);
String s = "";
while ((s = br.readLine()) != null)
System.out.println(s);
inputStream.close();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 资源文件在另一个jar包内部
最终生成的jar包结构
hello.jar
resource.jar
text.txt
1
2
3
2
3
同1一样,只不过需要在MENIFEST文件中将resource.jar加入classpath
# 资源文件在jar包外部
最终生成的jar包结构
hello.jar
text.txt
1
2
2
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
class Hello{
public static void main(String[] args) throws Exception{
Hello hello = new Hello();
InputStream is = new FileInputStream("text.txt");
print(is);
}
/**
* 读取文件,输出里面的内容,通用方法
*/
public static void print(InputStream inputStream) throws Exception {
InputStreamReader reader = new InputStreamReader(inputStream, "utf-8");
BufferedReader br = new BufferedReader(reader);
String s = "";
while ((s = br.readLine()) != null)
System.out.println(s);
inputStream.close();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22