`
sh9533
  • 浏览: 7487 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用jar命令创建可执行的jar包

阅读更多
jar文件听说过吗,没有?或者陌生!好,没关系,这就是我们的第一站:打包发布。
为什么会有这个玩意呢,首先,这是jar的全称:JavaTM Archive (JAR) file,是的,就是java存档文件。这有点类似zip文件,想一想它是干什么的用的呢,压缩!?没错就是要压缩,将我们原先零散的东西放到一下,重新组织,所有这些目的只有一个:方便!好了,不用管他是怎么压缩的,我们的重点是哪些是我们要压缩的(输入),还有压缩成了什么(输出),进而将它发布(部署)。
   那我们的输入(要压缩的东西)主要是class文件,还有辅助的资源(这其中可能有图片,jsp文件,html文件等等)。Jar技术在jdk1.1版本中就已存在,在1.2中又有了增强。接下来说说jar的好处吧,这是官方的描述:安全,快速下载,压缩,猎取包,版本化包,可携。  
  说了这么多,我们现在开始实施。   
  先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1.1或以上版本),看到什么:   
  用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...   
  选项:   
  -c 创建新的存档
  -t 列出存档内容的列表
  -x 展开存档中的命名的(或所有的〕文件
  -u 更新已存在的存档
  -v 生成详细输出到标准输出上
  -f 指定存档文件名
  -m 包含来自标明文件的标明信息
  -0 只存储方式;未用zip压缩格式
  -M 不产生所有项的清单(manifest〕文件
  -i 为指定的jar文件产生索引信息
  -C 改变到指定的目录,并且包含下列文件:  
  如果一个文件名是一个目录,它将被递归处理。   
  清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。   
  示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:

  jar cvf classes.jar Foo.class Bar.class   
  示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有文件存档到一个名为 'classes.jar' 的存档文件中:

  jar cvfm classes.jar mymanifest -C foo/ .   
  来个小例子试试看:
  我们只有一个HelloWorld,如下:   

  public class HelloWorld{
  public static void main(String[ ] args){
  System.out.println("Hi, Hello World!");
  }
  }  
  将这个java文件存到C盘跟目录下,ok,接下来,   
  在先前打开的命令提示符下(跳转到C盘提示符下),我们输入javac HelloWorld.java,然后继续输入:jar  cvf  hello.jar  HelloWorld.class,回车后去你的C盘看看,多了什么,没错 hello.jar 。
  基本的步骤我们现在都知道了,你可以自己去尝试一下随着jar后面的参数的不同,结果有什么变化。   
  紧接着我们看看如何运行我们的jar包。   
  在进入正题之前,你要先打开我们刚刚做好的jar包看看,多了什么呢,META-INF目录?再看看里面是什么,还有一个MANIFEST.MF文件是不是?用文本编辑器(我这里是UltraEdit)打开它看看:

  Manifest-Version: 1.0
  Created-By: 1.4.2 (Sun Microsystems Inc.)   
  就是这样。这里我们对它进行修改,加一句:Main-Class: HelloWorld (在第三行)。这个就是我们之前写的那个类,也就是我们的入口类。也即,

  Manifest-Version: 1.0
  Created-By: 1.4.2 (Sun Microsystems Inc.)
  Main-Class: HelloWorld  
  接下来,我们在命令提示符里执行:

    这里我们对它进行修改,加一句:Main-Class: HelloWorld (在第三行,注意在Main-Class:和类之间要有一个空格,否则运行时说“Invalid or corrupt jarfile xxx.jar”)。这个就是我们之前写的那个类,也就是我们的入口类。也即:(文件未尾的两个空行不能少,否则运行时也说“Invalid or corrupt jarfile xxx.jar”)
Manifest-Version: 1.0
Created-By: 1.6.0 (Sun Microsystems Inc.)
Main-Class: HelloWorld


接下来,我们在命令提示符里执行:   
jar umf MANIFEST.MF hello.jar
  这样我们使用了我们自己的MANIFEST.MF文件对原来默认的进行了更新(其实也可用winrar之类的解压工具打开jar包,把新的MANIFEST.MF拖进去)。最后的一步,验证我们做的一切,在命令提示符中输入:


Ok,这个最后的一步了,来验证我们做的一切,在命令提示符中输入:

  java -jar hello.jar(执行)   
  出现了什么, Hi, Hello World!



二、关于MANIFET.MF文件:
       打 Java 包的时候可以有一个清单文件:MANIFEST.MF,它是打包的关键性文件,主要是设置执行入口类和支持库的路径,在运行Java 应用程序时会根据此文件中给出的信息来查找入口类和支持库。
它的内容一般包括:
Manifest-Version: 1.0
Created-By: 1.6.0 (Sun Microsystems Inc.)
Main-Class: HelloWorld


其中比较容易忽略的是还可以有一个Class-Path属性的设置,Class-Path:用来指定支持库的路径,程序运行时依据 Class-Path项的设置路径来查找支持库,每一个支持库之间用空格分开。比如这样写清单文件:
Manifest-Version: 1.0
Class-Path: ./lib/msbase.jar ./lib/mssqlserver.jar ./lib/msutil.jar
Created-By: 1.6.0 (Sun Microsystems Inc.)
Main-Class: org.qiujy.test.TestDB


这样当前目录的 lib 目录下的几个包都可以在运行时被找到,我们制作可自运行的 Java 程序时,就不用写一个批处理文件来写明 CLASSPATH ,直接在这里指定就可以了。
       示例:
       1) 在D:/qiujyJarTest目录下写一个测试数据库连接的类:  
package org.qiujy.test;

import java.sql.*;

public class TestDB{

    public static void main(String[] args){
        String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=myblog";
        try{
            Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
            Connection conn = DriverManager.getConnection(url, "sa","");
            System.out.println(conn);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
       2) 用如下命令编译此文件:
javac -d . TestDB.java
       就会在当前目录生成带包结构的TestDB.class文件:
       3) 在当前文件下创建一jar清单文件qiujyManifest.txt (文件名随便取):(注意每行的”:”后有一空格,文件未尾有两空行)
Manifest-Version: 1.0
Class-Path: ./lib/msbase.jar ./lib/mssqlserver.jar ./lib/msutil.jar
Main-Class: org.qiujy.test.TestDB


       此时D:/qiujyJarTest目录的结构如下:
     
4) 用如下命令打jar包:
jar -cmvf qiujyManifest.txt test.jar lib org
此命令的含义是:指定打包的清单文件为当前目录下的qiujyManifest.txt,打当前目录下的lib和org目录打到test.jar包中。此时在当前目录下就会生成一个test.jar包。
       5) 测试打包是否成功:
       启动sqlserver数据库。在命令行用如下命令:java -jar test.jar。如果出现如下信息说明我们打的包成功运行并成功连上数据库。






  我们再来看看jar文件在tomcat中发布,注意:在tomcat中我们就不能再用jar这种格式,而改war格式,它是专门用于web应用的,其实整个过程下来基本上和jar是类似的: 
  先准备我们要打包的资源。   
  找到存放tomcat的webapps目录,进到其中,新建一个文件夹,这里命名为hello,再进去新建WEB-INF文件夹,再进去新建 classes文件夹,此时我们也将我们唯一的servlet,HelloWorld.java放到这里,在与classes目录同级下建立一文件 web.xml。Ok,目前我们初步建立了一个简单的web应用。  
  这是HelloWorld.java:   

  import java.io.*;
  import javax.servlet.*;
  import javax.servlet.http.*;
  public class HelloWorld extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  res.setContentType("text/html");
  PrintWriter out = res.getWriter();
  out.println("");
  out.println("");
  out.println("");
  out.println("Hello, World!");
  out.println("");
  }
  }//end here!  
  对它编译。下面是web.xml:
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
  <web-app>
  <servlet>
  <servlet-name>hello</servlet-name>
  <servlet-class>HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>
  </web-app>

在命令提示符下进到先前创制的hello目录下,执行 jar cvf hello.war * ,我们便得到hello.war。将它拷贝至webapps目录下,ok,来看最后一步,打开tomcat的目录conf中的server.xml,加入:

  <Context path="/hello" docBase="hello.war" debug="0" reloadable="true"/>
  大功告成!运行它,启动tomcat,后在浏览器中输入http://localhost:8080/hello/HelloWorld,有了吗? 
  最后,如果你想用ant来完成以上的打包活动,下面就告诉你:
  对于jar来说。在build.xml中,
  <target name="jar">
  <jar destfile="${app_home}/hello.jar">
  <fileset dir="${dest}" includes="**"/>
  <!--fileset dir="${dest}" includes="**/action.properties"/-->
  </jar>
  </target>  
  对于war,   

  <war warfile="hello.war" webxml="./WEB-INF/web.xml">
  <fileset dir="html"/>
  <lib dir="lib/">
  <exclude name="oracle*.jar"/>
  </lib>
  <classes dir="build/servlets">
  <include name="**/*.class"/>
  </classes>
  </war>  
  好了,就这么多,希望对你有点帮助。:)
  补充: 
  jar基本操作:   
  1. 创建jar文件  
  jar cf jar-file input-file(s)
  c---want to Create a JAR file.
  f---want the output to go to a file rather than to stdout.
  eg: 1)jar cf myjar.jar query_maintain_insert.htm
  2)jar cvf myjar.jar query_maintain_insert.htm
  v---Produces verbose(详细的) output.

  3)jar cvf myjar.jar query_maintain_insert.htm mydirectory
  4)jar cv0f myjar.jar query_maintain_insert.htm mydirectory
  0---don't want the JAR file to be compressed.
  5)jar cmf MANIFEST.MF myjar.jar yahh.txt
  m---Used to include manifest information from an existing manifest file.
  6)jar cMf MANIFEST.MF myjar.jar yahh.txt
  M---the default manifest file should not be produced.
  7)jar cvf myjar.jar *
  *---create all contents in current directory.  
  2. 察看jar文件   
  jar tf jar-file
  t---want to view the Table of contents of the JAR file.
  eg: 1)jar vft yahh.jar
  v---Produces verbose(详细的) output.  
  3. 提取jar文件  
  jar xf jar-file [archived-file(s)]
  x---want to extract files from the JAR archive.
  eg: 1)jar xf yahh.jar yahh.txt(仅提取文件yahh.txt)
  2)jar xf yahh.jar alex/yahhalex.txt(仅提取目录alex下的文件yahhalex.txt)  
  3)jar xf yahh.jar(提取该jar包中的所有文件或目录)  
  4. 修改Manifest文件  
  jar cmf manifest-addition jar-file input-file(s)
  m---Used to include manifest information from an existing manifest file.  
  5. 更新jar文件  
  jar uf jar-file input-file(s)
  u---want to update an existing JAR file.


1、创建可执行的jar包。
手工写manifest.mf文件(jar命令自动生成的MANIFEST.MF文件中不会包含Main-Class属性),举例说明:
目录结构:
mymanifest.mf //该文件可以随意放置,只要在执行jar命令时指定mymanifest.mf文件所在位置.
-src
  -test
    Test.class

test.Test代码:
1 package test;
2 public class Test {
3     public static void main(String[] args) {
4         System.out.println("HelloWorld!");
5     }
6 }

mymanifest.mf文件内容:
Manifest-Version: 1.0
//该属性是创建可执行jar包必需的,指定的Main-Class为全路径类名(且该类必需有main方法)
Main-Class: test.Test
Created-By: wiflish

在src目录下执行:
jar cvfm test.jar ../mymanifest .
完成后会在src目录下生成一个test.jar文件。由于没有可视化界面,双击test.jar将会看到没反应。
在命令行执行java -jar test.jar就会得到输出HelloWorld!

这时就完成了基本的创建可执行的jar包。

2、创建要依赖其他包的可执行jar包。
这时只要更改mymanifest.mf文件加入:
Manifest-Version: 1.0
//该属性是创建可执行jar包必需的,指定的Main-Class为全路径类名(且该类必需有main方法)
Main-Class: test.Test
//该属性指定依赖包的路径(路径是相对jar包所在路径)
Class-Path: lib/swing-layout-1.0.jar //这里举例说明,随便用的包
Created-By: wiflish

目录结构:
-src
  -test
    TestDepends.class //假设该类执行依赖于 swing-layout-1.0.jar,具体代码略。
  testDepends.jar
  -lib
    swing-layout-1.0.jar

双击testDepends.jar就能正确执行,如果TestDepends.jar包所在的当前目录下没有lib/swing-layout-1.0.jar的话,如下目录结构:
-src
  -test
    TestDepends.class //假设该类执行依赖于 swing-layout-1.0.jar,具体代码略。
  testDepends.jar
双击testDepends.jar,将会报Could not find the main class, Program will exit.
在命令行执行 java -jar testDepends.jar,就会得到找不到TestDepends.class中所依赖的类的错误.
分享到:
评论

相关推荐

    JAR文件详解和相关实例

    本说明中包括了对jar文件的解释,以及如何创建可执行的jar文件和相关的jar命令,并有具体的例子拱对比参考。

    Excel数据操纵-jar包-jxl.jar

    //创建可写工作薄  WritableSheet ws = wwb.createSheet("sheet1", 0);//创建可写工作表  Label labelCF=new Label(0, 0, "hello");//创建写入位置和内容  ws.addCell(labelCF);//将Label写入sheet中  Label...

    生成可读取配置文件的独立运行jar程序IDEA模版工程

    根据文章创建的模版工程文件,下载后可直接编辑main方法,根据自己的需求自定义逻辑内容,编译后获取independent.jar文件,修改配置文件后,通过java -jar independent.jar 执行命令,正常执行。

    jcruncher:Java 8库和_或可执行jar,用于编译lesscss和handlebars

    作为可执行Jar(即jcruncherEx) 生成可执行jar 要将这个库构建为可执行的jar(即jcruncherEx.jar),请使用以下maven命令: mvn clean compile assembly:single Lesscss和车把支持 jcruncher 0.9.4当前受支持: ...

    解包打包android内核system.img文件所需工具

    把unyaffs复制到/usr/bin目录下,并修改权限为可执行。 然后cd到system.img目录下(假定目录为system目录),执行命令:unyaffs system.img 然后对system目录下的文件进行修改。 注意:修改完后的文件要...

    jhcbot:一个适用于https的简单机器人

    JHCBot-1.0-SNAPSHOT-jar-with-dependencies.jar此可执行jar具有已包装在pom.xml所有依赖项。 您可以使用它直接运行该机器人,尽管它稍重一些。 跑步 首先,为机器人jhcbot.xml或jhcbot.properties创建/修改配置...

    diy-distributed-databases:在 Emily Greens SPA 2015 分布式数据库会议期间与 Anna Shipman 创建的代码

    SPA 2015 分布式数据库会议的一部分。...) 使用以下命令运行可执行 jar: java -jar target/diy-dist-db-1.0-SNAPSHOT-jar-with-dependencies.jar写代码有两种方法可以解决这个问题: 坚持这个项目,并在src/main

    struts2-core-2.3.31.jar

    045)远程代码执行漏洞原理基本相同,均是由于上传功能的异常处理函数没有正确处理用户输入的错误信息,导致远程攻击者可通过发送恶意的数据包,利用该漏洞在受影响服务器上执行任意命令。  二、漏洞危害  攻击者...

    springboot参考指南

    创建一个可执行jar x. 12. 接下来阅读什么 4. III. 使用Spring Boot i. 13. 构建系统 i. 13.1. Maven i. 13.1.1. 继承starter parent ii. 13.1.2. 使用没有父POM的Spring Boot iii. 13.1.3. 改变Java版本 iv. ...

    diy-dist-db-java:SPA 2015分布式数据库会议的一部分

    您可以使用assembly:single目标创建一个包含所有依赖项的可执行jar,例如: mvn clean compile assembly:single 跑步 首先使用以下命令启动至少一个节点节点: diy-dist-db-node 8080 (将不同的端口用于不同的...

    设备控制+数据采集+产品溯源系统源码+项目说明(完整物联网高分项目).zip

    生成可执行的 jar 包 mvn clean package -Dmaven.test.skip=true 创建 MySQL 容器 docker run --name=mysql -p 8888:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql:latest 修改 MySql远程访问密码加密方式 alter user '...

    MiMaSimu:适用于最小机器的模拟器,在卡尔斯鲁厄(Karlsruhe)的套件中进行了教学,并带有图形用户界面

    创建可执行的JAR文件 转到bin文件夹 使用jar cvfe MiMaSimu.jar org.Mima org创建一个jar文件 使用以下命令执行: java -jar MiMaSimu.jar 一般说明 可以通过单击“编辑存储器”按钮来编辑内部存储器。 扩展名为...

    后端工作门户

    运行./gradlew bootjar创建可执行的jar。 该jar将位于构建目录内。 要在Docker容器中运行,请使用以下命令 要构建docker镜像,请使用以下命令docker build -t your_tag_name . 要运行生成的容器,请使用以下命令...

    BubbleChess:Drexel CS451 Winter '15 团队 BubblePipe 的存储库

    从源代码创建可执行文件 按照以下说明创建 Server.jar 和 Client.Jar 文件 服务器 在eclipse中打开项目 右键单击 com.bubblechess.server 包并点击导出 从子菜单 java 中选择可运行的 JAR 文件 选择 ServerDriver 的...

    weblogic集群部署文档.docx

    然后输入命令: java -jar wls1036_generic.jar 点击回车后程序会启动weblogic安装文件的图形安装界面。 按下来的安装和在windows中安装普通文件一样了。 2、点击“下一步”,到下图界面,然后输入weblogic的安装...

    MENHBSA4SWSC

    您可以使用jar命令在文件的根目录下创建jar。 JFI,使用构建工具(例如ant)来进行维护相对容易。 要通过五个执行者来执行以运行jar文件:运行jar的命令行示例为java -jar MENHBSA4SWSC.jar out.stat problem.xml ...

    FirstFollow-Generator:生成给定的无上下文语法的第一个,遵循和预测的集合

    第一追随者 生成给定的无上下文语法的第一个,遵循和预测的集合... 或使用以下命令创建可执行jar文件: ant jar 要求 为了运行生成器,您需要Java Runtime Environment 9或更高版本。 上下文无关文法的语法 以下规则用

    dropwizard-gradle-kotlin-starter:使用Gradle运行Dropwizard的Pure Kotlin示例项目

    该示例利用插件,该插件将所有依赖项和项目代码折叠到单个Jar文件中,其概念类似于Maven Shade,从而创建了自包含的可执行Jar。入门为了创建一个运行的Jar,运行gradlew shadowJar 。 这会将结果输出到build/libs/...

    mybatis-generator 自动生成代码

    通过mybatis-generator-...连接数据库,通过配置文件自动生成对应表的mybatis的配置文件,a.bat是通过cmd命令运行可执行jar mybatis-generator-core-1.3.1.jar ,通过 generatorConfig.xml的配置生成代码到相应位置.

    name-parser-cli:GBIF 科学名称解析器库的 Java 命令行界面

    成功安装maven后,将项目编译成可执行的JAR文件,使用命令提示符打开POM.xml所在的文件夹。 然后执行命令“mvn package” jar 文件将在目标文件夹下创建。 光盘目标 执行命令 java -jar name-parser-cli.jar "Poa ...

Global site tag (gtag.js) - Google Analytics