`
penghao122
  • 浏览: 362564 次
  • 性别: 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命令详解

    为了使JAR文件成为可执行文件,开发者需要在`MANIFEST.MF`中添加`Main-Class`字段,指定程序的入口点(即包含`public static void main(String[] args)`方法的类)。例如,如果主类位于`test`包下,名为`Test`,`...

    jar文件如何打开或者jar文件关联到java

    这种方法虽然不能直接运行JAR文件中的程序,但对于查看其内部结构非常有帮助。 #### 二、JAR文件与Java环境的关联 为了使JAR文件能够像其他可执行文件一样直接通过双击打开,我们需要对系统进行一些设置,使其自动...

    Java打包成jar文件,以及将jar文件导出为exe文件方法汇总[汇编].pdf

    Java 打包成 jar 文件和将 jar 文件导出为 exe 文件的方法汇总 本文档将详细介绍 Java 打包成 jar 文件和将 jar 文件导出为 exe 文件的方法汇总。Java 是一种流行的编程语言,广泛应用于软件开发、Android 应用开发...

    apk文件中添加jar文件

    本篇文章将详细讲解如何在APK文件中添加JAR文件,以及涉及到的相关工具——baksmali、apktool和jar2dex。 首先,我们来理解一下JAR文件。Java Archive(JAR)文件是Java平台中用于存储类文件、资源文件和其他相关...

    如何使用Fat Jar在Eclipse中制作jar文件包

    - **包含外部库:** Fat Jar插件的一个显著优势是可以将项目中的外部库(例如第三方jar文件)一同打包进最终的Jar文件中。 - **完成打包:** 点击“Finish”按钮完成Jar文件的生成。 #### 二、将Jar文件转换为可...

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

    标题中的问题“无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl”指出,这可能是Java Web应用开发中遇到的一个常见错误,涉及到JSP(JavaServer Pages)和JSTL(Java...

    jar文件运行批处理

    在Windows系统中,JAR文件不能像EXE文件那样双击直接运行,因为操作系统不知道如何执行Java字节码。为了解决这个问题,我们可以创建一个批处理(BAT)文件来调用Java虚拟机(JVM)执行JAR文件。下面将详细解释这个...

    程序可能用到的Jar文件

    3. 资源压缩:JAR文件中的资源会被自动压缩,减少传输和存储占用。 六、现代Java打包工具 1. Maven:通过POM.xml配置,自动管理依赖,构建JAR、WAR等不同类型的归档文件。 2. Gradle:灵活的构建系统,支持多项目...

    java生成Jar文件命令

    例如,如果你的所有类文件都在`src`目录下,且你想将它们打包到名为`myapp.jar`的Jar文件中,你可以使用以下命令: ```bash jar cvf myapp.jar -C src . ``` 这里的`-C src .`意味着从`src`目录下选择所有内容(`....

    在eclipse中把java文档打包成jar文件

    Manifest文件是Jar文件中的一个文本文件,用于描述Jar文件的元数据,包括Jar文件的名称、版本号、入口类、依赖的库文件等信息。在Eclipse中,我们可以手动编写Manifest文件,也可以让Eclipse自动生成Manifest文件。 ...

    修改jar包中的class文件

    在Java开发过程中,有时我们需要对已经打包好的JAR文件中的class文件进行修改,这通常是由于修复bug、更新功能或者优化代码等原因。本文将详细介绍如何在不重新编译整个项目的情况下,修改并替换JAR文件中的class...

    jar文件电脑使用模拟器

    JAR文件是Java平台中用于打包和分发应用程序的标准格式,它包含了编译后的Java类、资源文件和元数据。这些文件通常用于运行Java应用程序或库,尤其是对于移动设备如早期的Java ME(Mobile Edition)应用。 1. **...

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

    4. **优化类加载**:JAR文件中的类可以被Java虚拟机(JVM)优化加载,减少内存占用和提高性能。 5. **网络传输**:由于JAR文件的压缩特性,它们在网络传输时更为高效。 6. **插件系统**:许多Java应用支持通过加载...

    lib中的jar lib中的jar包

    - **类的加载**:JVM可以直接加载`jar`文件中的类,无需先解压。 - **资源文件的管理**:`jar`文件可以包含图片、配置文件等资源,便于组织和访问。 - **安全性**:`jar`文件支持数字签名,确保代码的完整性和来源。...

    从jar文档中读取文件

    例如,manifest 可以指明由 JAR 文件中的哪一个文件开始运行应用程序,或者指定这个库的版本等。 要从 JAR 文件中得到它所包含的文件内容,可以使用 Java 提供的 JarFile 类,它是一个 .jar 文件自身的引用。其中的...

    文件上传jar文件

    通过理解每个JAR文件提供的功能,我们可以更好地利用这些工具来优化我们的代码,提高应用程序的用户体验。在进行文件上传的项目时,正确使用这些库可以显著降低开发复杂度,同时提升应用程序的可靠性和效率。

Global site tag (gtag.js) - Google Analytics