39

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

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

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

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

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;
    }
}
4

2 に答える 2

61

どうぞ:

new java.io.File(SomeClassInYourJar.class.getProtectionDomain()
  .getCodeSource()
  .getLocation()
  .getPath())
.getName()

編集: getSourceCodeAPIについてのコメントを見ました。まあ、これはおそらくJavaでできる最善の方法です。getCodeSource()戻ることについては、主にソースの場所が「隠されている」クラスやその他の特別なクラスnullで発生すると思います。java.lang.*ただし、自分のクラスで機能するはずです。

于 2012-06-22T15:35:31.870 に答える
2

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

于 2014-03-10T09:59:57.893 に答える