10

Maven を使用して実行可能な JAR をビルドする場合、JAR の実行時に使用される JVM 引数を指定するにはどうすればよいですか?

を使用してメイン クラスを指定できます<mainClass>。JVM引数にも同様の属性があると思います。特に、最大メモリを指定する必要があります (例 -Xmx500m)。

ここに私のアセンブリプラグインがあります:

  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.me.myApplication</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

編集/フォローアップ: thisおよびthis postによると、実行可能な JAR に JVM 引数を指定できない可能性があるようです。

4

5 に答える 5

5

私はそのようなメカニズムを知りません。JVM 構成は、java コマンドの呼び出しによって指定されます。

以下は、スタンドアロン実行用の Main-Class 以外の属性を明確に言及していない jar ファイルの仕様です。

http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html

于 2008-10-12T02:34:04.770 に答える
3

まず最初に、これほどトリッキーなことには、おそらく理由があって難しいことを言わせてください。

このアプローチは、本当に必要な場合に役立つ可能性があります。書かれているように、「java」が呼び出し元のパス上にあると想定しています。

概要:

  1. jar のマニフェストで Bootstrapper クラスをメイン クラスとして宣言します。

  2. ブートストラッパーは、「実際の」メイン クラスで java を呼び出す (必要なコマンド ライン引数を渡す) 別のプロセスを生成します。

  3. 子プロセス System.out および System.err をブートストラッパーのそれ​​ぞれのストリームにリダイレクトします。

  4. 子プロセスが終了するのを待ちます

これは良い背景記事です。

src/main/java/scratch/Bootstrap.java - このクラスは pom.xml で jar のメインクラスとして定義されています。<mainClass>scratch.Bootstrap</mainClass>

package scratch;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;

public class Bootstrap {
    class StreamProxy extends Thread {
        final InputStream is;
        final PrintStream os;

        StreamProxy(InputStream is, PrintStream os) {
            this.is = is;
            this.os = os;
        }

        public void run() {
            try {
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line = null;
                while ((line = br.readLine()) != null) {
                    os.println(line);
                }
            } catch (IOException ex) {
                throw new RuntimeException(ex.getMessage(), ex);
            }
        }
    }

    private void go(){
        try {
            /*
             * Spin up a separate java process calling a non-default Main class in your Jar.  
             */
            Process process = Runtime.getRuntime().exec("java -cp scratch-1.0-SNAPSHOT-jar-with-dependencies.jar -Xmx500m scratch.App");

            /*
             * Proxy the System.out and System.err from the spawned process back to the user's window.  This
             * is important or the spawned process could block.
             */
            StreamProxy errorStreamProxy = new StreamProxy(process.getErrorStream(), System.err);
            StreamProxy outStreamProxy = new StreamProxy(process.getInputStream(), System.out);

            errorStreamProxy.start();
            outStreamProxy.start();

            System.out.println("Exit:" + process.waitFor());
        } catch (Exception ex) {
            System.out.println("There was a problem execting the program.  Details:");
            ex.printStackTrace(System.err);

            if(null != process){
                try{
                    process.destroy();
                } catch (Exception e){
                    System.err.println("Error destroying process: "+e.getMessage());
                }
            }
        }
    }

    public static void main(String[] args) {
        new Bootstrap().go();
    }

}

src/main/java/scratch/App.java - これは、プログラムの通常のエントリ ポイントです。

package scratch;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World! maxMemory:"+Runtime.getRuntime().maxMemory() );
    }
}

呼び出し:java -jar scratch-1.0-SNAPSHOT-jar-with-dependencies.jar 戻り値:

Hello World! maxMemory:520290304
Exit:0
于 2008-10-12T18:20:58.977 に答える