Java:创建可以从归档文件中提取自身部分的自提取jar



我知道如何创建一个可执行的.jar文件。网上有很多这样的例子。我想知道的是,如果有人知道一种方法,一个可执行的。jar文件可以自动提取出自己的部分到"运行目录"?

所以,而不是:

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

我只想这样做:

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

这基本上是一个自提取安装程序。这是可能的吗?如果是的话,需要什么代码来完成这个?

注意:最终,一旦它工作了,我将把它包装到launch4j中,以模拟.exe的自提取安装程序。

您可以编写一个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可能是一个不错的选择。

您可以使用以下模式确定一个类是从哪个jar中加载的:

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

从此,您应该能够使用ZipInputStream遍历jar的内容并将它们解压缩到您想要安装的目录。

最新更新