Java中基本的打包jar和war文件(包括eclipse打包操作)

前言:

为什么要打jar包?

1、举个例子,当编写一个工具类库,里面有十几个类,每个类对应一个class文件时,为了方便别人调用,是不是要装在一个文件中,方便传递和引用。

2、打jar包还有一个好处,就是不包含源文件,对于一些机密信息的库,jar包和代码混浊是一个首选。

3、方便部署和引用。

打包jar有两类,包含main入口和不包含main入口的(大概的意思是比如一些jar是直接类库引用的,不需要执行,这些就不用包含main入口),这里一般都是包含main入口的进行测试。包含main入口也叫做可执行jar文件。

在打包可执行jar文件时,通常会有一个指定Main-Class入口的文件MANIFEST.MF,一般这个文件是放置在META-INF目录。详细的配置参考:http://www.cnblogs.com/EasonJim/p/6485677.html

war是针对web项目的,同时war包也是为了方便部署。

经过测试,在web项目上也能到处jar包,如果指定了Main-Class入口,也是能正常输出的。

JAR和WAR包的本质区别应该在于目录的结构,其打包的命令都是jar去完成的;结构参考:http://www.cnblogs.com/EasonJim/p/6498804.html

一、命令行:

1、JAR:

jar命令行的说明:jar -h

用法: jar {ctxui}[vfmn0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项:
    -c  创建新档案
    -t  列出档案目录
    -x  从档案中提取指定的 (或所有) 文件
    -u  更新现有档案
    -v  在标准输出中生成详细输出
    -f  指定档案文件名
    -m  包含指定清单文件中的清单信息
    -n  创建新档案后执行 Pack200 规范化
    -e  为绑定到可执行 jar 文件的独立应用程序
        指定应用程序入口点
    -0  仅存储; 不使用任何 ZIP 压缩
    -M  不创建条目的清单文件
    -i  为指定的 jar 文件生成索引信息
    -C  更改为指定的目录并包含以下文件
如果任何文件为目录, 则对其进行递归处理。
清单文件名, 档案文件名和入口点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。

示例 1: 将两个类文件归档到一个名为 classes.jar 的档案中:
       jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 'mymanifest' 并
           将 foo/ 目录中的所有文件归档到 'classes.jar' 中:
       jar cvfm classes.jar mymanifest -C foo/ .

注意:jar打包也叫压缩,就唯一一个方法。

假设我已经建立好代码文件,命名为MyProgram.java,内容如下:

package jartest;

public class MyProgram {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("hello world");
    }

}

注意:上面包含了包名jartest。

接下来要做的就是使用javac进行编译出字节码class文件。命令如下:

javac jartest/MyProgram.java

测试编译出的字节码在运行上会有所不同,你不能进入到jartest文件夹来运行,只能在外部这样执行:

java jartest.MyProgram

然后在最外层目录上新建MANIFEST.MF文件,内容如下:

Manifest-Version: 1.0
Main-Class: jartest.MyProgram

注意:上面的内容上要留多一行空的,不然无法识别。

接下来就是测试命令行:

参考:http://www.jb51.net/article/43033.htm

这里假设我的文件放在这个目录:D:\开发工程\GitHub\5_java_example\packagetest\commandlinetest\jar\,那么命令行需要进入到这个目录下。

①打包

jar cf JAR文件名称 程序文件名称或者程序所在的文件夹(可以使用通配符查找文件)

举例:

jar cf MyApp.jar jartest\MyProgram.class

②查看一个jar文件的内容

jar tvf JAR文件名称

举例:

jar tvf MyApp.jar

③将一个jar文件解压缩

jar xf JAR文件名称

举例:

jar xf MyApp.jar

④往压缩包里面增加文件

jar xf JAR文件名称 添加的文件或者其他的jar文件

举例:

jar xf MyApp.jar jartest\MyProgram_new.class.class

⑤更新一个jar文件

jar uf JAR文件名称 更新的文件或者其他的jar文件

举例:

jar uf MyApp.jar jartest\MyProgram_new.class.class

⑥创建一个可以运行的jar文件

jar cvfm MyApp.jar MANIFEST.MF 文件或文件夹路径

举例:

jar cvfm MyApp.jar MANIFEST.MF jartest\MyProgram.class 

⑦运行一个jar程序

java -jar JAR文件名称

举例:

java -jar MyApp.jar

 

测试工程:https://github.com/easonjim/5_java_example/tree/master/packagetest/commandlinetest/jar

 

2、WAR:

经过研究,打war包也是通过jar命令进行完成,不同的是后缀变了,所以直接运行上面的打包命令即可。

 

 

 

 

二、GUI工具eclipse:

1、JAR:

eclipse下打jar包相对来说比较简单,不用关心MANIFEST.MF文件的编写,只需要把核心放在代码上即可。

具体操作:

说明:假设已经建立好工程,下面就是直接GUI的操作。

①项目->【右键】->【Export】

②选择【JAR file】

③选择要导出包的文件和路径

④Next

⑤选择Main class:

⑥测试到处的包能不能正常输出

完全正常。

 

总结:其实eclipse这样的GUI工具非常方便的到处jar包,并且可以选择其它的选项,而且免去自己手动配置这些文件的问题。

项目地址:https://github.com/easonjim/5_java_example/tree/master/packagetest/eclipsetest/jar

 

2、WAR:

说明:

war包一般针对web项目,但是经过测试web项目也能到处jar包,并可以指定入口,也就是可以执行。

war包一般是部署到容器中运行,比如tomcat,但是用jetty可以实现内嵌web的方式,然后用java -jar去运行,从而实现可执行的war包方式。这里先不讲解这种方式,后面再开专题详解研究。可以参考:https://www.eclipse.org/jetty/。线索:jetty内嵌war、war内嵌tomcat。

具体操作:

这里假设已经建立好web项目。

①新建web项目(重点在如何新建jsp项目)

新建jsp页面

 右键,【Run as】->【Run On Server】

②到处war包

项目右键->【Export】->【WAR file】

 

 

总结:到处war包相对来说比较简单。

项目地址:https://github.com/easonjim/5_java_example/tree/master/packagetest/eclipsetest/war

 

三:maven

此方法省略,以后会统一详解maven的构建。

posted @ 2017-02-28 23:50  EasonJim  阅读(19645)  评论(0编辑  收藏  举报