Maven2:エンタープライズプロジェクトのベストプラクティス(EARファイル)


100

AntからMavenに切り替えるだけで、EARファイルベースのエンタープライズプロジェクトを設定するためのベストプラクティスを見つけようとしていますか?

EJBのjarファイル、Web層のWARファイル、およびカプセル化するEARファイルと、対応するデプロイメント記述子を使用して、かなり標準的なプロジェクトを作成するとします。

どうすればいいですか?archetypeArtifactId=maven-archetype-webappwarファイルと同じようにプロジェクトを作成し、そこから拡張しますか?これに最適なプロジェクト構造(およびPOMファイルの例)は何ですか?EARファイルに関連するデプロイメント記述子などをどこに貼り付けますか?

助けてくれてありがとう。

回答:


95

新しいプロジェクトを作成します。新しいプロジェクトは、EJBプロジェクトとWARプロジェクトの2つの依存関係を含むEARアセンブリプロジェクトです。

つまり、ここには3つのMavenプロジェクトがあります。1つのEJB。1つのWAR。2つの部分を一緒に引っ張って耳を作成する1つのEAR。

デプロイメント記述子は、mavenによって生成するか、EARプロジェクト構造のリソースディレクトリ内に配置できます。

maven-ear-pluginはそれを構成するために使用するものであり、ドキュメンテーションは優れていますが、mavenが一般にどのように機能するかをまだ理解しているかどうかは明確ではありません。

例として、次のようなことをするかもしれません:

<?xml version="1.0" encoding="utf-8"?>
<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 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany</groupId>
  <artifactId>myEar</artifactId>
  <packaging>ear</packaging>
  <name>My EAR</name>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <configuration>
          <version>1.4</version>
          <modules>
            <webModule>
              <groupId>com.mycompany</groupId>
              <artifactId>myWar</artifactId>
              <bundleFileName>myWarNameInTheEar.war</bundleFileName>
              <contextRoot>/myWarConext</contextRoot>
            </webModule>
            <ejbModule>
              <groupId>com.mycompany</groupId>
              <artifactId>myEjb</artifactId>
              <bundleFileName>myEjbNameInTheEar.jar</bundleFileName>
            </ejbModule>
          </modules>
          <displayName>My Ear Name displayed in the App Server</displayName>
          <!-- If I want maven to generate the application.xml, set this to true -->
          <generateApplicationXml>true</generateApplicationXml>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
    <finalName>myEarName</finalName>
  </build>

  <!-- Define the versions of your ear components here -->
  <dependencies>
    <dependency>
      <groupId>com.mycompany</groupId>
      <artifactId>myWar</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>war</type>
    </dependency>
    <dependency>
      <groupId>com.mycompany</groupId>
      <artifactId>myEjb</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>ejb</type>
    </dependency>
  </dependencies>
</project>

98
同じ質問があった1年後、自分の答えを見つけました。よくできました!
Mike Cornell

1
私にとって、これは次のように設定typeしたときに機能しましたejb <type>ejb</type>
gammay

そのpomはいくつかの警告をスローします:'build.plugins.plugin.version' for org.apache.maven.plugins:maven-ear-plugin is missingそして'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing、あなたはそれ以外の場合は素晴らしい答えを更新したいかもしれません
DiegoAlfonso

46

Maven archetype:generateゴールを実行し、定期的に更新されているように見えるアーキタイプの1つから選択することは、特に役立ちました(特に、JBossはよくメンテナンスされているようです)。

mvn archetype:generate

数百のアーキタイプが番号付きリストに表示され、そこから選択できます(現時点では519)。まだ実行中の目標により、数値を入力するか、検索文字列を入力して選択するように求められます。例:

513: remote -> org.xwiki.commons:xwiki-commons-component-archetype
514: remote -> org.xwiki.rendering:xwiki-rendering-archetype-macro
515: remote -> org.zkoss:zk-archetype-component
516: remote -> org.zkoss:zk-archetype-webapp
517: remote -> ru.circumflex:circumflex-archetype (-)
518: remote -> se.vgregion.javg.maven.archetypes:javg-minimal-archetype (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains):

