実行可能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;
}
}
どうぞ:
_new Java.io.File(SomeClassInYourJar.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath())
.getName()
_
編集: getSourceCode APIに関するコメントを見ました。まあ、これはおそらくJavaでできることです。 getCodeSource()
がnull
を返すことについては、主に_Java.lang.*
_のクラスおよびソースの場所が「隠されている」他の特別なクラスで発生すると思います。ただし、独自のクラスで動作するはずです。
いずれにしても、getPath()を呼び出す前に.toURI()を追加する必要があります。これは、JavaのURL実装にいくつかの癖があるためです。詳細については、「 Javaで特殊文字を避けるためにURLをエンコードする方法 」を参照してください。