YUI Compressorをフォークした

FessではJavaScriptやCSSの最小化にYUI Compressorを利用しています。しかし、オリジナルのYUI Compressorは長らくメンテナンスされておらず、ES6(ECMAScript 2015)以降の構文に対応していませんでした。そこで、YUI Compressorをフォークして、ES6対応版を作成しました。

背景

YUI Compressorは、Yahoo!が開発したJavaScript/CSS圧縮ツールです。長年にわたり広く使われてきましたが、オリジナルのリポジトリはメンテナンスが停止しており、ES6で導入されたアロー関数やテンプレートリテラルなどの新しい構文に対応していませんでした。

コミュニティによるフォーク版(hazendaz版など)も存在しますが、ES6対応が十分ではなかったため、CodeLibsとして独自にフォークして対応することにしました。

codelibs/yuicompressor

codelibs/yuicompressorとして、ES6対応版のYUI Compressorを公開しました。主な変更点は以下の通りです。

  • ES6構文(アロー関数、テンプレートリテラル、const/letなど)のサポート
  • JavaScriptパーサーの更新

codelibs/yuicompressor-maven-plugin

YUI CompressorをMavenビルドで利用するためのプラグインとして、codelibs/yuicompressor-maven-pluginを作成しました。これにより、Mavenプロジェクトで簡単にES6対応の圧縮を行うことができます。

pom.xmlでの設定例:

<plugin>
    <groupId>org.codelibs.maven</groupId>
    <artifactId>yuicompressor-maven-plugin</artifactId>
    <version>2.0.0</version>
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
                <goal>compress</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Fessでの適用

Fess 15.4では、yuicompressor-maven-pluginのgroupIdをcom.github.hazendaz.mavenからorg.codelibs.mavenに変更し、バージョン2.0.0を使用するようにしました。

これにより、FessのJavaScript最小化処理がES6構文に対応し、モダンなJavaScriptコードも正しく圧縮できるようになりました。

maven-javadoc-plugin 3.6以降のエラー

いつものようにmvn release:performを実行したら、以下のようなエラーに遭遇した。

[INFO] [ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:3.7.0:jar (attach-javadocs) on project fess-crawler-es: Execution attach-javadocs of goal org.apache.maven.plugins:maven-javadoc-plugin:3.7.0:jar failed: Unable to derive module descriptor for .../.m2/repository/org/opensearch/opensearch/2.19.1/opensearch-2.19.1.jar: Provider class org.apache.lucene.search.suggest.document.Completion50PostingsFormat not in JAR file opensearch-2.19.1.jar -> [Help 1]

なんだろうと思ったけど、最近、pom.xmlのmaven-javadoc-pluginを3.7.0に上げたのだが、原因っぽい。このプラグインが JPMS(Java モジュールシステム)用のモジュール記述子を自動生成しようして、エラーになる。たぶん、opensearch-2.19.1.jarに問題があるのかもしれない。

回避する方法としては、pom.xmlで

    <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.7.0</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<legacyMode>true</legacyMode>
</configuration>
</plugin>

とするか、mvn release:performで

mvn release:perform -Darguments="-Dmaven.javadoc.skip=true"

とするかになる。

jacoco.execが生成されない

pom.xmlにjacocoを追加したものの、実行してみると

[INFO] Skipping JaCoCo execution due to missing execution data file.

みたいな感じのメッセージが表示され、jacocoが実行されない。target/jacoco.execが生成されていないためなのだが、これが起きる原因としては、surefireの設定が関係している場合がある。たとえば、pom.xmlのsurefire設定で

<argLine>${test.command.args}</argLine>

という感じで設定していると、jacocoの引数が渡されなくなるようなので、

<argLine>@{argLine} ${test.command.args}</argLine>

という感じに変更すると解決する。