以编程方式将jar文件中的类文件复制到另一个jar中

时间:2014-10-02 05:44:22

标签: java jar

我有一个应用程序作为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目标)。

我是在正确的轨道上,还是在鼹鼠山上建造一座山?

提前感谢您的帮助。

0 个答案:

没有答案