2008-10-11 2 views
7

При использовании Maven для создания исполняемого JAR, как указать аргументы JVM, которые используются при выполнении JAR?Как указать аргумент JVM для исполняемого файла Maven JAR

Я могу указать основной класс, используя <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> 

Редактировать/Последующий: Кажется, что это не может быть возможно указать аргументы виртуальной машины Java для исполняемого файла JAR в соответствии с this и this поста.

ответ

4

Я не знаю такого механизма. Конфигурация JVM задается командой java.

Вот спецификация файла банку, который явно не упоминает какой-либо атрибут, кроме Main-Class для автономного исполнения:

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

2

Во-первых, позвольте мне сказать, что все это сложно, наверное, трудно по причине.

Этот подход может работать для вас, если он вам действительно нужен. Как написано, предполагается, что «java» находится на пути вызывающего абонента.

Обзор:

  1. Объявите класс Bootstrapper в качестве основного класса в манифесте флягу в.

  2. Загрузочный загрузчик запускает другой процесс, в котором мы вызываем java (передавая любые аргументы командной строки, которые вы хотите) в «реальном» основном классе.

  3. Перенаправление ребенка обрабатывает System.out и System.err для соответствующих потоков в загрузчике в

  4. Дождитесь завершения процесса завершения дочернего

Вот good background article.

SRC/Основной/Java/царапин/Bootstrap.java - этот класс определен в pom.xml, как 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/главная/Java/царапанию/App .java - это нормальная точка входа для программы

package scratch; 

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

Calling: java -jar scratch-1.0-SNAPSHOT-jar-with-dependencies.jar возвратов:

Hello World! maxMemory:520290304 
Exit:0 
+3

Это действительно похоже на хрупкий взлом. Учитывая, что на многих машинах java (.exe) либо не находится в PATH, либо тот, что в PATH, не тот, который хочет использовать вызывающий, я не вижу, как это не вызовет больше проблем чем решать. – 2011-11-09 15:18:54

-1

Древний вопрос, но пришло в мой поиск Google для этой точной проблемы, поэтому я отвечаю на него.

Попробуйте

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

Если этот фрагмент кода XML предназначен для плагина Maven exec, чем FYI, он не решит проблему OT ... – DejanLekic 2012-04-11 12:26:52

0

В ответ на ответ Дэвида Карлсона, вы можете сделать его менее хрупким, используя свойство системы java.home, чтобы найти Java исполняемый файл, вместо того, чтобы полагаться на пути пользователя, чтобы найти его. Кроме того, вам, вероятно, следует перенаправить стандартный ввод в дочерний процесс.

Смежные вопросы