# java打jar

back

# 通过IDEA打包纯jar包

只含有字节码文件,即只含有class文件的jar包怎么制作,这是最简单的形式

# 制作只含有字节码文件的jar包

back

# 直接输出hello

back

最终生成的jar包结构

META-INF
Hello.class
1
2
  • 用记事本写一个Hello.java的文件
class Hello{
public static void main(String[] agrs){
System.out.println("hello");
    }
}
1
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包

back

最终生成的jar包结构

META-INF
Tom.class
Hello.class
1
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
  • 编译: 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

事先准备好上述的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包

back

最终生成的jar包结构

META-INF
com
 Tom.class
Hello.class
1
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包

back

# 资源文件在jar包内部

back

最终生成的jar包结构

META-INF
Hello.class
text.txt
1
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

# 资源文件在另一个jar包内部

back

最终生成的jar包结构

hello.jar
resource.jar
 text.txt
1
2
3

同1一样,只不过需要在MENIFEST文件中将resource.jar加入classpath

# 资源文件在jar包外部

back

最终生成的jar包结构

hello.jar
text.txt
1
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