【初心者向け】java -jar コマンドでJVM(-D)オプションが効かない、ライブラリがバグってるんじゃないかと言いたくなったとき。
背景
Java製のOSSや社内に閉じたライブラリを開発していると、こんな問い合わせを受けることが何度かあったので、せめてQiitaに書いておけばググって自己解決してくれるのではないかという淡い期待をこめて。
問い合わせはこんな感じ
パターン1
ライブラリのドキュメントには、-Dxxxx=yyyy
を指定すると、xxxx
オプションが有効になると書いてありますが、動作しません。ライブラリがバグってませんか?
パターン2
組み込みTomcat(またはJettyなど)を使用したjarを起動する際、JMXを有効にするために-Dcom.sun.management.jmxremote
やそのほかJMXのオプションをつけてますが、アプリケーションを起動してもJMXのポートがLISTENになりません。
組み込みTomcat(またはJettyなど)のパラメータ調整が必要でしょうか?
バグってるのはライブラリでもServletコンテナでもない
java -jar zzzz.jar -Dxxxx=yyyy -Dcom.sun.management.jmxremote
一見特段問題なく見えるんですが、正しくは下記の通りです。
java -Dxxxx=yyyy -Dcom.sun.management.jmxremote -jar zzzz.jar
要するに、-jar
オプションの後にJVM引数を指定するなって話ですね
ちなみに、java -help
コマンドで、ちゃんと順序は明示されています。言うまでもなく[options]
がJVMオプションで、[args]
がプログラムが処理するコマンドライン引数ですね。
$ java -help
使用方法: java [options] <mainclass> [args...]
(クラスを実行する場合)
または java [options] -jar <jarfile> [args...]
(jarファイルを実行する場合)
または java [options] -m <module>[/<mainclass>] [args...]
java [options] --module <module>[/<mainclass>] [args...]
(モジュールのメイン・クラスを実行する場合)
または java [options] <sourcefile> [args]
(単一のソースファイル・プログラムを実行する場合)
メイン・クラス、ソース・ファイル、-jar <jarfile>、
-mまたは--module <module>/<mainclass>に続く引数は、メイン・クラスへの引数として
渡されます。
... 以下、略
最後に
JVMオプションが効かない!?ってときは、他人を疑う前に、まずは自分の打ち込んだコマンドをご確認ください。
Author And Source
この問題について(【初心者向け】java -jar コマンドでJVM(-D)オプションが効かない、ライブラリがバグってるんじゃないかと言いたくなったとき。), 我々は、より多くの情報をここで見つけました https://qiita.com/hoshi-k/items/55d3ea2d4744f8e9bd9c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .