LoginSignup
1
0

More than 3 years have passed since last update.

Mavenでマルチモジュール構成にする(Jersey RESTful)

Last updated at Posted at 2020-03-16

前回までのプロジェクトを、マルチモジュール構成にしていきます。

結論

先に結論から。
前回の記事では、以下のような形を想像していました。

jersey_sample
  |- pom.xml
  |- src/main/java/package/xxx/sampleapp
  |- serverapi
  |    |- pom.xml
  |    |- src/main/java/package/yyy/server
  |- repository
       |- pom.xml
       |- src/main/java/package/zzz/repository

まず、マルチモジュールのparentがソースコードを持つことはMavenでは出来ないみたいで、全部を子モジュールにしなければなりませんでした。

で、こう出来ないかと考えたのですが、

jersey_sample
  |- pom.xml
  |- sampleapp
  |    |- pom.xml
  |    |- src/main/webapp (※javaコードを持たない)
  |- serverapi
  |    |- pom.xml
  |    |- src/main/java/package/yyy/server (※webappフォルダを持たない)
  |- repository
       |- pom.xml
       |- src/main/java/package/zzz/repository

WebAppだけのモジュールを作って、serverapiモジュールを参照してAPI呼び出し出来ないかと考えたのですが、どうにもうまくいきませんでした。
Eclipseなら、クラスパスを追加する方法があるみたいなのですが、IntelliJでは方法がわからず。。。それに、IDE上で出来たとしても、配布するときにどうなるんだ?

ということで、結局こういう形になりました。

jersey_sample
  |- pom.xml
  |- serverapi
  |    |- pom.xml
  |    |- src/main/
  |            |- java/package/yyy/server
  |            |- webapp
  |- repository
       |- pom.xml
       |- src/main/java/package/zzz/repository

諦めてAPI層がwebappも持つ形にしました。まあ、これで実は必要十分だったことが分かったので、よしとします(汗)

しかし、この界隈はバージョンアップが早くて、普通にググっても古い情報ばかりで、なかなか欲しい情報にたどり着けませんね。検索スキルを磨かないと(汗)

マルチモジュール構成にする

1. 親pom.xmlの作成

まず、今プロジェクトルートにあるpom.xmlをそのまま親として使います。
依存関係は本来、モジュールごとに必要なものを入れるべきかと思いますが(repository層がservletとか要らないはずなので)、今は動かなくなると怖いので(笑)、いったんこのままにしておきます。

<package>を、pomに変更するだけです。

pom.xml
    <groupId>com.example</groupId>
    <artifactId>simple-webapp</artifactId>
    <packaging>pom</packaging>
    <version>1.1-SNAPSHOT</version>
    <name>simple-webapp</name>

バージョンも変えておきました。

2. サブモジュールの作成

まずは、空のサブモジュールを作ります。

  • IntelliJのプロジェクトルートを右クリックして、[New]-[Module]
    new_module.png

  • Mavenを選び、[Next]をクリック
    new_mave_module.png

  • serverapi(任意名称)と入力して[OK]をクリック
    serverapi_module.png

  • モジュールが追加される
    module_added.png

上記手順を繰り返し、repositoryモジュールを追加します。
終わると、このような構成になっているはずです。(サブフォルダは閉じてあります)
module_all_add.png

3. repositoryモジュールの作成

今は空っぽのrepositoryモジュールに、以下のクラスソースファイルを移動していきます。

  • Employees
  • EmployeeRepository
  • 各例外クラス
    • 例外ハンドラーは除く

(1) pom.xmlの編集

<packaging>jarにします。

pom.xml
    <artifactId>repository</artifactId>
    <packaging>jar</packaging>

(2) DnDでEmployeeクラスをリポジトリモジュールに移動する

  • ファイルをリポジトリモジュールのsrc/main/javaフォルダにDrag&Dropする
  • 移動先を聞かれるので、[To package]を選び、任意のパッケージ名をフルパスで記述する

    • ここでは、元々のcom.exampleから、com.example.jerseysimple.repository.modelsにパッケージを変更しています
      refactor_move.png
  • パッケージを新たに作るか聞かれるので、[Yes]をクリック

    recactor_make_dir.png

  • コンフリクト警告が出るが、いったんそのまま[Continue]する

    • パッケージ関連は後でまとめて直します。
      refacgtor_conflict.png