検索文字列「ear」を入力すると、リストは8アイテムのみになりました(今日の時点)。

Choose archetype:
1: remote -> org.codehaus.mojo.archetypes:ear-j2ee14 (-)
2: remote -> org.codehaus.mojo.archetypes:ear-javaee6 (-)
3: remote -> org.codehaus.mojo.archetypes:ear-jee5 (-)
4: remote -> org.hibernate:hibernate-search-quickstart (-)
5: remote -> org.jboss.spec.archetypes:jboss-javaee6-ear-webapp 
6: remote -> org.jboss.spec.archetypes:jboss-javaee6-webapp-ear-archetype
7: remote -> org.jboss.spec.archetypes:jboss-javaee6-webapp-ear-archetype-blank
8: remote -> org.ow2.weblab.tools.maven:weblab-archetype-searcher

「org.jboss.spec.archetypes:jboss-javaee6-ear-webapp」を選択しました(この例では「5」を入力して)。

次に、目標によってgroupId、artifactId、パッケージ名などを入力するように求められ、次に、十分に文書化された次のサンプルアプリケーションが生成されました。

[pgarner@localhost Foo]$ tree
.
|-- Foo-ear
|   `-- pom.xml
|-- Foo-ejb
|   |-- pom.xml
|   `-- src
|       |-- main
|       |   |-- java
|       |   |   `-- com
|       |   |       `-- foo
|       |   |           |-- controller
|       |   |           |   `-- MemberRegistration.java
|       |   |           |-- data
|       |   |           |   `-- MemberListProducer.java
|       |   |           |-- model
|       |   |           |   `-- Member.java
|       |   |           `-- util
|       |   |               `-- Resources.java
|       |   `-- resources
|       |       |-- import.sql
|       |       `-- META-INF
|       |           |-- beans.xml
|       |           `-- persistence.xml
|       `-- test
|           |-- java
|           |   `-- com
|           |       `-- foo
|           |           `-- test
|           |               `-- MemberRegistrationTest.java
|           `-- resources
|-- Foo-web
|   |-- pom.xml
|   `-- src
|       `-- main
|           |-- java
|           |   `-- com
|           |       `-- foo
|           |           `-- rest
|           |               |-- JaxRsActivator.java
|           |               `-- MemberResourceRESTService.java
|           `-- webapp
|               |-- index.html
|               |-- index.xhtml
|               |-- resources
|               |   |-- css
|               |   |   `-- screen.css
|               |   `-- gfx
|               |       |-- banner.png
|               |       `-- logo.png
|               `-- WEB-INF
|                   |-- beans.xml
|                   |-- faces-config.xml
|                   `-- templates
|                       `-- default.xhtml
|-- pom.xml
`-- README.md

32 directories, 23 files

よくコメントされた4つのPOMファイルを読んだ後、必要な情報のほとんどすべてを手に入れました。

./pom.xml
./Foo-ear/pom.xml
./Foo-ejb/pom.xml
./Foo-web/pom.xml

3
これは機能しますが、結局はjboss固有の依存関係をたくさんプロジェクトに入れてしまいます。これは、事後にクリーンアップしたい場合とそうでない場合があります。
Ian McLaird、2012年

24

私はgithubリポジトリを作成して、私が良い(またはベストプラクティス)スタートアッププロジェクト構造だと思うものを示しています...

https://github.com/StefanHeimberg/stackoverflow-1134894

