Frage

Wenn Maven eine ausführbare JAR zu bauen, wie kann ich die JVM-Argumente angeben, die verwendet werden, wenn die JAR ausgeführt wird?

Ich kann die Hauptklasse angeben <mainClass> verwenden. Ich vermute, es gibt ein ähnliches Attribut für JVM-Argumente. Speziell muss ich den maximalen Speicher (zB -Xmx500m) angeben.

Hier ist meine Montage Plugin:

  <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>

Bearbeiten / Follow-up: Es scheint, dass es nicht möglich sein könnte, JVM-Argumente für eine ausführbare JAR gemäß diese und diese Post.

War es hilfreich?

Lösung

Ich weiß nicht, von einem solchen Mechanismus. Die JVM-Konfiguration wird durch den anrufenden Java-Befehl angegeben.

Hier ist die JAR-Datei-Spezifikation, die auffällig erwähnt kein Attribut andere als Main-Klasse für Stand-alone-Ausführung:

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

Andere Tipps

Zunächst einmal möchte ich sagen, dass alles, was diese heikel ist wahrscheinlich schwer für einen Grund.

Dieser Ansatz, die für Sie arbeiten kann, wenn Sie es wirklich brauchen. Wie schon geschrieben, es geht davon aus „java“ auf dem Anrufer Weg ist.

Überblick:

  1. Deklarieren Sie eine Klasse Bootstrapper als Hauptklasse in Manifest Glas.

  2. Der Bootstrap laicht einen anderen Prozess, in dem wir java (vorbei in alle Befehlszeilenargumente Sie wollen) rufen die „echten“ Hauptklasse.

  3. Redirect das Kind verarbeitet System.out und System.err auf das Bootstrap-Programm der jeweiligen Strom

  4. für das Kind Prozess warten zu beenden

Hier ist ein gute Hintergrundartikel .

src / main / java / scratch / Bootstrap.java - diese Klasse definiert in pom.xml als das Glas des Mainclass: <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 - das ist der normale Eintrittspunkt für Ihr Programm

package scratch;

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

Berufung: java -jar scratch-1.0-SNAPSHOT-jar-with-dependencies.jar Rückkehr:

Hello World! maxMemory:520290304
Exit:0

Als Antwort auf David Carlson Antwort, können Sie es weniger spröde durch die java.home Systemeigenschaft mit der ausführbaren Java-Datei zu suchen, anstatt sich auf den Weg des Benutzers zu finden. Darüber hinaus sollten Sie wahrscheinlich die Standardeingabe in den untergeordneten Prozess und werden umgeleitet wird.

Ich denke, das getan werden kann, wenn man es auf diese Art und Weise denken. Generieren Sie eine .bat-Datei, die einen Befehl haben:

> java .. yourClass.. -D<jvmOption1> -D<jvmOption2>...

Sie können versuchen, auf dieser Suche app Assembler-Plugin für maven.

Ich versuchte es, und scheint zu funktionieren. Ich bin immer noch nicht klar, wie .bat-Datei zu machen, um mit dem etwas anderen Inhalt erzeugt werden, aber ich denke, es ist machbar.

Als weitere Option können Sie immer versuchen, die .bat-Datei in dem Ressourcenunterordner Ihres Projektes zu erstellen und zu schließen, dass Unterordner mit Ihrer Distribution.

Antike Frage kam aber für genau dieses Problem auf meine Google-Suche, damit ich es bin zu beantworten.

Versuchen

<configuation>
...
<argLine> -Xmx500m </argLine>
...
</configuation>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top