5

実行可能な.jarファイルを作成する方法を知っています。インターネット上にはその例がたくさんあります。私が疑問に思っているのは、実行可能な.jarファイルがそれ自体の一部を「実行ディレクトリ」に自動抽出できる方法を誰かが知っているかどうかです。

したがって、代わりに:

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

私はこれだけをしたい:

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

これは基本的に自己解凍型インストーラーになります。これは可能ですか?もしそうなら、これを行うためにどのようなコードが必要ですか?

注:最終的には、動作したら、.exe自己解凍インストーラーをエミュレートするためにlaunch4jにラップします。

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インストーラーは良い代替手段かもしれません。

于 2013-02-12T23:08:06.363 に答える
2

次のパターンを使用して、クラスがロードされたjarを判別できます。

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

ZipInputStreamそれから、jarの内容を繰り返し処理し、インストール先のディレクトリに抽出するために使用できるはずです。

于 2011-08-23T23:39:03.177 に答える