プライマリ・コンテンツに移動
Oracle® Fusion Middleware継続的統合によるアプリケーションの開発
12c (12.2.1)
E69943-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

15 Mavenを使用した実際のアプリケーションのビルド

多くの実際のアプリケーションには、様々なランタイム環境にデプロイすることを目的としたモジュールが含まれています。たとえば、Coherenceキャッシュに格納されているデータを使用するWebアプリケーションがあります。この章では、そのようなWebアプリケーションのビルド方法について説明します。

この章の構成は、次のとおりです。

15.1 Mavenアプリケーション例の紹介

この章でビルドするアプリケーション例では、Webページ上にユーザーのリストが名前と年齢とともに表示されます。新規個人を追加することもできます。人々の詳細はCoherenceキャッシュに格納されます。このアプリケーションには、次の要素があります。

  • ポータブル・オブジェクトに組み込む必要があるPerson POJO、キャッシュにアクセスするためのユーティリティ・クラス、およびCoherenceキャッシュ定義が含まれるCoherence GARプロジェクト。

  • サーブレットとデプロイメント・ディスクリプタが含まれた、WARに組み込む必要があるJava EE Webアプリケーション。

  • GARおよびWARをEARにアセンブルし、そのEARをWebLogic Serverにデプロイするプロジェクト。

この例では、モジュール間に依存性がある複数モジュールのMavenプロジェクトをビルドする方法、アプリケーション全体が含まれたデプロイ可能EARファイルにアプリケーション・コンポーネントをアセンブルする方法を確認できます。

この章の目的は、Mavenを使用してアプリケーション全体をビルドする方法を示すことであり、WebアプリケーションまたはCoherenceアプリケーションの記述方法をデモンストレーションすることではないため、例自体の内容は、サーブレットおよびcoherenceコードの観点から見れば非常に基本的なものです。詳細は、第10章および第11章を参照してください。

15.2 複数モジュールのMavenプロジェクトについて

Mavenを使用すると、複数のモジュールを持つプロジェクトを作成できます。各モジュールは、別のMavenプロジェクトで有効です。最上位レベルには、モジュールに関する情報をMavenに示し、アプリケーション全体を1つのMavenコマンドでビルドできるPOMファイルがあります。

各モジュールは、最上位プロジェクトのルートのサブディレクトリに配置されます。この例では、最上位プロジェクトはmy-real-appと呼ばれ、3つのモジュールはmy-real-app-garmy-real-app-warおよびmy-real-app-earです。プロジェクトのMaven座標は、次のとおりです。

GroupId ArtifactId バージョン パッケージ化
org.mycompany my-real-app 1.0-SNAPSHOT pom
org.mycompany my-real-app-gar 1.0-SNAPSHOT gar
org.mycompany my-real-app-war 1.0-SNAPSHOT war
org.mycompany my-real-app-ear 1.0-SNAPSHOT ear

アプリケーションを構成しているファイルは、次のとおりです。

pom.xml

my-real-app-gar/pom.xml
my-real-app-gar/src/main/resources/META-INF/pof-config.xml
my-real-app-gar/src/main/resources/META-INF/coherence-application.xml
my-real-app-gar/src/main/resources/META-INF/cache-config.xml
my-real-app-gar/src/main/java/org/mycompany/CacheWrapper.java
my-real-app-gar/src/main/java/org/mycompany/Person.java

my-real-app-war/pom.xml
my-real-app-war/src/main/webapp/WEB-INF/web.xml
my-real-app-war/src/main/java/org/mycompany/servlets/MyServlet.java

my-real-app-ear/pom.xml
my-real-app-ear/src/main/application/META-INF/weblogic-application.xml

最上位レベルでは、POMファイルは3つのモジュールを指しています。

my-real-app-garディレクトリには、Coherence GARプロジェクトが含まれています。独自のPOM、Coherence構成ファイル、POJO/POFクラス定義(Person.java)、キャッシュへのアクセスに必要なユーティリティ・クラス(CacheWrapper.java)が含まれています。

my-real-app-warディレクトリには、Webアプリケーションが含まれています。独自のPOM、サーブレットおよびデプロイメント・ディスクリプタが含まれています。このプロジェクトは、my-real-app-garプロジェクトに依存します。

my-real-app-earディレクトリには、EARファイルのデプロイメント・ディスクリプタ、およびEARをビルドおよびデプロイするためのPOMファイルが含まれています。

15.3 Mavenプロジェクトのビルド

この項では、サンプル・プロジェクトをビルドする方法を説明します。内容は以下のとおりです。

15.3.1 プロジェクトのディレクトリの作成

次のコマンドを使用して、プロジェクトを保持するためのディレクトリを作成します。

mkdir my-real-app

この章の残りの部分では、このディレクトリに対する相対パスが示されます。

15.3.2 GARプロジェクトの作成

11.2項で説明しているように原型を使用するか、またはディレクトリおよびファイルを手動で作成して、GARプロジェクトを作成できます。

原型を使用するには、次のコマンドを実行します。

mvn archetype:generate
    -DarchetypeGroupId=com.oracle.coherence.archetype
    -DarchetypeArtifactId=gar-maven-archetype
    -DarchetypeVersion=12.2.1-0-0
    -DgroupId=org.mycompany
    -DartifactId=my-real-app-gar
    -Dversion=1.0-SNAPSHOT

プロジェクトを手動で作成するには、次のコマンドを使用して、必要なディレクトリを作成します。

mkdir -p my-real-app-gar/src/main/resources/META-INF
mkdir -p my-real-app-gar/src/main/java/org/mycompany

この章の内容は次のとおりです。

15.3.2.1 POMファイルの作成または変更

原型を使用する場合、POMファイルはすでに存在します。次の例に一致するようにファイルを変更します。プロジェクトを手動で作成する場合は、次の内容のPOMファイル(my-real-app-gar/pom.xml)を作成します。

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.mycompany</groupId>
  <artifactId>my-real-app-gar</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>gar</packaging>
  <parent>
    <groupId>org.mycompany</groupId>
    <artifactId>my-real-app</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <dependencies>
    <dependency>
      <groupId>com.oracle.coherence</groupId>
      <artifactId>gar-maven-plugin</artifactId>
      <version>12.2.1-0-0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>com.oracle.coherence</groupId>
          <artifactId>gar-maven-plugin</artifactId>
          <version>${coherence.version}</version>
          <extensions>true</extensions>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>com.oracle.coherence</groupId>
        <artifactId>gar-maven-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
            <generatePof>true</generatePof>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

POMファイルを調べて、各部分が何を表すかを理解します。このプロジェクトのMaven座標は、次のように設定されます。

  <groupId>org.mycompany</groupId>
  <artifactId>my-real-app-gar</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>gar</packaging>

Coherence Mavenプラグインを使用してこのプロジェクトをCoherence GARファイルにビルドするため、パッケージ化がgarであることに注意してください。

親プロジェクトの座標が設定されます。これらの座標は、最上位プロジェクトを指します。最上位プロジェクトのPOMを後の手順で作成する必要があります。

  <parent>
    <groupId>org.mycompany</groupId>
    <artifactId>my-real-app</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

dependenciesセクションは、このプロジェクトが持っている依存性を示しています。この場合、Coherenceライブラリ、つまりcom.oracle.coherence:coherence:12.2.1-0-0にのみ依存します。スコープprovidedは、このライブラリが単にコンパイル用であり、ランタイム環境ですでに提供されているため、ビルドするアーティファクト(GARファイル)でパッケージ化する必要がないことを意味します。

  <dependencies>
    <dependency>
      <groupId>com.oracle.coherence</groupId>
      <artifactId>gar-maven-plugin</artifactId>
      <version>12.2.1-0-0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

pluginManagementセクションは、このプラグインの拡張を有効にするようMavenに示します。MavenでGARファイルをターゲット・アーティファクト・タイプとして認識できるようにする必要があります。

  <pluginManagement>
      <plugins>
        <plugin>
          <groupId>com.oracle.coherence</groupId>
          <artifactId>gar-maven-plugin</artifactId>
          <version>${coherence.version}</version>
          <extensions>true</extensions>
        </plugin>
      </plugins>
    </pluginManagement>

plug-insセクションには、Coherence GARプラグインに渡す必要がある情報が含まれています。この場合、generatePoftrueに設定して、プラグインでPOF注釈付きPOJOが検索され、必要なアーティファクトが生成されるようにする必要があります。

  <plugins>
      <plugin>
        <groupId>com.oracle.coherence</groupId>
        <artifactId>gar-maven-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
            <generatePof>true</generatePof>
        </configuration>
      </plugin>
    </plugins>

15.3.2.2 Coherenceの構成ファイルの作成または変更

GARプロジェクトに必要なCoherence構成ファイルは3つあります。原型を使用する場合、ファイルはすでに存在しますが、次の例に一致するように変更する必要があります。プロジェクトを手動で作成する場合は、次に示す場所にこれらのファイルを作成します。

my-real-app-gar/src/main/resources/META-INF/pof-config.xml
my-real-app-gar/src/main/resources/META-INF/coherence-application.xml
my-real-app-gar/src/main/resources/META-INF/cache-config.xml

pof-config.xmlファイルの内容を次の例に示します。

<?xml version="1.0"?>
<pof-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://xmlns.oracle.com/coherence/coherence-pof-config"
            xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-pof  -config coherence-pof-config.xsd">
<user-type-list>
  <!-- by default just include coherence POF user types -->
  <include>coherence-pof-config.xml</include>   
</user-type-list>
</pof-config>

coherence-application.xmlファイルの内容を次の例に示します。

<?xml version="1.0" encoding="ISO-8859-1"?>
<coherence-application xmlns="http://xmlns.oracle.com/weblogic/coherence-application">
  <cache-configuration-ref>META-INF/cache-config.xml</cache-configuration-ref>
  <pof-configuration-ref>META-INF/pof-config.xml</pof-configuration-ref>
</coherence-application>

これらのファイルは、原型を使用して作成した場合、変更する必要がほとんどないか、またはまったくありません。

原型を使用した場合、cache-config.xmlファイルを更新する必要があります。

このファイルでは、Peopleという名前のキャッシュおよびreal-distributed-garという名前のキャッシュ・スキームを作成し、(ローカル・バッキング・スキームを使用し、自動的に開始される)RealDistributedCacheという名前のサービスを作成します。これらの用語に精通していない場合は、第11章を参照してください。

<?xml version="1.0"?>
<cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"
              xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config coherence-cache-config.xsd">
<caching-scheme-mapping>
    <cache-mapping>
      <cache-name>People</cache-name>
      <scheme-name>real-distributed-gar</scheme-name>
    </cache-mapping>
  </caching-scheme-mapping>
<caching-schemes>
    <distributed-scheme>
      <scheme-name>real-distributed-gar</scheme-name>
      <service-name>RealDistributedCache</service-name>
      <backing-map-scheme>
        <local-scheme/>
      </backing-map-scheme>
      <autostart>true</autostart>
    </distributed-scheme>
  </caching-schemes>
</cache-config>

15.3.2.3 ポータブル・オブジェクトの作成

キャッシュに情報を格納するPersonオブジェクトを作成します。新しいJavaクラスを次の場所に作成します。

my-real-app-gar/src/main/java/org/mycompany/Person.java

クラスの内容を次に示します。

package org.mycompany;
import com.tangosol.io.pof.annotation.Portable;
import com.tangosol.io.pof.annotation.PortableProperty;
@Portable
public class Person {
  @PortableProperty(0)
  public String name;
  @PortableProperty(1)
  public int age;
 
  public Person() {}
  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
 public String getName() { return this.name; }
  public int    getAge()  { return this.age;  }
}

POJOは、このクラスで何を実行するかをCoherenceに示します。この章では、Mavenを使用したアプリケーションのビルドに焦点を当てており、Coherenceアプリケーションの記述の詳細には触れていません。Coherenceの詳細は、第11章を参照してください。

15.3.2.4 キャッシュにアクセスするためのラッパー・クラスの作成

キャッシュのアクセスに使用できる小さなラッパー・クラスを作成します。別のJavaクラスを次の場所に作成します。

my-real-app-gar/src/main/java/org/mycompany/CacheWrapper.java

クラスの内容を次に示します。

