Java: создание самораспаковывающейся фляги, которая может извлечь часть себя из архива? - PullRequest
5 голосов
/ 24 августа 2011

Я знаю, как создать исполняемый файл .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 ]

8 голосов
/ 13 февраля 2013

Вы можете написать основной метод, который проверяет наличие файлов и, если нет, извлекает их (путем копирования потока ресурсов в файл). Если вам нужен только фиксированный набор файлов (как в вашем примере), это легко сделать с помощью этого:

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 может быть хорошей альтернативой.

2 голосов
/ 24 августа 2011

Вы можете определить, из какого jar-класса был загружен класс, используя следующий шаблон:

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

После этого вы сможете использовать ZipInputStream для перебора содержимого файла jar и извлечения его в каталог, в который вы хотите установить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...