web-dev-qa-db-ja.com

Ant:compilerargをjavacに渡す

コンパイルするantスクリプトがあります:

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

コンパイラのヒープメモリを増やす必要があるため、次の引数をcompileargsに追加しました。

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

しかし、コンソールでエラーが発生します:

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

なぜ起こるのですか? javacで使用されるメモリを増やすにはどうすればよいですか?

28
Denis Kniazhev

デフォルトでは、<javac>はAntでインプロセスで実行されます。 JVMプロセスが起動すると、JVMプロセスのXmsおよびXmxを調整できないことは、Javaの一般的な制限です。したがって、エラー表示されているメッセージは、この原則に違反する試みを拒否しているソフトウェアです(役に立たない、わかりにくいエラーメッセージを使用)。

ただし、fork="true"タグで属性<javac>を指定すると、新しいXmsおよびXms。これは、forkがAntに、javacを実行する新しいJVMサブプロセスを起動するように指示するためです。 JVMプロセスは新しいため、AntにXmsおよびXmxを指定する許容可能な機会を与えます。


次のようなものを試すことができます:

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

compilerarg line=""ではなくcompilerarg value=""を使用しています。line属性を使用すると、スペースで区切られた複数の引数を指定できます。value属性は、単一の引数を渡すためのものです。 )


Antは、分岐した<javac>が終了するのを待ちます。これは、javacプロセスが作業を完了した後(つまり、コンパイルした後)に発生します。その後、Antは独自の元のJVMプロセス内でビルドスクリプトの実行を続けます。 Antは、分岐したjavacが失敗したか成功したかを確認し、この情報に基づいて通常のアクションを実行します。


パフォーマンス

通常は、notfork javacよりパフォーマンスが高く、代わりに、初期Ant JVM全体の関連メモリ設定を単に調整します。これは多くの場合(常にではありません)、最良の選択です。別のJVMの起動は通常、インプロセスでのjavacの実行を許可するよりも遅く、多くのメモリを消費するためです。

Antが提供するant.batまたはant.shを使用してAntを起動している場合、AntのXmsおよびXmxを調整する簡単な方法は、環境変数ANT_OPTSを必要な引数が含まれています。環境変数を設定する方法は多数ありますが、ant.batを編集するだけで済みます。

set ANT_OPTS=-Xms128m -Xmx512m
53
Mike Clark

やってみました <jvmarg value="-Xmx512m" /> under Java task?デフォルトでは、ANT_OPTS環境変数を使用できます。この example を見つけましたが、あまり有用ではありませんが、build.xmlがあります。 。

Javacのヒープスペースを増やすために、グーグル検索中にこれを見つけました。

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

この link からコピーされます。 forkをtrueに設定することが重要です。

6
CoolBeans

この問題は本当にアリに関係するとは思わない。 javac -Xms128m -Xmx512mを直接試した場合、同じメッセージが表示されます。

ランタイムシステムに直接フラグを渡すには、-Jオプションを使用する必要があります。例えば.

compilerarg-J-Xms128m -J-Xmx512mだけでなく、-Xms128m -Xmx512m

javac -Xは、非標準オプションをコンパイラーに渡すためのものです。コマンドjavac -Xを実行すると、使用した-Xlintを含む有効なオプションのリストが表示されます。メモリオプションは基盤となるJVMの設定であるため、-Jを使用する必要があります。

代替

memoryInitialSizeタスクにはmemoryMaximumSiz-Xmsと同等)およびjavace(-Xmxと同等)オプションがありますので、compilerargsを使用する代わりにそれらを試してください。

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