package org.mycompany;
import org.mycompany.Person;
import com.tangosol.net.CacheFactory;
import java.util.Set;
public class CacheWrapper {
  private static CacheWrapper INSTANCE;
  public Set getPeople() {
    return CacheFactory.getCache("People").entrySet();
  }
  public void addPerson(int personid, String name, int age) {
    CacheFactory.getCache("People").put(personid, new Person(name, age));
  }
  public static final CacheWrapper getInstance() {
    if(INSTANCE == null) INSTANCE = new CacheWrapper();
    return INSTANCE;
  }
}

後で、このクラスをサーブレットで使用して、キャッシュからデータを取得したり、新しいデータをキャッシュに追加することができます。

15.3.3 WARプロジェクトの作成

第10章で説明しているように原型を使用するか、またはディレクトリおよびファイルを手動で作成して、WARプロジェクトを作成できます。

原型を使用するには、次のコマンドを実行します。

mvn archetype:generate
    -DarchetypeArtifactId=basic-webapp
    -DarchetypeVersion=12.2.1-0-0
    -DgroupId=org.mycompany
    -DartifactId=my-real-app-war
    -Dversion=1.0-SNAPSHOT

原型を使用する場合は、プロジェクトに含まれている不要なファイルをすべて削除する必要があります。

プロジェクトを手動で作成するには、次のコマンドを使用して、必要なディレクトリを作成します。

mkdir -p my-real-app-war/src/main/webapp/WEB-INF
mkdir -p my-real-app-war/src/main/java/org/mycompany/servlets

この章の内容は次のとおりです。

15.3.3.1 POMファイルの作成または変更

原型を使用する場合は、POMファイルがすでに存在します。次の例に一致するようにファイルを変更します。プロジェクトを手動で作成した場合は、次の内容のPOMファイル(my-real-app-war/pom.xml)を作成します。

<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.mycompany</groupId>
   <artifactId>my-real-app-war</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>war</packaging>
   <parent>
      <groupId>org.mycompany</groupId>
      <artifactId>my-real-app</artifactId>
      <version>1.0-SNAPSHOT</version>
   </parent>
   <name>my-real-app-war</name>
   <dependencies>
       <dependency>
           <groupId>org.mycompany</groupId>
           <artifactId>my-real-app-gar</artifactId>
           <version>1.0-SNAPSHOT</version>
           <scope>provided</scope>
       </dependency>
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
           <version>3.0.1</version>
           <scope>provided</scope>
       </dependency>
   </dependencies>
</project>

POMファイルに含まれている内容を確認します。最初に、このプロジェクトの座標を設定する必要があります。このプロジェクトのパッケージ化はwarであることに注意してください。

   <groupId>org.mycompany</groupId>
   <artifactId>my-real-app-war</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>war</packaging>

次に、GARプロジェクトの場合と同様に親を定義します。

   <parent>
      <groupId>org.mycompany</groupId>
      <artifactId>my-real-app</artifactId>
      <version>1.0-SNAPSHOT</version>
   </parent>

最後に、このプロジェクトの依存性をリストします。この場合、2つの依存性があります(POJOおよびそこで定義されたユーティリティ・クラスにアクセスするためのGARプロジェクト、およびサーブレットAPI)。これにより、Webアプリケーションの表示名が設定されます。

   <dependencies>
       <dependency>
           <groupId>org.mycompany</groupId>
           <artifactId>my-real-app-gar</artifactId>
           <version>1.0-SNAPSHOT</version>
           <scope>provided</scope>
       </dependency>
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
           <version>3.0.1</version>
           <scope>provided</scope>
       </dependency>
   </dependencies>

15.3.3.2 デプロイメント・ディスクリプタの作成

Webアプリケーションには、次の場所にある単純なJava EEデプロイメント・ディスクリプタがあります。

my-real-app-war/src/main/webapp/WEB-INF/web.xml

このファイルの内容を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

   <display-name>my-real-app-war</display-name>

</web-app>

これにより、Webアプリケーションのdisplay-nameが設定されます。

15.3.3.3 サーブレットの作成

サーブレットを作成するには、次のようにMyServlet.javaファイルを検索します。

