40417
1つのWildfly上に、複数のwarファイルをデプロイしています。  
例えば、こんな構成だとします。

```

    hoge.war
     - Hoge.jar
     - X-api.jar
     - X-impl.jar
    
    fuga.war
     - Fuga.jar
     - X-api.jar
    
```

X-impl.jarは、X-api.jarの中にあるinterfaceの実装クラスが入っています。  
Hoge.jarとFuga.jarの中のクラスは、X-apiの中にあるinterfaceを@Injectで使っています。

ここで、fuga.warはX-apiを含んでいますが、その実装を持っていません。  
実装があるのはhoge.warの中です。  
もちろんfuga.warの中にX-impl.jarを入れれば動くのですが、同じモジュールを重複していれることになるので、それは避けたいと思っています。  
（バージョン管理の面で、片方を更新し忘れたりとか・・・）

どうにかして、X-impl.jarを1つだけにしたいのですが、可能でしょうか？  
方向性としては、以下の2つのアプローチかなと思ってはいますが、いずれもやり方が分かりません。

  1. fuga.warからhoge.warの中にあるX-impl.jarを参照する
  2. X-impl.jarを双方のwarから取り出して独立させ、双方のwarから参照する
CC BY-SA 3.0
2017-12-07T05:37:08.347
40105
2017-12-21T02:49:37.130
8078
question
java java-ee jboss
複数のwarファイル間でクラスを共有したい
2のX-impl.jarを双方のwarから取り出して独立させるパターンで

standalone/lib/ext の下に置くか  
Global Modulesを設定するのではいかがでしょうか？

<https://developer.jboss.org/thread/262078>
CC BY-SA 3.0
2017-12-13T07:46:24.053
40243
2017-12-13T07:46:24.053
4377
40105
answer
>   1. fuga.warからhoge.warの中にあるX-impl.jarを参照する
>

は不可能なので

>   2. X-impl.jarを双方のwarから取り出して独立させ、双方のwarから参照する
>

を選択することになります。  
ただしこの際`X-impl.jar`だけを独立させると、`WAR`と`X-impl.jar`の依存関係が循環してしまう(`WAR`ではインジェクション対象として`X-impl.jar`が必要であるし、他方、`X-impl.jar`は実装対象としているインタフェース`X-api.jar`が必要である)ので`X-api.jar`も分離させます。

手順を大まかに並べると次のようになります:

  1. `X-api.jar`, `X-impl.jar`をWildFlyにモジュールとして登録する。
  2. `WAR`から当モジュールを参照できるように設定する。

この点に関わる公式ドキュメントとしては

  * [Class Loading in WildFly - WildFly 10 - Project Documentation Editor](https://docs.jboss.org/author/display/WFLY10/Class+Loading+in+WildFly)
  * [JBoss AS 7 / EAP 6 modules and class loading](https://www.slideshare.net/nekop/jboss-as-7-eap-6-modules-and-class-loading) (Red Hat社の方が作成された日本語スライド)

が挙げられます。また、1.のモジュール登録の具体的な手順については以下に解説があります。

  * [How to install a module on WildFly / JBoss AS 7](http://www.mastertheboss.com/jboss-server/jboss-as-7/how-to-install-a-module-on-jboss-as-7)

以下、[質問文に沿った形でデモコードを作成しました](https://github.com/yukihane/so40105)(※名称等、質問文と異なる部分はあります)ので、それを元に説明します。  
実行環境はWildFly11/Java8です。

* * *

# モジュールを登録する

`hoge.war`及び`fuga.war`双方から参照する`JAR`である`hello-api-0.0.1.jar`, `hello-api-
impl-0.0.1.jar`2ファイルを
`$JBOSS_HOME/modules/system/layers/base/com/github/yukihane/wildfly-sharing-
jar/main` にコピーします。

続いて同ディレクトリに
[`module.xml`](https://github.com/yukihane/so40105/blob/master/res/modules/system/layers/base/com/github/yukihane/wildfly-
sharing-jar/main/module.xml) を作成します。

# 登録したモジュールを参照できるようにする

大きく2種類の方法があります。WildFlyにグローバルな設定を行ってしまう方法と、各`WAR`で個別に設定する方法です。要件に応じてどちらか一方を選択します。

## グローバル設定

上記で登録したモジュールをグローバルモジュールとして設定します。  
`standalone/configuration/standalone.xml`(※`standalone.sh`で実行する場合)を開き、  
`<subsystem xmlns="urn:jboss:domain:ee:4.0">`を見つけ、そこへ次の行を追記します。

```

    <global-modules>
      <module name="com.github.yukihane.wildfly-sharing-jar" slot="main" />            
    </global-modules> 
    
```

([変更差分:res/standalone.xml.diff](https://github.com/yukihane/so40105/blob/93d32b26d3bed7d0b743a56e32d1673bb81c8f53/res/standalone.xml.diff#L24-L26))

## `WAR`個別設定

`WAR`内で設定する場合、設定方法は2種類あります。 `jboss-deployment-
structure.xml`ファイルに記述する方法と、`MANIFEST.MF`ファイルに記述する方法です。いずれか一方を選択します。

### `jboss-deployment-structure.xml`方式

`hoge-war`, `fuga-war`双方の `WEB-INF` ディレクトリに [`jboss-deployment-structure.xml`
を(無ければ)作成し、当モジュールの依存関係を記述します](https://github.com/yukihane/so40105/commit/e3286256f78724c2a298e80c08ffa8d023c021eb)。

```

    <jboss-deployment-structure>
      <deployment>
        <dependencies>
          <module name="com.github.yukihane.wildfly-sharing-jar" />
        </dependencies>
      </deployment>
    </jboss-deployment-structure>
    
```

### `MANIFEST.MF`方式

`WAR`の`META-INF/MANIFEST.MF`ファイルに`Dependencies`セクションを追加しモジュール名を記載します。

```

    Dependencies: com.github.yukihane.wildfly-sharing-jar
    
```

(※サンプルコードでは[Mavenのプラグインで実行している](https://github.com/yukihane/so40105/commit/e5affcea741d0bfd0dae9b5f6afe5d50c9cb1c5a)ので、確認する場合は成果物として生成された`hoge.war`等を解凍して見てみてください。)

* * *
CC BY-SA 3.0
2017-12-20T06:54:51.060
40417
2017-12-21T02:49:37.130
2017-12-21T02:49:37.130
2808
2808
40105
answer