用java程序实现jar包
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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了压缩包的文件.