my-real-app-war/src/main/java/org/mycompany/servlets/MyServlet.java

サーブレットでは、現在キャッシュ内に存在する個人のリストが表示され、新規個人をキャッシュに追加できます。この項の目的は、Mavenを使用してこれらのタイプのアプリケーションをビルドする方法を学習することであり、Java EE Webアプリケーションの記述方法を学習することではないため、単純なサーブレットを使用しています。

サーブレット・クラスの内容を次に示します。

package org.mycompany.servlets;
import org.mycompany.Person;
import org.mycompany.CacheWrapper;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;
@WebServlet(name = "MyServlet", urlPatterns = "MyServlet")
public class MyServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
    String id = request.getParameter("id");
    String name = request.getParameter("name");
    String age = request.getParameter("age");
    if (name == null || name.isEmpty()
        || age == null || age.isEmpty()
        || id == null || id.isEmpty()) {
      // no need to add a new entry
    } else {
      // we have a new entry - so add it
      CacheWrapper.getInstance().addPerson(Integer.parseInt(id), name, Integer.parseInt(age));
    }
    renderPage(request, response);
  }
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
    renderPage(request, response);
  }
  private void renderPage(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
    // get the data
    Set people = CacheWrapper.getInstance().getPeople();
    PrintWriter out = response.getWriter();
    out.write("<html><head><title>MyServlet</title></head><body>");
    out.write("<h2>Add a new person</h2>");
    out.write("<form name=\"myform\" method=\"POST\">");
    out.write("ID:<input type=\"text\" name=\"id\"/><br/>");
    out.write("Name:<input type=\"text\" name=\"name\"/><br/>");
    out.write("Age:<input type=\"text\" name=\"age\"/><br/>");
    out.write("<input type=\"submit\" name=\"submit\" value=\"add\"/>");
    out.write("</form>");
    out.write("<h2>People in the cache now</h2>");
    out.write("<table><tr><th>ID</th><th>Name</th><th>Age</th></tr>");
    // for each person in data
    if (people != null) {
      Iterator i = people.iterator();
      while (i.hasNext()) {
        Map.Entry entry = (Map.Entry)i.next();
        out.write("<tr><td>"
          + entry.getKey()
          + "</td><td>"
          + ((Person)entry.getValue()).getName()
          + "</td><td>"
          + ((Person)entry.getValue()).getAge()
          + "</td></tr>");
      }
    }
    out.write("</table></body></html>");
  }
}

ユーザーがフォームにデータを入力したかどうかをチェックします。その場合は、そのデータを使用して新規個人をキャッシュに追加します。このアプリケーションでは、最小限のエラー処理しか行われないことに注意してください。新規個人をキャッシュに追加するには、GARプロジェクトで作成したCacheWrapperクラスでaddPerson()メソッドを使用します。

キャッシュの内容を表に出力します。この例では、キャッシュに含まれているエントリが十分に少ないと想定し、CacheWrapperクラスのgetPeople()メソッドを使用してすべてを読み取ります。

15.3.4 EARプロジェクトの作成

EARプロジェクトは、EARへのWARおよびGARのアセンブルを管理します。次のコマンドを使用して、このプロジェクトを手動で作成します。

mkdir -p my-real-app-ear/src/main/application/META-INF

このプロジェクトには、次の2つのファイル(POMファイルとデプロイメント・ディスクリプタ)があります。

my-real-app-ear/pom.xml
my-real-app-ear/src/main/application/META-INF/weblogic-application.xml

この章の内容は次のとおりです。

