我有一个应用程序作为jar文件(包括一堆类。)
在应用程序的运行中,我想创建一个新的Jar文件作为输出。
如果我将当前jar中的各个类作为资源获取,将它们作为相应的类写入磁盘,那么我就可以做到这一点,然后当我创建新的jar文件时,将它们全部读入并创建新的JAR。 / p>
但是,我不认为这很聪明也没有效率......而且我可能会忽略一些非常明显的东西......
我希望我可以简单地将资源复制到内存中,而无需再次将文件写出来。
今天我这样做:
File[] list = new File {
new File("Class1.class");
new File("Class2.class");
Manifest m = new Manifest();
m.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
m.getMainAttributes().put(Attributes.Name.MAIN_CLASS, main_class);
JarOutputStream target = new JarOutputStream(new FileOutputStream(fout), manifest);
for(int n=0;n<list.length;n++) {
add(list,target)
}
target.close();
功能添加如下:
private static void add(File source, JarOutputStream target) throws IOException
{
BufferedInputStream in = null;
try {
JarEntry entry = new JarEntry(source.getPath().replace("\\", "/"));
entry.setTime(source.lastModified());
target.putNextEntry(entry);
in = new BufferedInputStream(new FileInputStream(source));
byte[] buffer = new byte[1024];
while (true) {
int count = in.read(buffer);
if(count == -1)
break;
target.write(buffer, 0, count);
}
target.closeEntry();
} finally {
if (in != null)
in.close();
}
}
现在一切正常......但它依赖于我正在从磁盘读取相关类文件的事实。我想要做的是从资源jar文件中读取相关的类文件...然后将我想要的类文件写回一个全新的jar文件。
理想情况下,我想做的是:
在主要应用程序中:
InputStream[] stream = new InputStream[] {
MyClass.class.getResourceAsStream("Class1.class"),
MyClass.class.getResourceAsStream("Class2.class")};
然后取出该流并将其写回一个新的Jar文件。
所以现在使上面的add函数成为一个add(InputStream,JarOutputStream目标)。
我是在正确的轨道上,还是在鼹鼠山上建造一座山?
提前感谢您的帮助。