他のクラスについても、それぞれ、下記のパッケージに移動していきます。

  • EmployeeRepositpry => com.example.jerseysimple.repository
  • 例外クラス => com.example.jerseysimple.repository.exceptions

(2)モジュールへ移動後

全て移動が完了すると、このような形になります。
また、このモジュールの一部のクラスにもテストを作っておきました。後で、親レベルでmvn testとしたときに、サブモジュールのテストが全部走ることの確認をしたいので。
EmployeeRepositoryはあまり本質的なものじゃないので書きませんが、例外系クラスが簡単なgetMessageのテストが出来るのでそれらを用意しました。
moved_repository_module.png

この時点で、EmployeeRepository.javaを開くと、コンパイルエラーが警告されています。
これを直していきましょう。

(3)モジュールのビルドを通す

  • 例外系クラスのimport文を全部消す
    delete_imports.png

  • 赤字のEmployeeにカーソルを合わせて少し待つと、importを促すポップアップが出るので、表示されている通りのショートカットキーを押す。(Macならoption+エンター)
    import_employee.png

  • その他の例外クラスについても、同様の操作を繰り返す

  • メニューの[Build]から、[Build Module repository]を選ぶ
    build_repository_module.png

これで、テストも通過するはずです。
なお、ビルドとテストの確認は、ターミナルなどでrepositoryモジュールに移動して、mvn installとしても良いですね。

4. serverapiモジュールの作成

(1)serverapi/pom.xmlの編集

-<packaging>warにする
-reipositoryモジュールへの依存関係を追加

serverapi/pom.xml
    <artifactId>serverapi</artifactId>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>repository</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

(2)ソースファイルを移動

repositoryモジュールの時と同じ手順で、下記クラスを移動し、参照を修正します。

  • EmployeeResource
    • com.example.jerseysimple.apiパッケージに
  • MyResource (これはもう削除しても良いがw)
    • com.example.jerseysimple.apiパッケージに
  • 例外ハンドラクラス
    • com.example.jerseysimple.api.handlersパッケージに
  • テストクラス
    • com.example.jerseysimple.apiパッケージに

(3)webappディレクトリを移動

serverapiモジュールのsrc/main下に移動します。

(4)モジュールへ移動後

全て移動が完了すると、このような形になります。
refactor_api_module.png

モジュールをビルドし、テストを実行してください。
※mvnコマンドの方は現時点で依存関係が解決できず動かないみたいです。IntelliJから行ってください。たぶん、親モジュールのpomがまだ一度も作られてないからでしょうね。

5. ルートのクリーンアップ

(1)フォルダの削除

ルートにある諸々のフォルダを削除します。

  • src
  • resources

(2)クリーン

プロジェクトのルートで、mvn cleanを実行します。

6. 実行

(1)デプロイ対象の変更

Tomcatから起動しますが、[Edit Configuration]の変更が必要です。

  • [Deployment]タブを表示し、下部の[+]をクリック
    add_war.png

  • [Articat...]を選ぶ
    select_artifact.png

  • serverapi:war explodedを選択して、[OK]をクリック
    add_new_war.png

  • simple-webapp:war explodedをクリックして、下部の[-]をクリック
    remove_old_war.png

  • [OK]をクリック

(2)実行

実行ボタンをクリックします。
ブラウザから各APIにアクセスしてみてください。curlコマンドやPostmanから実行するときは、warが変わったことでURLが変わっていますから気をつけてください。

それから、mvnコマンドでも、ルートからビルド、テストが全部実行されることを確認しましょう。

下記コマンドで、レポートを出すと、モジュールごとのレポートをまとめてくれるので、確認しやすいです。
こちらの記事にあるプラグインを入れてあることが前提です。

$ mvn clean \
    test -Dmaven.test.failure.ignore=true \
    site -DgenerateReports=false \
    -Daggregate=true \
    surefire-report:report

プロジェクトルートのtarget/site下にhtmlで出力されています。

感想

APIを作るのも楽しくなってきました。でもやっぱりGradle使いたいし、Kotlinが書きたいです(しつこい)

次は、SpringFramework(not Boot)+Jerseyという構成に挑戦してみます。
SpringFrameworkだけでもRESTfulAPIは作れるので、わざわざJerseyと連携させるのも?というところもあるのですが、やってみたいのでやります(笑)

ここまでのソースは、以下にアップしてあります。

参考

1
0
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
0