JAR的创建、解压、运行、反编译
1. JAR 文件包
JAR( Java Archive File),即它的应用是与 Java 相关,JAR是 Java 的一种文档格式。JAR是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE 应用程序创建的 JAR 文件是 EAR 文件。JAR 文件非常类似 ZIP 文件(准确的说,它就是 ZIP 文件,所以叫它文件包)。
JAR 文件与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。
JAR 文件与 ZIP 文件唯一的区别在于JAR 文件的内容中,包含了 META-INF/MANIFEST.MF 文件,它在生成 JAR 文件的时候自动创建的。
2. 创建可执行的 JAR 文件包
2.1 命令行方法
制作一个可执行的 JAR 文件包来发布程序是 JAR 文件包最典型的用法。
众所周知,Java 程序是由若干个 .class 文件组成的。这些 .class 文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给 CLASSPATH 环境变量或者 java 命令的 -cp 参数;运行时还要到控制台下去使用 java 命令来运行,如果需要直接双击运行必须写 Windows 的批处理文件 (.bat) 或者 Linux 的 Shell 程序。因此,有人笑言:Java 是一种方便开发者苦了用户的程序设计语言。
但若开发者能够将可执行的 JAR 文件包交给用户,那么用户使用起来就很方便了。在 Windows 下安装 JRE (Java Runtime Environment) 的时候,安装文件会将 .jar 文件映射给 javaw.exe 打开。那么,对于一个可执行的 JAR 文件包,用户只需要双击它就可以运行程序了。
创建可执行的 JAR 文件包,需要使用带 cvfm 参数的 jar 命令,以 test 目录为例,命令如下:
jar cvfm test.jar manifest.mf test
这里test.jar 和 manifest.mf 两个文件,分别是对应的参数 f 和 m。
创建可执行的 JAR 文件包,仅靠指定 manifest.mf 文件是不够的,因为 MANIFEST 是 JAR 文件包的特征,可执行的 JAR 文件包和不可执行的 JAR 文件包都包含 MANIFEST。关键在于可执行 JAR 文件包的 MANIFEST,其内容包含了 Main-Class 一项。这在 MANIFEST 中书写格式如下:
Main-Class: 可执行主类全名(包含包名)
例如,假设上例中的 Test.class 是属于 test 包的,而且是可执行的类 (定义了 public static void main(String[]) 方法),那么这个 manifest.mf 可以编辑如下:
Main-Class: test.Test <回车>;
这个 manifest.mf 可以放在任何位置,也可以是其它的文件名,只需要有 Main-Class: test.Test 一行,且该行以一个回车符结束即可。
2.2压缩包方法
使用 WinZip 或者 WinRAR 等工具创建 JAR 文件,具体方法是:
使用 WinZip、WinRAR 等工具创建ZIP 压缩包,在ZIP 压缩包中添加一个包含 MANIFEST 文件的 META-INF 目录即可。对于使用 jar 命令的 -m 参数指定清单文件的情况,只需要将这个 MANIFEST 按需要修改即可。
2.3 Maven命令方法
若使用Maven管理代码,则可以使用Maven命令package进行Jar发布,同时会生成源码的JAR包,均保存在target目录中。
还可以通过install发布到Maven的资源库*享。
2.4 FatJAR工具方法
安装:
下载fatJar插件,解压缩后是一个.../plugins/,把plugins下面的文件夹拷贝到eclipse的plugins下,重新启动Eclipse ,Windows=>prefernce=>看到fat jar preference,就说明已经安装成功了。
缺点:
FatJAR打包方式的缺点是所打包中包含项目中引入的第三方JAR包,因此所打JAR包比较大。
2.5 Eclipse工具方法
在Eclipse中,File=>Jexport=>Jar File 即可。
若想把src附属的资源一起打包,必须使用FatJar => export..=>FatJar。
3. JAR 文件包的解压
Windows 下的 WinZip、WinRAR 等和 Linux 下的 unzip 等是常用的解压缩工具。使用 WinZip 和 WinRAR 等来解压的优势是直观、方便。使用 unzip解压时可以使用 -d 参数指定目标目录。
在解压一个 JAR 文件的时候是不能使用 jar 的 -C 参数来指定解压的目标的,因为 -C 参数只在创建或者更新包的时候可用。那么需要将文件解压到某个指定目录下的时候就需要先将这具 JAR 文件拷贝到目标目录下,再进行解压,比较麻烦。如果使用 unzip,就不需要这么麻烦了,只需要指定一个 -d 参数即可。如:
unzip test.jar -d dest/
4. JAR 文件包的反编译
JD分为JD-GUI、JD-Eclipse两种运行方式,JD-GUI是以单独的程序的方式运行,JD-Eclipse则是以一个Eclipse插件的方式运行。
以JD-GUI为例:
1.)打开软件jd-gui,导入需要打包的jar文件
2.)自动生成的jar的源码
5. JAR 文件包的运行
5. 1 通过BAT运行 JAR
通过bat文件运行jar包程序时,通过jar命令或集成开发环境的打包工具,利用manifest.mf文件将.class文件打成可执行jar包时,如果程序引用大量第三方的jar包,那么会使得manifest.mf文件的编写变得很繁琐,并且可执行的jar需要运行机器上装有jre,考虑通过编写bat文件运行jar包程序。
过程如下:
1 对自己编写的java文件,对其编译,将class文件打成jar包(包名eg DMManager.jar)
2 新建文件夹,作为应用程序的home文件夹(文件夹名eg DMManager)
3 在DMManager文件夹下建立子文件夹lib、bin、jdk
4 将DMManager.jar放入lib下
5 在lib下新建子文件夹other
6 将程序所需的第三方jar包放至other下
7 处理jdk文件夹,jdk文件夹是个可选项,如果要使得程序的执行不依赖与目标机是否装有jre运行环境,那么需将本地JAVA_HOME文件夹下的内容拷贝至该文件夹下
8 编写bat文件(*.bat)
a 利用目标机的jre(第7步可省)
@echo off
cd ..
set APP_HOME=%cd%
cd bin
start "" "%JAVA_HOME%\bin\javaw.exe" -classpath "%APP_HOME%\lib\DMManager.jar" -Djava.ext.dirs="%JAVA_HOME%\jre\lib\ext";"%APP_HOME%\lib\other" -Xms256m -Xmx512m my.package.name.Main
b 利用自身的jre(第7步不能省)
@echo off
cd ..
set APP_HOME=%cd%
set JAVA_HOME=%APP_HOME%\jdk
cd bin
start "" "%JAVA_HOME%\bin\javaw.exe" -classpath "%APP_HOME%\lib\DMManager.jar" -Djava.ext.dirs="%JAVA_HOME%\jre\lib\ext";"%APP_HOME%\lib\other" -Xms256m -Xmx512m my.package.name.Main
9 将*.bat文件放至bin下
10 双击*.bat即可运行
5. 2 Linux下运行 JAR
可将jar包上传至linux /opt/test/目录下:
1)以crontab方式运行该jar包(定时任务)
crontab -e
00 15 * * * /home/sswitch/web/j2ee/jdk/bin/java -Dfile.encoding=GBK -jar /opt/test/test.jar > /dev/null
则运行jar包时,在命令后加上encoding参数,如下:
java -Dfile.encoding=GBK
其中etc/sysconfig/i18n文件内容如下:
#----------------
LANG="zh_CN.GB18030"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312.zh_CN"
SUPPORTED="en_US.UTF-8:en_US:en:zh_CN.UTF-8:zh_CN:zh:fr_FR.UTF-8:fr_FR:fr:de_DE.UTF-8:de_DE:de:ja_JP.UTF-8:ja_JP:ja:es_ES.UTF-8:es_ES:es"
SYSFONT="latarcyrheb-sun16"
#----------------
2)以后台方式运行该jar包
nohup java -jar /opt/test/test.jar&
查看该jar包是否已运行:ps -ef | grep java