5

我知道如何创建一个可执行的 .jar 文件。互联网上有很多这样的例子。我想知道的是,是否有人知道可执行 .jar 文件可以自动将自身的一部分提取到“运行目录”的方式?

所以,而不是:

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

我只想这样做:

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

这基本上是一个自解压安装程序。这是否可能,如果可以,需要什么代码来执行此操作

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

4

2 回答 2

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

于 2013-02-12T23:08:06.363 回答
2

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

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

从那里,您应该能够使用ZipInputStream迭代 jar 的内容并将它们提取到您要安装到的目录中。

于 2011-08-23T23:39:03.177 回答