Maven2 と Maven3 における振る舞いの違い

最近、使っていた Maven のバージョンを 2系(2.2.1)から 3系(3.0.4)に上げました。

で、mvn assembly:assembly が動かなくなるんよね〜。

動かなくなったのは以下の挙動。

  • で使用していた ${basedir} が認識されない
  • maven-jar-plugin で定義した METAINF 情報が生成されない


まず 1 つ目。
これは結論から言うと根本解決してくれない。
mvn eclipse:eclipse だとちゃんと解決してくれるのに、なぜか mvn assembly:assembly だと解決してくれない。
色々調べてみたのですがどうしても分からず、仕方なくこちらのサイトを参考にローカルリポジトリに直接配置しました。


次に 2 つ目。
これは、元々 Maven2系でやってたとき、maven-jar-plugin と maven-assembly-plugin は以下のように定義していた。

<pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.evernote.batch.BatchExecutor</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <descriptors>
                <descriptor>src/assembly/distribution.xml</descriptor>
            </descriptors>
        </configuration>
    </plugin>
</plugins>

で、この定義に対して mvn assembly:assembly を実行して出来上がった automatic-evernote-distribution.zip を(拡張子を jar に変えて)使用していた。
以前であれば、この出来上がった jar ファイルを以下のコマンドで実行できていた。

java -jar automatic-evernote-distribution.jar

しかし、Maven を 3系に上げたとたん、ファイルこそ出来上がるが、同じコマンドで実行すると、
Main クラスが無いとか起こられて、正しく実行できない。

で、色々調べて pom.xml を以下のように修正した。

<pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3</version>
        </plugin>
    </plugins>
</pluginManagement>

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>com.evernote.batch.BatchExecutor</mainClass>
                </manifest>
            </archive>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <descriptors>
                <descriptor>src/assembly/distribution.xml</descriptor>
            </descriptors>
        </configuration>
    </plugin>
</plugins>

しかし、それでも automatic-evernote-distribution.zip の中身を解凍して見てみると、中の METAINF.MF の中には Main-Class の定義がない。
実は上記の定義で mvn assembly:assembly を実行したときにもう一つ成果物が出来ている。それが automatic-evernote-jar-with-dependencies.jar
こちらを以前のコマンドと同じように以下のコマンドを使用すると、正しく実行できた。

java -jar automatic-evernote-distribution.jar

はっきり調べきれていないので、モヤモヤ感が拭い切れない。
Maven2 系のときでも、実は automatic-evernote-jar-with-dependencies.jar でも実行できていたかもしれない。
(そこまで調べてないです。ゴメンナサイ)

そもそも mvn assembly:assembly を実行するだけであれば、maven-jar-plugin の定義は不要?な気もする。