• 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:开发工程GitHub5_java_examplepackagetestcommandlinetestjar,那么命令行需要进入到这个目录下。

    ①打包

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

    举例:

    jar cf MyApp.jar jartestMyProgram.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 jartestMyProgram_new.class.class

    ⑤更新一个jar文件

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

    举例:

    jar uf MyApp.jar jartestMyProgram_new.class.class

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

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

    举例:

    jar cvfm MyApp.jar MANIFEST.MF jartestMyProgram.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的构建。

  • 相关阅读:
    解决使用vim-go插件时候保存go代码导致设置好的折叠消失的问题
    golang中从一个日期开始往后增加一段时间
    linux kernal oom killer 学习
    awk学习笔记
    FlexMonkey实战
    如何阅读一本书-读书笔记
    Oracle性能问题sql调优脚本集
    了解ORACLE培训OCA-OCP-OCM课程表
    Sublime Text 3设置笔记
    【总结】AngularJs学习总结
  • 原文地址:https://www.cnblogs.com/EasonJim/p/6481704.html
Copyright © 2020-2023  润新知