java打包小记
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打包小记的更多相关文章
- java打包遇到问题java.io.IOException: invalid header field
问题:java打包时报以下错误 $ jar -cvmf main.txt test.jar Shufile1.class java.io.IOException: invalid header fie ...
- effective java读书小记(一)创建和销毁对象
序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...
- Java打包生成exe(使用exe4j和inno setup)
Java打包生成exe 生成jar 先使用eclipse生成可执行的jar[可执行的jar包含内容更全面,包括指定主类的.mf] Exe4j的使用 一定要可执行jar进行打包. Project typ ...
- 用idea工具对java打包:命令 mvn clear package,报错
用idea工具对java打包:命令 mvn clear package,报错 网上都是eclipse的,要么是project structure和setting的(当然这俩也要用) 我都试了,每一个能 ...
- java打包成jar,但不打包配置文件
有时候我们做java project的时候,都会打包成jar程序,为了方便部署会加个配置文件conf/pro.properties(conf文件夹与src文件夹同级) 但是不想打包进jar.其实用ec ...
- [Java] Java 打包成jar包 和 解压jar包
解压jar包 jar xf xxx.jar 打包成jar包 方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] ...
- java打包压缩文件
package com.it.simple.util; import java.io.BufferedOutputStream;import java.io.ByteArrayOutputStream ...
- java 打包插件
是时候闭环Java应用了 原创 2016-08-16 张开涛 你曾经因为部署/上线而痛苦吗?你曾经因为要去运维那改配置而烦恼吗?在我接触过的一些部署/上线方式中,曾碰到过以下一些问题: 1.程序代码 ...
- java打包/命令行方式运行jar(命令行进行程序测试)
public class Testtmp { public static void main(String[] args) { // TODO Auto-generated method stub f ...
随机推荐
- Python使用pip安装TensorFlow模块
1.首先确保已经安装python,然后用pip来安装matplotlib模块. 2.进入到cmd窗口下,建议执行python -m pip install -U pip setuptools进行升级. ...
- spring的声明式事务和编程式事务
事务管理对于企业应用来说是至关重要的,当出现异常情况时,它可以保证数据的一致性. Spring事务管理的两种方式 1.编程式事务 使用Transaction Ttempleate或者直接使用底层的Pl ...
- Python 代码混淆和加密技术
动机 Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向. 混淆和加密就有所必要了. 混淆 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站. ...
- KMP + BZOJ 4974 [Lydsy1708月赛]字符串大师
KMP 重点:失配nxtnxtnxt数组 意义:nxt[i]nxt[i]nxt[i]表示在[0,i−1][0,i-1][0,i−1]内最长相同前后缀的长度 图示: 此时nxt[i]=jnxt[i]=j ...
- vue 自动px单位自动转换rem
vue 适配移动端 假设设计图是375 第一步 安装 lib-flexible npm i lib-flexible --save 第二步 安装 px2rem-loader npm install p ...
- [USACO14MAR] Sabotage 二分答案 分数规划
[USACO14MAR] Sabotage 二分答案 分数规划 最终答案的式子: \[ \frac{sum-sum[l,r]}{n-len[l,r]}\le ans \] 转换一下: \[ sum[1 ...
- Comet OJ 2019 夏季欢乐赛题解
Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...
- siblings() 方法
siblings([selected]) 简介: 给定一个表示一组DOM元素的jQuery对象,该.siblings()方法允许我们在DOM树中搜索这些元素的兄弟节点,并从匹配的元素构造一 ...
- 【loj2262】【CTSC2017】网络
题目 一颗\(n\)个点的树,求加入一条边点之后两点间最长距离的最小值 : \(n \le 100000\) ; 题解 首先加入边的两个端点一定在直径上面,先\(dfs\)拎出直径来讨论(下标只代表直 ...
- 安卓入门教程(十三)-Activity
已经发表个人公众号 什么是Activity? Android是由Activity,Service,Content,Provider等组件组成,其中要讲的就是Activity组件,这是最基本,且常用的组 ...