背景
jarファイルはMavenで簡単に入手できます。しかし、環境構築する際にMavenが使えない、または使いたくない時があった場合や、セットで使用するjarファイルが増えてきた時、jarファイルを揃えるのにまとめたは手間がかかってしまいます。実際、Efw5では必要になってくるjarファイルが多く、揃えるのは少し大変です。そこで、Eclipseを使い、複数のjarファイルを機能ごとの1つのjarにまとめて入手できたら楽だと思い、Efw5の関連jarで機能ごとにまとめたallinone.jarを作成してみました。
プロジェクト作成
私はEclipse2025を利用してjarファイルを作成しました。
ここではgraaljsのallinone.jarを作成します。
次に「シンプルなプロジェクトの作成」にチェックをし、次に進みます。
成果物エリアのグループid、アーティファクトId、バージョンとパッケージングを登録します。今回は以下のように記述します。完了ボタンを押すとプロジェクトのひな型が作成されます。
POMファイル設定
graaljsの直下にpom.xmlが自動で作成されていると思います。そのファイルを書き換えて設定しなおします。POMファイルにはプロジェクトの基本情報、依存関係、ビルド設定などがあります。
基本情報の設定
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.efwgrp</groupId>
<artifactId>graaljs</artifactId>
<version>24.2.2_allinone</version>
1、2行目はpomのルートノードです。pomのバージョンやスキーマを指定するところですがほとんど定型文です。
groupIdはプロジェクトの所属先、artifactIdはプロジェクトの名前、versionは開発バージョンです。artifactIdは自由につけることができます。この三つはこれから作成するjarファイルの情報です。Mavenプロジェクト作成の際、成果物エリアに入力したものと同じです。
依存関係の設定
<dependencies>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<version>24.2.2</version>
</dependency>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>js</artifactId>
<version>24.2.2</version>
<type>pom</type>
</dependency>
</dependencies>
これは依存関係を設定しています。どのようなものをallinoneにするのかを記述します。言ってしまえば材料選びです。
Buildの設定
<build><plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins></build>
</project>
build設定は使用するプラグインとそのフェーズ、ゴールなどを設定します。
プラグイン
3~5行目で使用するプラグインを設定します。
フェーズ
フェーズはpackegeが設定されていますが、これはビルドライフサイクルのpackageまで実行することを表しています。packageはjarなどにパッケージングする段階です。
ビルドライフサイクルに関しては以下のサイトをご参照ください。
ゴール
ゴールはshadeが設定されています。これはMaven Shade Pluginのゴールで、これが実行されると、依存関係にあるjarファイルを1つのjarファイルにまとめる処理が行われます。
フェーズとゴールはexecutionのブロック内で指定されていますが、executionは「いつ・どのフェーズに・どのゴールを実行するか」を定義するためのブロックです。よって、今回はpackageフェーズでshadeゴールが実行されます。
transformer
transformerは複数のjarを一つにまとめるとき、jar内部のリソースファイルをどう処理するかを指定する仕組みです。
ここではServicesResourceTransformerが指定されています。これは組み合わせるファイルをマージします。複数のjarをまとめて1つのjarを作る際、それぞれのjarが持つMETA-INF/services/の中のファイルは 同じパス名で複数存在します。普通にjarを結合すると、後にロードしたjarの同名ファイルが残り、先のJARの同名ファイル内の情報が消えてしまいます。ServicesResourceTransformerは同名ファイルをマージするため、そういった事象を防いでくれます。
これら基本情報、依存関係、buildの設定のコードをすべて合体させ、pom.xmlをそれに書き換えてください。
実行
pomファイルを書き換えたプロジェクト名を右クリックし、実行のMaven installをクリックし実行します。
実行後、Eclipse起動時にワークスペースとして設定したディレクトリーを見に行きましょう。実行したプログラム名のフォルダーができているので、その中のtargetフォルダーを確認します。作成しようとしていたjarファイルが確認できます。これで作業は完了です。
補足
build設定でtransformerの説明をしたと思います。そこでServicesResourceTransformerが登場しました。これは組み合わせるファイルをマージするものと説明しましたが、本当にマージされているかを確かめてみます。
truffle-api-24.2.2.jarとtruffle-enterprise-24.2.2.jarのMETA-INF/servicesを確認します。これらのjarは今回作成したallinone.jarに含まれているものです。この二つのフォルダーにorg.graalvm.polyglot.impl.AbstractPolyglotImplという同じ名前のファイルがあります。そのファイルの中身を見てみましょう。
これらのorg.graalvm.polyglot.impl.AbstractPolyglotImplは、本来であれば同じファイルパスが複数存在するので、一つにまとめる際、最後に処理された1つだけが残り、他は上書きされて消えてしまいます。つまりallinone.jarのorg.graalvm.polyglot.impl.AbstractPolyglotImplはどちらか一行しか書かれていないことになります。しかし、ServicesResourceTransformerで実行し、作成したallinone.jarのMETA-INF/services/org.graalvm.polyglot.impl.AbstractPolyglotImplをみると...
どちらも記述されており、しっかりとマージされていることがわかります。
使用したpomファイルはこちらから入手できます。今回作成したのはgraaljsですが、ほかにもpomファイルがあるのでそれらを使ってjarを作成してみましょう。
こちらにはjarファイルがあります。ここからjarをダウンロードし、自分が作成したjarとサイズや、WinMargeなどをつかって中身を比べてみましょう。