15.3.4.1 アプリケーション例のPOMファイルについて

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.mycompany</groupId>
   <artifactId>my-real-app-ear</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>ear</packaging>
   <parent>
      <groupId>org.mycompany</groupId>
      <artifactId>my-real-app</artifactId>
      <version>1.0-SNAPSHOT</version>
   </parent>
   <name>ear assembly</name>
   <dependencies>
      <dependency>
        <groupId>org.mycompany</groupId>
        <artifactId>my-real-app-gar</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>gar</type>
        <scope>optional</scope>
      </dependency>
      <dependency>
         <groupId>org.mycompany</groupId>
         <artifactId>my-real-app-war</artifactId>
         <version>1.0-SNAPSHOT</version>
         <type>war</type>
      </dependency>
   </dependencies>
   <build>
      <plugins>
         <plugin>
            <artifactId>maven-ear-plugin</artifactId>
            <configuration>
               <archive>
                  <manifest>
                     <addClasspath>true</addClasspath>
                  </manifest>
               </archive>
               <artifactTypeMappings>
                  <artifactTypeMapping type="gar" mapping="jar"/>
               </artifactTypeMappings>
            </configuration>
         </plugin>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-dependency-plugin</artifactId>
             <executions>
                <execution>
                    <id>copy-gar-locally</id>
                    <phase>prepare-package</phase>
                    <goals>
                       <goal>copy</goal>
                    </goals>
                    <configuration>
                       <artifactItems>
                           <artifactItem>
                              <groupId>org.mycompany</groupId>
                              <artifactId>my-real-app-gar</artifactId>
                              <version>1.0-SNAPSHOT</version>
                              <type>gar</type>
                          </artifactItem>
                      </artifactItems>
                    </configuration>
                  </execution>
               </executions>
          </plugin>
        <plugin>
          <groupId>com.oracle.weblogic</groupId>
          <artifactId>weblogic-maven-plugin</artifactId>
          <version>12.2.1-0-0</version>
          <executions>
            <!--Deploy the application to the server-->
            <execution>
              <phase>pre-integration-test</phase>
              <goals>
                <goal>deploy</goal>
              </goals>
              <configuration>
                <adminurl>t3://127.0.0.1:7001</adminurl>
                <user>weblogic</user>
                <password>welcome1</password>
                <middlewareHome>/home/mark/space/maven/wls030213</middlewareHome>
                <!--The location of the file or directory to be deployed-->
                <source>${project.build.directory}/${project.build.finalName}.${project.packaging}</source>
                <!--The target servers where the application is deployed-->
                <targets>AdminServer</targets>
                <verbose>true</verbose>
                <name>${project.build.finalName}</name>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
   </build>
</project>

次のように、このプロジェクトのMaven座標を設定し、親を指すように設定します。

   <groupId>org.mycompany</groupId>
   <artifactId>my-real-app-ear</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>ear</packaging>
   <parent>
      <groupId>org.mycompany</groupId>
      <artifactId>my-real-app</artifactId>
      <version>1.0-SNAPSHOT</version>
   </parent>

次に、WARプロジェクトとGARプロジェクトには次のような依存性があります。

   <dependencies>
      <dependency>
        <groupId>org.mycompany</groupId>
        <artifactId>my-real-app-gar</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>gar</type>
        <scope>optional</scope>
      </dependency>
      <dependency>
         <groupId>org.mycompany</groupId>
         <artifactId>my-real-app-war</artifactId>
         <version>1.0-SNAPSHOT</version>
         <type>war</type>
      </dependency>
   </dependencies>

3つの個別のプラグイン構成があります。これらの1番目はmaven-ear-pluginです。次の例のようにartifactTypeMappingを追加して、garファイルをjarファイルのように処理するよう指定する必要があります。

       <plugin>
            <artifactId>maven-ear-plugin</artifactId>
            <configuration>
               <archive>
                  <manifest>
                     <addClasspath>true</addClasspath>
                  </manifest>
               </archive>
               <artifactTypeMappings>
                  <artifactTypeMapping type="gar" mapping="jar"/>
               </artifactTypeMappings>
            </configuration>
        </plugin>

GARファイルをmy-real-app-garプロジェクトの出力(target)ディレクトリからEARプロジェクトにコピーするようにmaven-dependency-pluginを構成します。

        <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-dependency-plugin</artifactId>
             <executions>
                <execution>
                    <id>copy-gar-locally</id>
                    <phase>prepare-package</phase>
                    <goals>
                       <goal>copy</goal>
                    </goals>
                    <configuration>
                       <artifactItems>
                           <artifactItem>
                              <groupId>org.mycompany</groupId>
                              <artifactId>my-real-app-gar</artifactId>
                              <version>1.0-SNAPSHOT</version>
                              <type>gar</type>
                          </artifactItem>
                      </artifactItems>
                    </configuration>
                  </execution>
               </executions>
           </plugin>

