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)简单的

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)带包名的打包

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

  

      新建目录 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

      

      编译 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();
}
}

    

    编译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

java打包小记的更多相关文章

  1. java打包遇到问题java.io.IOException: invalid header field

    问题:java打包时报以下错误 $ jar -cvmf main.txt test.jar Shufile1.class java.io.IOException: invalid header fie ...

  2. effective java读书小记(一)创建和销毁对象

    序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...

  3. Java打包生成exe(使用exe4j和inno setup)

    Java打包生成exe 生成jar 先使用eclipse生成可执行的jar[可执行的jar包含内容更全面,包括指定主类的.mf] Exe4j的使用 一定要可执行jar进行打包. Project typ ...

  4. 用idea工具对java打包:命令 mvn clear package,报错

    用idea工具对java打包:命令 mvn clear package,报错 网上都是eclipse的,要么是project structure和setting的(当然这俩也要用) 我都试了,每一个能 ...

  5. java打包成jar,但不打包配置文件

    有时候我们做java project的时候,都会打包成jar程序,为了方便部署会加个配置文件conf/pro.properties(conf文件夹与src文件夹同级) 但是不想打包进jar.其实用ec ...

  6. [Java] Java 打包成jar包 和 解压jar包

    解压jar包 jar xf xxx.jar 打包成jar包 方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] ...

  7. java打包压缩文件

    package com.it.simple.util; import java.io.BufferedOutputStream;import java.io.ByteArrayOutputStream ...

  8. java 打包插件

    是时候闭环Java应用了 原创 2016-08-16 张开涛  你曾经因为部署/上线而痛苦吗?你曾经因为要去运维那改配置而烦恼吗?在我接触过的一些部署/上线方式中,曾碰到过以下一些问题: 1.程序代码 ...

  9. java打包/命令行方式运行jar(命令行进行程序测试)

    public class Testtmp { public static void main(String[] args) { // TODO Auto-generated method stub f ...

随机推荐

  1. 【Java】《Java程序设计基础教程》第七、八章学习

    第七章 异常处理 通过try...catch...finally结构来捕获一个或多个异常 第八章 Java的输入与输出及文件操作 8.1 文件 File类常用的方法 1. public boolean ...

  2. BZOJ1499: 瑰丽华尔兹(单调队列)

    pro: 给出一个n*m的地图,刚开始人在(x,y),每次给出一段区间(l,r,t),表示在时间[l,r]内,可以使人向4个方向(t)移动一格,或者不动.求最大可以移动多少格. sol: 考虑每一列( ...

  3. 在windows下安装cx_Oracle问题

    将 instantclient_11_2 所在的目录添加到环境变量,但是环境变量有时没有立即生效,可以复制 oci.dll(版本也要正确)到 \Python36\Lib\site-packages 目 ...

  4. python 添加Windows权限

    # -*- coding: utf-8 -*- """ Created on Mon Jan 8 09:09:51 2018 @author: coordinate &q ...

  5. Asia Jakarta Regional Contest 2019 I - Mission Possible

    cf的地址 因为校强, "咕咕十段"队获得了EC-final的参赛资格 因为我弱, "咕咕十段"队现在银面很大 于是咕咕十段决定进行训练. 周末vp了一场, 这 ...

  6. Stirling数入门

    第一类Stirling数 定义 $$\begin{aligned}(x)_n & =x(x-1)...(x-n+1)\\&= s(n, 0) + s(n,1)x +..+s(n,n)x ...

  7. BM算法【实数模板】

    BM递推杜教版是在整数取模的情况下的, 这个可以求解实数系数,但是可能有精度误差. 若一个问题的结论是通过推线性递推式来解,考虑到实际的情况,可以用BM算法的模板,先输入项数再依次输入项,项越多越准确 ...

  8. centos7.2(二)搭建lamp(Apache+PHP+Mysql环境)教程

    开始安装前,看说明. 说明0  查看服务器是否能被ssh登陆 http://tool.chinaz.com/port/ 如果显示关闭,说明被大陆封闭了,删除服务器重新建立一个. 说明1:Centos7 ...

  9. Otsu 类间方差法

    又称最大类间方差法.是由日本学者大津(Nobuyuki Otsu)于1979年提出的[1],是一种自适合于双峰情况的自动求取阈值的方法.又叫大津法,简称Otsu.   算法提出初衷是是按图像的灰度特性 ...

  10. Windows 2008R2 安装PostgreSQL 11.6

    前些天在CentOS 7.5 下安装了PostgreSQL 11.6.除了在无外网环境下需要另外配置之外,其他没有什么差别.今天主要写一下在Windows下面安装PostgreSQL的问题. 在官网看 ...