1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Efw5の関連jarを実際に作成してみる

Last updated at Posted at 2025-08-27

背景

jarファイルはMavenで簡単に入手できます。しかし、環境構築する際にMavenが使えない、または使いたくない時があった場合や、セットで使用するjarファイルが増えてきた時、jarファイルを揃えるのにまとめたは手間がかかってしまいます。実際、Efw5では必要になってくるjarファイルが多く、揃えるのは少し大変です。そこで、Eclipseを使い、複数のjarファイルを機能ごとの1つのjarにまとめて入手できたら楽だと思い、Efw5の関連jarで機能ごとにまとめたallinone.jarを作成してみました。

プロジェクト作成

私はEclipse2025を利用してjarファイルを作成しました。
ここではgraaljsのallinone.jarを作成します。

ファイルから新規→Mavenプロジェクトを選択します。
image.png

次に「シンプルなプロジェクトの作成」にチェックをし、次に進みます。
image.png

成果物エリアのグループid、アーティファクトId、バージョンとパッケージングを登録します。今回は以下のように記述します。完了ボタンを押すとプロジェクトのひな型が作成されます。
image.png

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をクリックし実行します。
image.png

実行後、Eclipse起動時にワークスペースとして設定したディレクトリーを見に行きましょう。実行したプログラム名のフォルダーができているので、その中のtargetフォルダーを確認します。作成しようとしていたjarファイルが確認できます。これで作業は完了です。

image.png

補足

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という同じ名前のファイルがあります。そのファイルの中身を見てみましょう。

image.png
image.png

これらのorg.graalvm.polyglot.impl.AbstractPolyglotImplは、本来であれば同じファイルパスが複数存在するので、一つにまとめる際、最後に処理された1つだけが残り、他は上書きされて消えてしまいます。つまりallinone.jarのorg.graalvm.polyglot.impl.AbstractPolyglotImplはどちらか一行しか書かれていないことになります。しかし、ServicesResourceTransformerで実行し、作成したallinone.jarのMETA-INF/services/org.graalvm.polyglot.impl.AbstractPolyglotImplをみると...

image.png

どちらも記述されており、しっかりとマージされていることがわかります。


使用したpomファイルはこちらから入手できます。今回作成したのはgraaljsですが、ほかにもpomファイルがあるのでそれらを使ってjarを作成してみましょう。

こちらにはjarファイルがあります。ここからjarをダウンロードし、自分が作成したjarとサイズや、WinMargeなどをつかって中身を比べてみましょう。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?