web-dev-qa-db-ja.com

main()メソッド内から実行可能jarの名前を取得します

実行可能jarを作成し、commons-cliを使用して、ユーザーがクライアントを起動するときにコマンドラインパラメーターを指定できるようにしました。すべてが正常に動作します。ただし、jarの使用法ステートメントを印刷するとき、次のように表示したいと思います。

usage: Java -jar myprog.jar <options> <file>
--help Display the help message
--debug Enable debugging
....

Commons-cliを使用すると、すべてのオプションを簡単に印刷できます。ただし、「usage」行はヘッドスクラッチ機能です。アプリケーションに渡されるargs []から「myprog.jar」の名前を取得する方法がわかりません。

これを行う簡単な方法はありますか?かなり複雑なメソッドを使用してクラスのクラスローダーからトレースをバックし、それがjarに含まれているかどうかを把握できますが、これは非常に単純な質問に対するかなりshouldい答えのようです。

private String getPath(Class cls) {
    String cn = cls.getName();
    String rn = cn.replace('.', '/') + ".class";
    String path =
            getClass().getClassLoader().getResource(rn).getPath();
    int ix = path.indexOf("!");
    if(ix >= 0) {
        return path.substring(0, ix);
    } else {
        return path;
    }
}
29
Eric B.

どうぞ:

_new Java.io.File(SomeClassInYourJar.class.getProtectionDomain()
  .getCodeSource()
  .getLocation()
  .getPath())
.getName()
_

編集: getSourceCode APIに関するコメントを見ました。まあ、これはおそらくJavaでできることです。 getCodeSource()nullを返すことについては、主に_Java.lang.*_のクラスおよびソースの場所が「隠されている」他の特別なクラスで発生すると思います。ただし、独自のクラスで動作するはずです。

47
rodion

いずれにしても、getPath()を呼び出す前に.toURI()を追加する必要があります。これは、JavaのURL実装にいくつかの癖があるためです。詳細については、「 Javaで特殊文字を避けるためにURLをエンコードする方法 」を参照してください。

1
Michael Wyraz