`
penghao122
  • 浏览: 357552 次
  • 性别: Icon_minigender_1
  • 来自: 广东珠海
社区版块
存档分类
最新评论

在程序中更新jar文件

    博客分类:
  • java
阅读更多
我们知道,用ZIP,jar可以将多个文件一起打包,如classes,images etc. 其实我们可以用J2SE的SDK提供的Jar命令来创建Jar文件,尽管我们可以通过该命令添加一个文件到Jar包中,但我们没有很直接的办法在程序中这么做,也没有办法通过Jar命令在Jar中删除一个或多个文件,

下面我们来研究一下如何更新一个Jar:要更新一个Jar,你必须创建原Jar文件的一个拷贝,在我们更新完拷贝后移除原文件,然后将拷贝重命名为原文件名就可以了。(译者注:我曾经试图找过更直接的办法,但是徒劳。只是找到这篇文章的原文) 对于添加一个或多个文件,删除一个或多个文件,思路应该是一样的。我们将举例更新一个Jar文件。

首先我们应该知道如何列出Jar文件中的Entries:

JarFile jar = new JarFile(name);        Enumeration e = jar.entries();        while (e.hasMoreElements()) {          System.out.println("\t" + entry.getName());              } 

然后我们要知道如何写入Jar文件


while (entries.hasMoreElements()) {          JarEntry entry = (JarEntry) entries.nextElement();          InputStream is = jar.getInputStream(entry);          newJar.putNextEntry(entry);          while ((bytesRead = is.read(buffer)) != -1) {                newJar.write(buffer, 0, bytesRead);          }       }


这里的输出是一个JarOutputStream


    File tempJar = File.createTempFile(nameOfJar, null);          JarOutputStream newJar = new JarOutputStream(          new FileOutputStream(tempJar));


在确定更新成功时,我们不要忘记删除原文件,并重新命名临时文件。


if (success) {         File origFile = new File(nameOfJar);         origFile.delete();         tempJar.renameTo(origFile);       }


下边我们将给出完整的代码:

import java.io.*;    import java.util.*;    import java.util.zip.*;    import java.util.jar.*;        public class AddFileToJar {          public static void main(String args[]) {        if (args.length != 2) {          System.err.println(            "command: java AddFileToJar example.jar filetoadd.txt");          System.exit(-1);        }            String nameOfJar = args[0];        String nameToAdd = args[1];            File tempJar = null;        try {          tempJar = File.createTempFile(nameOfJar, null);        } catch (IOException e) {          System.err.println("Unable to create intermediate file.");          System.exit(-2);        }            JarFile jar = null;        try {          jar = new JarFile(nameOfJar);        } catch (IOException e) {          System.err.println("Unable to access original file.");          System.exit(-3);        }            // Only rename file at end on success        boolean success = false;            try {              JarOutputStream newJar =            new JarOutputStream(              new FileOutputStream(tempJar));              byte buffer[] = new byte[1024];          int bytesRead;              try {            FileInputStream fis = new FileInputStream(nameToAdd);                // Add back the original files                Enumeration entries = jar.entries();                while (entries.hasMoreElements()) {              // Prompt for copy              JarEntry entry = (JarEntry) entries.nextElement();              String name = entry.getName();              System.out.println                ("Copy " + name + " into new jar? (y or n)");              BufferedReader reader =                 new BufferedReader                  (new InputStreamReader(System.in));              String line = reader.readLine();              if ("n".equals(line)) {                // if user enters n, don't copy file,                 // move to next name                System.out.println("Skipping: " + name);                continue;              }              InputStream is = jar.getInputStream(entry);              newJar.putNextEntry(entry);              while ((bytesRead = is.read(buffer)) != -1) {                newJar.write(buffer, 0, bytesRead);              }            }                // Add new file last            try {              JarEntry entry = new JarEntry(nameToAdd);              newJar.putNextEntry(entry);                  while ((bytesRead = fis.read(buffer)) != -1) {                newJar.write(buffer, 0, bytesRead);              }            } finally {              fis.close();            }            success = true;          } catch (IOException ex) {            System.err.println              ("Operation aborted due to : " + ex);          } finally {            try {              newJar.close();            } catch (IOException ignored) {            }          }        } catch (IOException ex) {          System.err.println(            "Can't access new file");        } finally {          try {            jar.close();          } catch (IOException ignored) {          }              if (!success) {            tempJar.delete();          }        }            if (success) {          File origFile = new File(nameOfJar);          origFile.delete();          tempJar.renameTo(origFile);        }      }    }

分享到:
评论
1 楼 tiankang 2009-05-22  
稍微整理下代码格式吧,如果觉得网页编辑器不好用就上传文件,也是一样的。^_^

相关推荐

    JAR文件包及jar命令详解

    如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且据说 JET 也不是能...

    使用exe 文件启动jar文件

    使用exe 文件启动jar文件,同时不需要java环境就可以运行java程序的方法 用批处理文件运行程序似乎不够专业,虽然它足以完成运行任务。但习惯就象一种毒药一旦染上就很难摆脱它的影响,Windows统治下的人们早已经...

    sqljdbc4.jar程序文件

    用于连接sql2008数据库的驱动程序,jar文件

    JDBC的 驱动包 ojdbc14.jar 程序文件

    JDBC的 驱动包 ojdbc14.jar 程序文件 ----oracle jdbc driver for jdk1.5

    使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core],

    无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core],解决办法:WEB/INF的lib下,除了导入jstl.jar包,还要导入standard.jar包。另外,解压standard.jar包,把.tld文件...

    jar文件生成exe文件和制作安装包

    Step1:将程序打包成一个.jar文件,如果项目中包含了外部的jar文件,则可以利用工具fat-jar来打包。 Step2:得到瘦身的jre,这个可以使用工具GreenJVMMaker来制作,下载地址:...

    Java程序打包成jar文件

    NULL 博文链接:https://jarg.iteye.com/blog/852885

    java开发工具之jar文件生成器

    jar文件生成器,用于将java代码生成成*.jar文件。 用在java程序开发环境中,非常有用的工具,原来是收费,现在把它转为免费。

    通过jar命令生成可执行的jar文件

    注意:此时生成的jar文件只能在装配好Java虚拟机的PC才能正常使用 更好的方法是通过MyEclipse的net.sf.fjep.fatjar_0.0.31.jar插件进行自动生成。 具体如下: 1. 安装插件net.sf.fjep.fatjar_0.0.31.jar插件,直接将...

    jar文件转为exe

    5、在这里填写Main class的名字,单击绿色+选择所需的.jar文件,如果没有特殊要求我们就可以再继续了。 6、接下来是选择jre版本,填写好jre的最大最小版本然后再继续。 7、下面设一下你的文件执行的片头,增加其...

    Volley.jar程序文件

    Android Volley的jar包,包中含有源码。

    java 程序都编译成执行文件jar命令详解

    如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且据说 JET 也不是能...

    JAR文件包及jar命令详解.CHM

    JAR文件包及jar命令详解.CHM <br> JAR文件包及jar命令详解 常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样...

    SpringMvc官网2014.5月更新的所有使用到的jar包

    1 SpringMvc 最新在2014年5月官方网站所更新的jar文件 我自己有根据官网文档 及 网上资料 对jar文件解释了逐个的解释 来帮助初学者 了解springMVC的jar文件意思 2 能更快的、方便的、在学习开发中找出程序所出现的...

    jar文件转换成exe文件

    jar文件转换成exe文件的方法以及程序的打包的方法,非常的好用!初学Java的人一定要看一下!很有帮助

    JAR 文件揭密.mht

    在本文中,作者探讨了JAR 格式的许多功能和优势,包括打包、可执行的 JAR 文件、安全性和索引。 JAR 文件是什么? JAR 文件格式以流行的 ZIP 文件格式为基础,用于将许多个文件聚集为一个文件。与 ZIP 文件不同的...

    无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl

    免费下载,解压后将tld和lib文件夹放入WEB-INF下面即可,绝对有效立竿见影

Global site tag (gtag.js) - Google Analytics