maven-antrun-pluginからclosure compilerを利用してみる


2011年 03月 07日

mavenとclosure-compilerの統合方法はclosure-compilerのイシュートラッカーのIssue 37: Maven integrationで紹介されています。
ただ、ここで紹介されている方法は、リポジトリにコミットされているclosure-compilerのjarを呼び出す方法です。
なるべくjarをコミットしてたくないので、mavenの依存関係としてダウンロードされたjarを利用する方法について調べてみました。

調査結果

次の設定でmavenの依存関係としてダウンロードされたclosure-compilerが利用できます。

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <executions>
      <execution>
        <phase>generate-sources</phase>
        <goals>
          <goal>run</goal>
        </goals>
        <configuration>
          <target>
            <property name="closure.compiler.class.name"
                      value="com.google.javascript.jscomp.CommandLineRunner" />
            <echo message="Generate fantastic.min.js" />
            <java classname="${closure.compiler.class.name}"
                  classpathref="maven.compile.classpath" fork="true" failonerror="true">
              <arg value="--js"/>
              <arg value="${basedir}/src/main/webapp/js/fantastic.js"/>
              <arg value="--js_output_file"/>
              <arg value="${basedir}/src/main/webapp/js/fantastic.min.js" />
              <arg value="--compilation_level"/>
              <arg value="SIMPLE_OPTIMIZATIONS"/>
            </java>
          </target>
        </configuration>
      </execution>
    </executions>
    <dependencies>
      <dependency>
        <groupId>com.google.javascript</groupId>
        <artifactId>closure-compiler</artifactId>
        <version>r706</version>
      </dependency>
    </dependencies>
  </plugin>

解説

依存関係の記述

pluginから利用するjarの定義はplugin直下のdependenciesで定義します。この定義によりmaven.compile.classpathにclosure-compilerが含まれます。

  <plugin>
    ....
    <dependencies>
      <dependency>
        <groupId>com.google.javascript</groupId>
        <artifactId>closure-compiler</artifactId>
        <version>r706</version>
      </dependency>
    </dependencies>
  </plugin>

呼び出し方法

呼び出し部分抜粋です。この例ではfantastic.jsからfantastic.min.jsを生成しています。

            <property name="closure.compiler.class.name"
                      value="com.google.javascript.jscomp.CommandLineRunner" />
            <echo message="Generate fantastic.min.js" />
            <java classname="${closure.compiler.class.name}"
                  classpathref="maven.compile.classpath" fork="true" failonerror="true">
              <arg value="--js"/>
              <arg value="${basedir}/src/main/webapp/js/fantastic.js"/>
              <arg value="--js_output_file"/>
              <arg value="${basedir}/src/main/webapp/js/fantastic.min.js" />
              <arg value="--compilation_level"/>
              <arg value="SIMPLE_OPTIMIZATIONS"/>
            </java>

mavenのリポジトリの登録されているclosure-compier.jarのMANIFEST.MFには次のMain-Classが存在しません。

Main-Class: com.google.javascript.jscomp.CommandLineRunner

そのため、mavenのクラスパスの中からcom.google.javascript.jscomp.CommandLineRunnerを探すように指定をしています。

            <property name="closure.compiler.class.name"
                      value="com.google.javascript.jscomp.CommandLineRunner" />
            <echo message="Generate fantastic.min.js" />
            <java classname="${closure.compiler.class.name}"
                  classpathref="maven.compile.classpath" fork="true" failonerror="true">