2010-11-09 9 views
25

mam ant skrypt, który kompiluje:Ant: przechodzącą compilerarg do javac

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

muszę zwiększyć pamięć sterty kompilatora, więc mam umieścić następujące argumenty do compileargs:

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

Ale pojawia się błąd w konsoli:

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

Dlaczego tak się dzieje? Jak zwiększyć pamięć używaną przez javac?

+0

jest to kopia/error pasta, że ​​komunikat o błędzie powiedzieć inna wartość niż jednym warunkiem (32m/128m)? –

+1

Może musisz przekazać każdy argument w oddzielnym elemencie ? – ZeissS

+0

@ZeissS: oddzielny element '' powoduje ten sam błąd, niestety, –

Odpowiedz

47

Domyślnie <javac> działa w procesie z Ant. Jest ogólnym ograniczeniem Javy, że nie można dostosować procesu JVM "Xms i Xmx po uruchomieniu procesu JVM. Tak, komunikat o błędzie, który widzisz jest oprogramowanie odrzuceniu próbę naruszenia tej zasady (przy użyciu niepomocny, nieprzyjazny komunikat o błędzie).

Jeśli jednak określić atrybut fork="true" w znaczniku <javac> ty będzie być w stanie określić nowe Xms i Xms. Jest tak, ponieważ fork instruuje Ant, aby uruchomił nowy podproces JVM, w którym ma działać javac. Ponieważ proces JVM jest nowy, daje Ant możliwą do zaakceptowania możliwość określenia dla niego Xms i.


Można spróbować coś takiego:.

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

(Zawiadomienie Używam compilerarg line="" zamiast compilerarg value="" Atrybut line pozwala określić wiele argumentów oddzielonych spacjami Atrybut value jest przy mijaniu. pojedynczy argument.)


Mrówka będzie czekać na rozwidlone <javac> do zakończenia, co dzieje się po zakończeniu procesu javac (tj. kompilowanie). Ant następnie kontynuuje uruchamianie skryptu kompilacji wewnątrz własnego oryginalnego procesu JVM. Ant sprawdzi, czy rozwidlone javac nie udało się lub odniosło sukces, i podejmuje zwykłe działania w oparciu o te informacje.


Wydajność

To zazwyczaj bardziej wydajnych do nie widelcem javac i zamiast po prostu dostroić odpowiednie ustawienia pamięci dla początkowej JVM Ant ogólnej. Często jest to (ale nie zawsze) najlepszy wybór, ponieważ uruchamianie oddzielnej maszyny JVM jest zwykle wolniejsze i zajmuje więcej pamięci niż po prostu pozwolenie na uruchomienie procesu javac.

Jeśli używasz Ant-warunkiem ant.bat lub ant.sh uruchomić mrówki, łatwą drogę do dostroić ant Xms i Xmx jest zdefiniowanie zmiennej środowiskowej ANT_OPTS zawierać argumenty chcesz. Istnieje wiele sposobów, aby ustawić zmienne środowiskowe, ale można po prostu edytować ant.bat:

set ANT_OPTS=-Xms128m -Xmx512m 
6

Czy wypróbowałeś <jvmarg value="-Xmx512m" /> w zadaniu Java? Dla domyślnych można użyć zmiennej środowiskowej ANT_OPTS. Znalazłem ten example, niezbyt przydatny, ale ma plik build.xml.

Aby zwiększyć przestrzeń stosu Javaca, znalazłem to podczas googlowania.

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

Został skopiowany z tego link. Ustawienie fork na true jest ważne.

+0

Niestety, ale 'jvmarg' nie jest poprawny w zadaniu' javac': 'javac nie obsługuje zagnieżdżonego elementu" jvmarg ". ' –

2

Nie sądzę, że ten problem jest naprawdę związany z mrówką. Ta sama wiadomość byłaby wyświetlana, jeśli użytkownik wypróbowałby bezpośrednio numer javac -Xms128m -Xmx512m.

Należy użyć opcji -J do przekazywania flag bezpośrednio do systemu wykonawczego. na przykład

-J-Xms128m -J-Xmx512m zamiast tylko -Xms128m -Xmx512m w swoim compilerarg.

javac -X służy do przekazywania niestandardowych opcji do kompilatora. Jeśli uruchomisz komendę javac -X, wyświetli się lista opcji prawnych, które zawierają: -Xlint, z której korzystałeś. Opcje pamięci są ustawieniami dla podstawowej maszyny JVM, stąd potrzeba użycia -J.

alternatywna

Istnieje memoryInitialSize (odpowiednik -Xms) i memoryMaximumSiz e (równoważne -Xmx) Warianty zadania javac tak osądzenia zamiast stosowania compilerargs np

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

Przedrostek' -J-'daje takie same wyniki:' [javac] javac: invalid flag: -J-Xms32m' –

+0

Proszę wypróbować alternatywne rozwiązanie, które dodałem do powyższej odpowiedzi. – mikej

+0

+1 - Alternatywny sposób zadziałał, ale nadal chciałbym dowiedzieć się, dlaczego nie "-Xms32m" ani "-J-Xms32m" nie działało –