java打包小记

时间:2023-12-29 11:02:50

1.一个类的

Hello.java

class Hello{
public static void main(String[] agrs){
System.out.println("hello");
}
}

生成class  javac Hello.java

打包 jar -cvf hello.jar Hello.class

说明:

  c表示要创建一个新的jar包

  v表示创建的过程中在控制台输出创建过程的一些信息

  f表示给生成的jar包命名

运行 java -jar hello.jar

提示 hello.jar中没有主清单属性

用压缩软件打开hello.jar,META-INF文件夹,里MENIFEST.MF,用记事本打开,添加Main-Class属性

修改为

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)
Main-Class: Hello

保存后运行java -jar hello.jar

输出Hello

2.两个类的

(1)简单的

java打包小记

World.java

class World{
public static String say(){
return "world";
}
}

Hello.java

class Hello{
public static void main(String[] agrs){
System.out.println("hello "+World.say());
}
}

都编译成class

手动添加META-INF/MANIFEST.MF

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)
Main-Class: Hello

打包  jar -cvfm hello.jar META-INF\MANIFEST.MF Hello.class World.class

运行 java -jar hello.jar

输出 hello world

  (2)带包名的打包

java打包小记

com/World.java

package com;
public class World{
public static String say(){
return "world";
}
}

编译为class

Hello.java

import com.World;
class Hello{
public static void main(String[] agrs){
System.out.println("hello "+World.say());
}
}

编译为class

运行 java Hello

输出 Hello World

打包 jar -cvfm hello.jar META-INF\MENIFEST.MF Hello.class com

运行java -jar hello.jar

输出 Hello World

但是hello.jar包里的com下包含World.class和World.java

优化:

  新建target目录

  javac com/World.java -d target

  javac Hello.java -d target

  复制目录加文件 META-INF/MANIFEST.MF

  jar -cvfm hello.jar META-INF\MANIFEST.MF *

3.带jar的打包

  (1)world.jar

  com/World.java

package com;
public class World{
public static String say(){
return "world";
}
}

  新建world目录

  javac com/world.java -d world

  在world下添加目录和文件  META-INF/MANIFEST.MF

MANIFEST.MF的内容

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)

  进入world 目录

  执行打包 jar -cvfm world.jar META-INF\MANIFEST.MF *

  (2)Hello.jar

import com.World;
class Hello{
public static void main(String[] agrs){
System.out.println("hello "+World.say());
}
}

  新建target

  将Hello.java和world.jar复制到target下,进入target目录

  编译,生成class  javac -cp world.jar Hello.java

  删除Hello.java

  添加目录和文件  META-INF/MANIFEST.MF

MANIFEST.MF的内容 

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)
Main-Class: Hello
Class-Path: world.jar

  打包 jar -cvfm hello.jar META-INF\MANIFEST.MF *

  运行 java -jar hello.jar

  输出 hello world

说明:

   -cp 表示 -classpath,指的是把tom.jar加入classpath路径下

4.带资源的打包  

  (1)资源在jar内

  Hello.java

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
class Hello{
public static void main(String[] args) throws Exception {
Hello hello = new Hello();
InputStream is = hello.getClass().getResourceAsStream("aa.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();
}
}

  新建resource

  编译 javac Hello.java -d resource

  添加目录和文件  META-INF/MANIFEST.MF

MANIFEST.MF的内容 

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)
Main-Class: Hello

  添加文本文件aa.txt,输入点内容

  进入resource目录

  打包  jar -cvfm hello.jar META-INF\MANIFEST.MF *

  运行  java -jar hello.jar

  输出 文件内容

  (2)资源在另一个jar包内

    <1>资源包reource.jar

  java打包小记

      新建目录 r1

      添加文件 aa.txt

      添加目录和文件  META-INF/MANIFEST.MF

MANIFEST.MF的内容 

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)

      打包  jar -cvfm resource.jar META-INF\MANIFEST.MF  *

    <2> hello.jar

      Hello.jave

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
class Hello{
public static void main(String[] args) throws Exception {
Hello hello = new Hello();
InputStream is = hello.getClass().getResourceAsStream("aa.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();
}
}

      resource目录只保留META-INF/MANIFEST.MF,内容为

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)
Main-Class: Hello
Class-Path: resource.jar

      添加resource.jar

      java打包小记

      编译 javac -cp resource/resource.jar Hello.java -d resource

      打包 jar -cvfm hello.jar META-INF\MANIFEST.MF *
   (3)资源在jar包外

    Hello.java

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader; class Hello {
public static void main(String[] args) throws Exception {
Hello hello = new Hello();
InputStream is = new FileInputStream("aa.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();
}
}

    java打包小记

    编译javac  Hello.java -d resource

    进入resource

    MANIFEST.MF内容为

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)
Main-Class: Hello

    打包 jar -cvfm hello.jar META-INF\MANIFEST.MF *

    新建aa.txt,输入内容

    运行 java -jar hello.jar

    输出aa.txt的内容

注意:

  META-INF/MANIFEST     

Manifest-Version: 1.0  
Main-Class: package.classname    
Class-Path: a.jar b.jar

  后面跟着一个英文的冒号,冒号后面必须跟着一个空格 

  Class-Path中的各项应使用空格分隔,不是逗号或分号

  Class-Path中如果有很多项,写成一行打包的时候会报错line too long,这时需要把Class-Path分多行写

  从第二行开始,必须以两个空格开头,一个空格结尾

  Class-Path写完之后最后一定要有一个空行

说明:

  程序中System.out.println输出中文乱码的解决方法

    编译时指定编码为UTF-8

    javac -encoding utf-8 Hello.java