web-dev-qa-db-ja.com

maven-jar-pluginで--main-classと--module-versionを指定する方法は?

コマンドラインからJava 9でJARを構築する場合、パラメーター--main-classを渡して、MainClass属性をmodule-info.classに含めます。

jar --create --file <filename> --main-class=<mainclass> --module-version 0.1 -C classes .

しかし、MavenからJARを構築するとどうなりますか?これが私のmaven-jar-plugin構成です。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
</plugin>

カスタム引数をmaven-jar-pluginに渡すことはできますか(maven-compiler-plugincompilerArgsなど)?

12
ZhekaKozlov

これは、maven-jar-pluginバージョン3.1.2+で可能です(まだリリースされていませんが、 問題はクローズされています ):

<build>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.2</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>[main class here]</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>

説明によると

バージョン3.1.2以降、JARファイルにmodule-info.classが含まれている場合、このプラグインは追加の属性でモジュラー記述子(module-info.class)を更新します[...]。追加された最も注目すべき追加属性は、モジュールのメインクラスです。

基本的には、マニフェストファイルに追加された値を取得し、それをmodule-infoにも追加します。

2
Itchy

一時的な回避策は、packageフェーズでjar --updateを呼び出すことです。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        ...
    </configuration>
</plugin>
<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <phase>package</phase>
            <configuration>
                <target>
                    <exec executable="${Java.home}/bin/jar" failonerror="true">
                        <arg value="--main-class"/>
                        <arg value="[main class here]"/>
                        <arg value="--module-version"/>
                        <arg value="0.1"/>
                        <arg value="--update"/>
                        <arg value="--file"/>
                        <arg value="${project.build.directory}/${project.artifactId}-${project.version}.jar"/>
                    </exec>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

私はより良いアイデアを求めています。

8
ZhekaKozlov