0

JVM のパラメーターを渡すために、実行可能な .jar ファイルのラッパーを作成しようとしています。私のラッパーの関連コードは次のとおりです。

public static void main(String[] args) throws IOException
      String[] cmdArray = {"java",
        System.getProperty("os.arch").contains("64") ? "-d64" : "",
        "-XX:+AggressiveHeap",       
        "-jar",
        "/lib/A.jar"  //replace with jar name 
            };
      Runtime.getRuntime().exec(cmdArray);
}

A.jar ファイルは、Wrapper プロジェクトで参照されているライブラリ (ビルド パスとクラス パスに追加) です。例:

 Wrap
   >src
       >org
           >Wrapper.java
   >lib
       >A.jar

Wrapper プロジェクト (B.jar と呼びましょう) から 2 つ目の jar ファイルを作成すると、その内容は次のようになります。

lib
   >A.jar
org
   >eclipse
          >jdt
             >... (i.e., all the files for the jarinjarloader)
   >Wrapper.class
META-INF
       >MANIFEST.MF

2 番目の jar のマニフェスト ファイルは次のようになります。

Manifest-Version: 1.0
Rsrc-Class-Path: lib/A.jar
Class-Path: .
Rsrc-Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Main-Class: org.Wrapper

B.jar ファイルを起動すると、プロセスが開始されたことが示されますが、A.jar ファイルは呼び出されず、起動されません。エラーも例外もありません。プロセスが開始および終了します。コマンドラインから起動して、ダブルクリックも試みました。

MANIFEST.MF ファイルを次のように変更すると、

Rsrc-Class-Path: A.jar

からのWrapper.javaのメインメソッドのcmdArrayからの要素

"/lib/A.jar" to "A.jar"

ラッパー jar が存在するフォルダー (例: B.jar) に A.jar のコピーを作成すると、完全に起動し、2 番目の jar が呼び出されます。私は何を間違っていますか?クラスパスを内部jarファイルに渡すにはどうすればよいですか? どんな助けでも大歓迎です。

4

1 に答える 1

0

これは厳密にはあなたの質問に対する答えではありませんが、元の問題を解決するためのより良いアプローチを提案できると思います (つまり、引数を jvm に追加します)。

この記事では、jvm、コマンド ライン、およびその他の起動オプションを保持したまま Java アプリを再起動する方法について説明します。

これがあなたにとって興味深い理由は何ですか?さて、それを少し調整すると、メイン jar の周りにラッパーを追加するのをやめて、メインで次のようなことを行うことができます。

  1. アプリが微調整された vm オプションで実行されていることを示すいくつかのコマンド ライン引数の存在を確認します。
  2. 存在する場合 - アプリに仕事をさせます
  3. in not - アプリケーションを再起動し、jvm オプションを微調整し、ステップ 1 で参照したコマンド ライン引数を渡します。

過去のプロジェクトの 1 つでこのようなことを行ったことがあり、ラップされた jar アプローチと比較して、ビルド/パッケージ化とデバッグが容易になりました。

これが役立つことを願っています。

于 2013-05-23T12:43:20.833 に答える