uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

mavenでプラットフォーム依存のassemblyを生成する

Mavenのassemblyプラグインで、成果物を作成する際に、OSごとに異なる配布物を生成したいというのままある事です。例えば、MacOS用のhoge-macosx-bin.zipと、windows用のhoge-win32-bin.zipを別に生成したいとしましょう。
その場合、pom.xmlの方で以下のようにfinalNameを指定します。

      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <finalName>${project.artifactId}-${version}-${os.name}-${os.arch}</finalName>  
          <descriptors>
            <descriptor>src/main/assembly/bin.xml</descriptor>
            <descriptor>src/main/assembly/src.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>

OS名は、javaシステムプロパティのos.nameから取ってきますので、Mac OS Xの場合「Mac OS」のように空白が入ってしまいますが、まあ良しとしましょう。os.archはアーキテクチャ名で、例えば上からは以下の2ファイルが生成されます。

ただ、この場合、アセンブリディスクリプタsrc.xmlで作成している-src.zipにもOS名等が入ってしまいました。これで困る場合、たとえば-bin.zipにはOS名を含め、-src.zipにはOS名を含めたくない場合はどうするかというと、binの方のアセンブリディスクリプタファイル(src/main/assembly/bin.xml)の方だけに

<assembly>
  <id>${os.name}-${os.arch}-bin</id>

とこうすれば良いわけです。