最後に、結果として生成されるEARファイルのデプロイ方法をweblogic-maven-pluginに指定します。この項では、環境に一致するようにadminurluserpasswordおよびtargetの各パラメータを更新する必要があります。これらのパラメータの詳細は、表10-1を参照してください。

        <plugin>
          <groupId>com.oracle.weblogic</groupId>
          <artifactId>weblogic-maven-plugin</artifactId>
          <version>12.2.1-0-0</version>
          <executions>
            <!--Deploy the application to the server-->
            <execution>
              <phase>pre-integration-test</phase>
              <goals>
                <goal>deploy</goal>
              </goals>
              <configuration>
                <adminurl>t3://127.0.0.1:7001</adminurl>
                <user>weblogic</user>
                <password>welcome1</password>
                <!--The location of the file or directory to be deployed-->
                <source>${project.build.directory}/${project.build.finalName}.${project.packaging}</source>
                <!--The target servers where the application is deployed-->
                <targets>AdminServer</targets>
                <verbose>true</verbose>
                <name>${project.build.finalName}</name>
              </configuration>
            </execution>
          </executions>
        </plugin>

POMプロジェクトが完了したら、デプロイメント・ディスクリプタを追加します。

15.3.4.2 アプリケーション例のデプロイメント・ディスクリプタについて

EARファイルのWebLogicデプロイメント・ディスクリプタは、次のファイルにあります。

my-real-app-ear/src/main/application/META-INF/weblogic-application.xml

内容を次に示します。

<weblogic-application>
       <module>
             <name>GAR</name>
             <type>GAR</type>
             <path>my-real-app-gar-1.0-SNAPSHOT.gar</path>
       </module>
</weblogic-application>

このデプロイメント・ディスクリプタでは、EARファイル内でGARファイルが配置されている場所、およびその呼び名に関する詳細が示されます。

15.3.5 最上位POMの作成

最上位POMを作成します。これは、アプリケーションのルート・ディレクトリ内のpom.xmlファイルにあり、その内容は次のとおりです。

<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.mycompany</groupId>
   <artifactId>my-real-app</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>my-real-app</name>
   <modules>
      <module>my-real-app-war</module>
      <module>my-real-app-gar</module>
      <module>my-real-app-ear</module>
   </modules>
   <properties>
       <coherence.version>12.2.1-0-0</coherence.version>
   </properties>
</project>

プロジェクトの座標を設定します。これらは3つの各プロジェクトで指定した親座標に一致します。パッケージ化がpomであることに注意してください。これにより、modulesセクションで指定しているように、このプロジェクトが一連のサブプロジェクトのアセンブリであることがMavenに示されます。

3つのサブプロジェクトそれぞれに1つのmoduleエントリがあります。

このPOMは他の3つの親であり、POMはそれらの親から継承されるため、一般的なプロパティをこのPOMに追加でき、それらのプロパティは3つのサブプロジェクトすべてで利用できるようになります。この場合、プロパティcoherence.versionを追加します。

15.3.6 Mavenを使用したアプリケーションのビルド

これで、次のコマンドを(最上位ディレクトリmy-real-appで)1つ以上使用して、Mavenによるアプリケーションのビルドを実行できるようになります。

mvn compile
mvn package
mvn verify

Mavenでは、指定したフェーズまでのすべてのフェーズが実行されます。これらのコマンドによる結果を次に示します。

コマンド 詳細
mvn compile Javaソースをターゲット・クラス・ファイルにコンパイルします。
mvn package
  1. Javaソースをターゲット・クラス・ファイルにコンパイルします。
  2. コンパイルされたファイルおよびリソース(デプロイメント・ディスクリプタ、構成ファイルなど)を含むアーカイブ(WAR、GARなど)を作成します。

mvn verify
  1. Javaソースをターゲット・クラス・ファイルにコンパイルします。
  2. コンパイルされたファイルおよびリソース(デプロイメント・ディスクリプタ、構成ファイルなど)を含むアーカイブ(WAR、GARなど)を作成します。

  3. EARファイルをWebLogic Server環境にデプロイします。