2010-11-09 10 views
25

Ho script ant che compila:Ant: passando compilerarg in javac

  <javac srcdir="${test.src.dir}" destdir="${test.dist.dir}"> 
       ... 
       <compilerarg value="-Xlint:unchecked" /> 
      </javac> 

ho bisogno di aumentare la memoria heap del compilatore, così ho messo i seguenti argomenti in compileargs:

<compilerarg value="-Xlint:unchecked -Xms128m -Xmx512m" /> 

Ma ho un errore nella console:

[javac] javac: invalid flag: -Xms128m 
[javac] Usage: javac <options> <source files> 

Perché succede? Come posso aumentare la memoria utilizzata da javac?

+0

è che una copia/incolla errore di quel messaggio di errore dicono valore diverso da quello fornito (32m/128m)? –

+1

Forse hai bisogno di passare ogni argomento in un elemento separato ? – ZeissS

+0

@ZeissS: l'elemento separato '' causa purtroppo lo stesso errore –

risposta

47

Per impostazione predefinita, <javac> viene eseguito in-process con Ant. È una limitazione generale di Java che non è possibile regolare un processo JVM 'Xms e Xmx una volta avviato il processo JVM. Quindi, il messaggio di errore che state vedendo è il software di rifiutare il tuo tentativo di violare questo principio (usando un messaggio di errore inutile, scostante.)

Se, tuttavia, si specifica l'attributo fork="true" sul tag <javac> si sarà essere in grado di specificare un nuovo Xms e Xms. Questo perché fork ordina ad Ant di avviare un nuovo sottoprocesso JVM in cui eseguire javac. Poiché il processo JVM è nuovo, offre ad Ant un'opportunità accettabile di specificare Xms e Xmx per esso.


Si potrebbe provare qualcosa di simile:.

<project name="project" default="all" basedir="[yourvalue]"> 
    <target name="all"> 
     <javac srcdir="[yourvalue]" destdir="[yourvalue]" fork="true"> 
      <!-- javac requires that -Xmx and -Xms be prefixed with -J --> 
      <compilerarg line="-J-Xms128m -J-Xmx512m" /> 
     </javac> 
    </target> 
</project> 

(Si noti che sto usando compilerarg line="" piuttosto che compilerarg value="" L'attributo line consente di specificare più argomenti separati da spazi L'attributo value è per il passaggio a. argomento singolo.)


Ant aspetterà il biforcuto <javac> per uscire, cosa che accade dopo che il processo javac termina il suo lavoro (es. compilazione). Ant continua quindi a eseguire lo script di build all'interno del proprio processo JVM originale. Ant verificherà se il bifronte javac non è riuscito o è riuscito e intraprende le solite azioni in base a queste informazioni.


prestazioni

Di solito è più performante di non forchetta javac, e invece semplicemente regolare le impostazioni di memoria rilevanti per l'iniziale Ant JVM complessiva. Questa è spesso (ma non sempre) la scelta migliore perché l'avvio di una JVM separata è solitamente più lento e richiede più memoria rispetto alla semplice esecuzione di in-process con javac.

Se si utilizza il Ant-fornito ant.bat o ant.sh per lanciare Ant, un modo semplice per ottimizzare Ant di Xms e Xmx è quello di definire l'ambiente ANT_OPTS variabili per contenere gli argomenti che si desidera. Ci molti modi per impostare le variabili d'ambiente, ma si potrebbe semplicemente modificare ant.bat:

set ANT_OPTS=-Xms128m -Xmx512m 
6

Hai provato <jvmarg value="-Xmx512m" /> in attività Java? Per quelli di default è possibile utilizzare la variabile d'ambiente ANT_OPTS. Ho trovato questo example, non molto utile ma ha un build.xml.

Per aumentare lo spazio dell'heap di Javac, l'ho trovato mentre cercavo su Google.

<javac fork="true" 
     srcdir="${basedir}/src" 
     destdir="${basedir}/build/classes" 
     classpath="${project.classpath}" 
     memoryinitialsize="256m" 
     memorymaximumsize="256m"> 
</javac> 

È stato copiato da questo link. Impostare la forcella su true è importante.

+0

ma 'jvmarg' non è valido nel task' javac': 'javac non supporta l'elemento nidificato" jvmarg ". ' –

2

Non penso che questo problema sia realmente correlato alla formica. Vedresti lo stesso messaggio se hai provato direttamente javac -Xms128m -Xmx512m.

È necessario utilizzare l'opzione -J per passare i flag direttamente al sistema di runtime. per esempio.

-J-Xms128m -J-Xmx512m invece di -Xms128m -Xmx512m nel vostro compilerarg.

javac -X è per il passaggio di opzioni non standard al compilatore. Se esegui il comando javac -X, verrà visualizzato un elenco di opzioni legali che includono lo -Xlint che hai utilizzato. Le opzioni di memoria sono impostazioni per la JVM sottostante, da qui la necessità di utilizzare -J.

alternativa

Ci sono memoryInitialSize (equivalente a -Xms) e memoryMaximumSiz e (equivalente a -Xmx) opzioni per l'attività javac quindi cercate quelli invece di utilizzare compilerargs esempio

<javac srcdir="${test.src.dir}" destdir="${test.dist.dir}" 
    memoryInitialSize="128m" 
    memoryMaximumSize="512m"> 
+0

Il prefisso' -J-'restituisce gli stessi risultati:' [javac] javac: flag non valido: -J-Xms32m' –

+0

Provare la soluzione alternativa che ho aggiunto alla risposta sopra. – mikej

+0

+1 - Il modo alternativo ha funzionato, ma mi piacerebbe ancora capire perché non '-Xms32m' né' -J-Xms32m' non ha funzionato –