いくつかのキーワード:

  • メイベン3
  • BOM(独自の依存関係のDependencyManagement)
  • すべてのプロジェクトの親(外部依存関係からのDependencyManagementおよびグローバルプロジェクト構成のPluginManagement)
  • JUnit / Mockito / DBUnit
  • 依存関係がEAR / libフォルダーにあるため、WEB-INF / libなしでクリーンなWarプロジェクト。
  • Clean Earプロジェクト。
  • Java EE7の最小限のデプロイメント記述子
  • @LocalBeanで十分なので、ローカルEJBインターフェースはありません。
  • Mavenユーザープロパティによる最小限のMaven設定
  • サーブレット3.1 / EJB 3.2 / JPA 2.1の実際の配備記述子
  • macker-maven-pluginを使用してアーキテクチャルールを確認する
  • 統合テストは有効ですが、スキップされました。(skipITs = false)CIビルドサーバーで有効にするのに便利

Maven出力:

Reactor Summary:

MyProject - BOM .................................... SUCCESS [  0.494 s]
MyProject - Parent ................................. SUCCESS [  0.330 s]
MyProject - Common ................................. SUCCESS [  3.498 s]
MyProject - Persistence ............................ SUCCESS [  1.045 s]
MyProject - Business ............................... SUCCESS [  1.233 s]
MyProject - Web .................................... SUCCESS [  1.330 s]
MyProject - Application ............................ SUCCESS [  0.679 s]
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 8.817 s
Finished at: 2015-01-27T00:51:59+01:00
Final Memory: 24M/207M
------------------------------------------------------------------------

2
私はあなたのパッケージングとアーキテクチャのアプローチが本当に好きです。プロジェクトをMavenアーキタイプとしてパッケージ化することを考える必要があります。
ヨルク

2
とても良い解決策です!でも、質問が1つあります。BOMの要素を親プロジェクトにパックしないのはなぜですか。なぜ追加レイヤーなのか?
sschober 2015年

1
懸念の分離の原因。BOMは他のプロジェクトでインポートできます。必要なのは、依存関係のdependencyManagementだけで、使用している依存関係のdependencyManagementは必要ありません。OK。プロジェクトを誰も使用していない場合、この追加のレイヤーは必須ではないと言えますが、それも理にかなっていると思います...読みやすさ。親プロジェクトのdependencyManagementが依存関係と混合されていません... 50を超える内部Mavenプロジェクトを持つ大きなプロジェクトでは、親プロジェクト内のdependencyManagementが混乱する可能性があります
。– StefanHeimberg

2
別の理由は、これがmaven.apache.org/guides/introduction/…に記載されているのと同じ構造であることです。これは、「デフォルト」の文書化された方法であるため、チームメンバーが頻繁に変更するチームでの作業に役立ちます。
StefanHeimberg、2015年

2
ところで。:マルチプロジェクトのセットアップを行うことができる方法を示すために一度私はGitHubのプロジェクトを作成しているgithub.com/StefanHeimberg/maven3-multiapplication-setup(社内議論のために)
StefanHeimberg

7

NetBeans IDEは、Patrick Garnerによって提案されたものとほぼ同様の構造を自動的に定義します。NetBeansユーザーの場合

ファイル -> 新しいプロジェクト ->左側でMavenを選択し、右側で[ Maven Enterprise Application]を選択して[ 次へ]を押します-> war、ejb、設定の両方のプロジェクト名を要求します。

IDEが自動的に構造を作成します。


私はあなたに同意します、特にJEE6仕様に準拠する場合
Sym-Sym

3

これは、maven-ear-pluginパーツの良い例です

例として利用可能なMavenアーキタイプを確認することもできます。mvn archetype:generateを実行すると、使用可能なアーキタイプのリストが表示されます。それらの1つは

maven-archetype-j2ee-simple

10
maven-archetype-j2ee-simple構造が不必要に複雑に見える-特にモジュール内のモジュールと、ロギングのようなもののための別々のモジュールで。私はこの構造の背後にある理論的根拠を理解していませんでした
Vihung

3

私は、mavenベースの完全な耳にパッケージ化されたアプリケーションのエンドツーエンドの例を探して、最終的にこれに出くわしまし。手順では、CLIで実行するときにオプション2を選択するように指示されていますが、目的のためにオプション1を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.