用java程序实现jar包

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用java程序实现jar包

最近想给原来写的一个程序打个patch,最原始的方法就是用jar命令重新打一个jar包.就是觉得太麻烦了......

最近想给原来写的一个程序打个patch,最原始的方法就是用jar命令重新打一个jar包.就是觉得太麻烦了,仅仅修改了一个文件却要把整个工程重新打包,而且担心新的jar包总会不会给系统带来意想不到的问题.于是写了一个patch程序把修改后文件自动添加进原来的jar包.

方法其实很简单:

要用到的关键类如下:

java.util.jar.JarEntry;

java.util.jar.JarInputStream;

java.util.jar.JarOutputStream;

java.util.jar.Manifest;

这些类在java的工具包中专门用于处理压缩包(当然也包括zip文件)

代码如下:

byte[] buffer = new byte[2048];

int read = 0;

//读取jar文件流,这一步是读取需要更新的jar包.

JarInputStream zin = new JarInputStream(new

FileInputStream(".xxxx.jar"));

JarEntry entry;

//

Manifest manifest = zin.getManifest(); if (manifest == null) {

manifest = new Manifest();

}

//用JarOutputStream 建立输出文件

FileOutputStream fout = new FileOutputStream("D:xxxx.jar");

JarOutputStream zout = new JarOutputStream(fout,manifest);

//从原jar包中读取文件

while ((entry = zin.getNextJarEntry()) != null) {

if(entry.getName().equalsIgnoreCase("com/xxxx/yyyy/CsvFactory.class" ))

{

//需要修改的文件不写入新的jar包

continue;

}

zout.putNextEntry(entry);

while ((read = zin.read(buffer)) != -1) { zout.write(buffer, 0, read);

}

zout.closeEntry();

}

//修改过后的class文件

File f = new File("D:CsvFactory.class"); InputStream fs = new FileInputStream(f); JarEntry jare = new

JarEntry("com/xxxx/yyyy/CsvFactory.class");

zout.putNextEntry(jare);

//写入输出流

while ((read = fs.read(buffer)) != -1) { zout.write(buffer, 0, read);

}

//关闭流

zout.closeEntry();

zout.close();

fs.close();

zin.close();

这只是简单的对原来的jar文件进行的读写操作,在读之前应该先备份原jar

包,然后在执行读写,这样可以防止不必要的误操作导致系统的崩溃.

值得注意的地方是新建输出流的时候

JarOutputStream zout = new JarOutputStream(fout,manifest);

参数manifest是十分必要的,因为jar包的读取是不会把manifest也写入输

出流. 不要试图操作JarEntry.delete()或者JarFile.delete()这样的方法,在对

jar文件操作的时候是没有提供这两个方法,我一直习惯于文件操作的

file.delete()方法在操作jar文件时总是试图JarEntry提供delete方法,后来发

现这样的delete放过就根本没有提供,这下总算知道为什么用winrar打开压缩文

件删除其中一个文件时为什么会不停的刷新,实际上就是一个解压在打包的过程,并

不是直接delete了压缩包的文件.

相关文档
最新文档