ningún manifiesto hay generate for create atributo java maven-2 jar executable-jar

java - manifiesto - Cómo especificar el argumento de JVM para JAR ejecutable construido Maven



no hay ningún atributo de manifiesto principal en spring boot (4)

En primer lugar, déjame decirte que cualquier cosa así de complicada probablemente sea difícil por alguna razón.

Este enfoque puede funcionar para usted si realmente lo necesita. Tal como está escrito, asume que "java" está en el camino de la persona que llama.

Visión de conjunto:

  1. Declare una clase Bootstrapper como la clase principal en el manifiesto del jar.

  2. El programa de arranque genera otro proceso en el que llamamos java (pasando cualquier argumento de línea de comandos que desee) en la clase principal "real".

  3. Redirigir el niño procesa System.out y System.err a las respectivas transmisiones de bootstrapper

  4. Espere a que el proceso hijo termine

Aquí hay un buen artículo de fondo .

src / main / java / scratch / Bootstrap.java - esta clase se define en pom.xml como el mainclass de 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 - este es el punto de entrada normal para su programa

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

Llamada: java -jar scratch-1.0-SNAPSHOT-jar-with-dependencies.jar Devuelve:

Hello World! maxMemory:520290304 Exit:0

Al usar Maven para construir un JAR ejecutable, ¿cómo especifico los argumentos de JVM que se usan cuando se ejecuta el JAR?

Puedo especificar la clase principal usando <mainClass> . Sospecho que hay un atributo similar para los argumentos de JVM. Especialmente necesito especificar la memoria máxima (ejemplo -Xmx500m).

Aquí está mi plugin de ensamblaje:

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

Editar / Seguimiento: parece que podría no ser posible especificar argumentos JVM para un JAR ejecutable de acuerdo con esta y esta publicación.


No conozco ningún mecanismo semejante. La configuración de JVM se especifica mediante el comando java que realiza la llamada.

Aquí está la especificación del archivo jar que claramente no menciona ningún atributo que no sea Main-Class para la ejecución independiente:

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


Antigua pregunta, pero apareció en mi búsqueda de Google para este problema exacto, así que estoy respondiendo.

Tratar

<configuation> ... <argLine> -Xmx500m </argLine> ... </configuation>


En respuesta a la respuesta de David Carlson, puede hacerlo menos frágil utilizando la propiedad del sistema java.home para ubicar el ejecutable de Java en lugar de confiar en la ruta del usuario para encontrarlo. Además, probablemente también deberías redirigir la entrada estándar al proceso secundario.