Java:创建自解压jar,可以从归档中提取部分内容吗?

时间:2011-08-23 23:31:21

标签: java installer jar self-extracting

我知道如何创建可执行的.jar文件。互联网上有很多例子。我想知道的是,如果有人知道可执行文件.jar文件可以自动将部分内容提取到“运行目录”中吗?

所以,而不是:

jar xf TicTacToe.jar TicTacToe.class TicTacToe.properties
java -jar TicTacToe.jar

我只想这样做:

java -jar TicTacToe.jar TicTacToe.class TicTacToe.properties

这基本上是一个自解压安装程序。这是否可行,如果是这样,执行此操作需要哪些代码

注意:最终,一旦它工作,我将它包装到launch4j中,以便模拟.exe自解压安装程序。

2 个答案:

答案 0 :(得分:8)

您可以编写一个main方法来检查文件是否存在,如果没有提取它们(通过将资源流复制到文件中)。如果您只需要一组固定的文件(例如您的示例),可以通过以下方式轻松完成:

public class ExtractAndStart
{
    public static void main(String[] args)
    {
        extractFile("TicTacToe.properties");
        Application.main(args);
    }

    private static void extractFile(String name) throws IOException
    {
        File target = new File(name);
        if (target.exists())
            return;

        FileOutputStream out = new FileOutputStream(target);
        ClassLoader cl = ExtractAndStart.class.getClassLoader();
        InputStream in = cl.getResourceAsStream(name);

        byte[] buf = new byte[8*1024];
        int len;
        while((len = in.read(buf)) != -1)
        {
            out.write(buf,0,len);
        }
        out.close();
            in.close();
    }
}

还有自我提取档案的创建者,但他们通常会提取所有内容,然后启动一些内部组件。

以下是一篇简短的文章:

http://www.javaworld.com/javatips/jw-javatip120.html

它建议使用看起来过时的ZipAnywhere。但Ant Installer可能是一个不错的选择。

答案 1 :(得分:2)

您可以使用以下模式确定加载类的jar:

SomeClass.class.getProtectionDomain().getCodeSource().getLocation().getFile()

由此,您应该能够使用ZipInputStream迭代jar的内容并将其解压缩到您要安装到的目录。