1. 概要

パッケージタイプは、Mavenプロジェクトの重要な側面です。 プロジェクトが生成するアーティファクトのタイプを指定します。 通常、ビルドは jar war pom 、またはその他の実行可能ファイルを生成します。

Mavenは多くのデフォルトのパッケージタイプを提供し、カスタムパッケージを定義する柔軟性も提供します。

このチュートリアルでは、Mavenのパッケージタイプについて詳しく説明します。 まず、Mavenのビルドライフサイクルを見ていきます。 次に、各パッケージタイプ、それらが表すもの、およびプロジェクトのライフサイクルへの影響について説明します。 最後に、カスタムパッケージタイプを定義する方法を説明します。

2. デフォルトのパッケージタイプ

Maven は、 jar war ear pom を含む多くのデフォルトのパッケージタイプを提供しますrar ejb 、およびmaven-plugin。 各パッケージタイプは、フェーズで構成されるビルドライフサイクルに従います。 通常、すべてのフェーズは一連の目標であり、特定のタスクを実行します。

異なるパッケージタイプは、特定のフェーズで異なる目標を持つ場合があります。 たとえば、のパッケージフェーズでは包装タイプ、 maven-jar-plugin のjarゴールが実行されます。 逆に、 war プロジェクトの場合、maven-war-pluginの戦争目標は同じフェーズで実行されます。

2.1. jar

Javaアーカイブ(または jar )は、最も人気のあるパッケージタイプの1つです。 このパッケージタイプのプロジェクトは、.jar拡張子の付いた圧縮zipファイルを生成します。 これには、純粋なJavaクラス、インターフェース、リソース、およびメタデータファイルが含まれる場合があります。

まず、jarのデフォルトのgoal-to-build-phaseバインディングのいくつかを見てみましょう。

  • リソース:リソース
  • コンパイラ:コンパイル
  • リソース: testResources
  • コンパイラ: testCompile
  • シュアファイア:テスト
  • jar: jar
  • インストール:インストール
  • デプロイ:デプロイ

遅滞なく、jarプロジェクトのパッケージタイプを定義しましょう。

<packaging>jar</packaging>

何も指定されていない場合、Mavenはパッケージタイプがjarであると想定します。

2.2. 戦争

簡単に言うと、Webアプリケーションアーカイブ(または war )には、Webアプリケーションに関連するすべてのファイルが含まれています。 これには、Javaサーブレット、JSP、HTMLページ、デプロイメント記述子、および関連リソースが含まれる場合があります。 全体として、warにはjarと同じ目標バインディングがありますが、1つの例外があります。 war のパッケージフェーズには、という異なる目標があります。 ]戦争

間違いなく、jarwarは、Javaコミュニティで最も人気のあるパッケージタイプです。 これら2つのの詳細なの違いは興味深い読み物かもしれません。

Webアプリケーションのパッケージタイプを定義しましょう。

<packaging>war</packaging>

他のパッケージタイプejb par 、および rar も同様のライフサイクルを持っていますが、それぞれパッケージの目標が異なります。

ejb:ejb or par:par or rar:rar

2.3.

エンタープライズアプリケーションアーカイブ(または ear )は、J2EEアプリケーションを含む圧縮ファイルです。 これは、Webモジュール( war ファイルとしてパッケージ化)またはEJBモジュール( jar ファイルとしてパッケージ化)またはその両方の1つ以上のモジュールで構成されます。

言い換えると、earjarswarsのスーパーセットであり、アプリケーションを実行するにはアプリケーションサーバーが必要ですが、 war デプロイするのに必要なのはWebコンテナまたはWebサーバーのみです。 Webサーバーとアプリケーションサーバーを区別する側面、およびそれらの人気のあるサーバーがJava にあるものは、Java開発者にとって重要な概念です。

earのデフォルトのゴールバインディングを定義しましょう。

  • 耳: generate-application-xml
  • リソース:リソース
  • 耳:
  • インストール:インストール
  • デプロイ:デプロイ

このようなプロジェクトのパッケージタイプを定義する方法は次のとおりです。

<packaging>ear</packaging>

2.4. pom

すべてのパッケージタイプの中で、pomが最も単純なものです。 アグリゲーターと親プロジェクトを作成するのに役立ちます。

アグリゲーターまたはマルチモジュールプロジェクトは、さまざまなソースからのサブモジュールをアセンブルします。これらのサブモジュールは通常のMavenプロジェクトであり、独自のビルドライフサイクルに従います。 アグリゲーターPOMには、modules要素の下にあるサブモジュールのすべての参照があります。

親プロジェクトを使用すると、POM間の継承関係を定義できます。親POMは、特定の構成、プラグイン、依存関係、およびそれらのバージョンを共有します。 親のほとんどの要素はその子に継承されます—例外には、 ArtifactId name 、およびprerequisitesが含まれます。

処理するリソースがなく、コンパイルまたはテストするコードもないためです。 したがって、pomプロジェクトのアーティファクトは、実行可能ファイルではなく、それ自体を生成します。

マルチモジュールプロジェクトのパッケージタイプを定義しましょう。

<packaging>pom</packaging>

このようなプロジェクトのライフサイクルは、installdeployの2つのステップのみで構成される最も単純なものです。

2.5. maven-plugin

Mavenは、さまざまな便利なプラグインを提供します。 ただし、デフォルトのプラグインでは不十分な場合があります。 この場合、ツールは、プロジェクトのニーズに応じて、Maven-pluginを作成する柔軟性を提供します。

プラグインを作成するには、プロジェクトのパッケージタイプを設定します。

<packaging>maven-plugin</packaging>

maven-plugin のライフサイクルは、 jar のライフサイクルと似ていますが、2つの例外があります。

  • プラグイン:記述子はリソースの生成フェーズにバインドされています
  • プラグイン:addPluginArtifactMetadataがパッケージフェーズに追加されました

このタイプのプロジェクトでは、maven-plugin-api依存関係が必要です。

2.6. ejb

Enterprise Java Beans(または ejb )は、スケーラブルな分散サーバー側アプリケーションの作成に役立ちます。 EJBは、多くの場合、アプリケーションのビジネスロジックを提供します。 一般的なEJBアーキテクチャは、Enterprise Java Beans(EJB)、EJBコンテナ、およびアプリケーションサーバーの3つのコンポーネントで構成されています。

それでは、EJBプロジェクトのパッケージ化タイプを定義しましょう。

<packaging>ejb</packaging>

ejb パッケージタイプも、 jar パッケージと同様のライフサイクルを持ちますが、パッケージの目標が異なります。 このタイプのプロジェクトのパッケージ目標は、ejb:ejbです。

ejbパッケージタイプのプロジェクトでは、ライフサイクルの目標を実行するためにmaven-ejb-pluginが必要です。 MavenはEJB2および3のサポートを提供します。 バージョンが指定されていない場合は、デフォルトのバージョン2が使用されます。

2.7. rar

リソースアダプター(または rar )は、アプリケーションサーバーにリソースアダプターを展開するための有効な形式として機能するアーカイブファイルです。 基本的には、Javaアプリケーションをエンタープライズ情報システム(EIS)に接続するシステムレベルのドライバーです。

リソースアダプタのパッケージタイプの宣言は次のとおりです。

<packaging>rar</packaging>

すべてのリソースアダプタアーカイブは、ソースコードを含む jar ファイルと、デプロイメント記述子として機能するra.xmlの2つの部分で構成されています。

この場合も、ライフサイクルフェーズはjarまたはwarパッケージと同じですが、1つの例外があります。パッケージフェーズはアーカイブをパッケージ化するためのmaven-rar-pluginで構成されるrarゴール

3. その他のパッケージタイプ

これまで、Mavenがデフォルトで提供するさまざまなパッケージタイプについて見てきました。 ここで、プロジェクトで.zip拡張子の付いたアーティファクトを作成したいとします。 この場合、デフォルトのパッケージタイプは役に立ちません。

Mavenは、プラグインを介してさらにいくつかのパッケージタイプを提供します。 これらのプラグインの助けを借りて、カスタムパッケージタイプとそのビルドライフサイクルを定義できます。 これらのタイプのいくつかは次のとおりです。

  • msi
  • rpm
  • タール
  • tar.bz2
  • tar.gz
  • tbz
  • ジップ

カスタムタイプを定義するには、そのタイプを定義する必要があります包装タイプフェーズそのライフサイクルで 。 このために、 components.xml 下のファイル src / main / resources / META-INF / plexus ディレクトリ:

<component>
   <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
   <role-hint>zip</role-hint>
   <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
   <configuration>
      <phases>
         <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
         <package>com.baeldung.maven.plugins:maven-zip-plugin:zip</package>
         <install>org.apache.maven.plugins:maven-install-plugin:install</install>
         <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
      </phases>
   </configuration>
</component>

これまで、Mavenは新しいパッケージタイプとそのライフサイクルについて何も知りません。 表示するには、プロジェクトの pom ファイルにプラグインを追加し、extendstrueに設定します。

<plugins>
    <plugin>
        <groupId>com.baeldung.maven.plugins</groupId>
        <artifactId>maven-zip-plugin</artifactId>
        <extensions>true</extensions>
    </plugin>
</plugins>

これで、プロジェクトをスキャンできるようになり、システムはpluginsおよびcomponents.xmlファイルも調べます。

これらすべてのタイプの他に、Mavenは外部プロジェクトとプラグインを通じて他の多くのパッケージタイプを提供します。 たとえば、 nar (ネイティブアーカイブ)、 swf 、および swc は、AdobeFlashおよびFlexコンテンツを作成するプロジェクトのパッケージタイプです。 このようなプロジェクトでは、カスタムパッケージを定義するプラグインと、プラグインを含むリポジトリが必要です。

4. 結論

この記事では、Mavenで利用可能なさまざまなパッケージタイプについて説明しました。 また、これらのタイプが何を表しているのか、ライフサイクルでどのように異なるのかについても理解しました。 最後に、カスタムパッケージタイプを定義し、デフォルトのビルドライフサイクルをカスタマイズする方法も学びました。

Baeldungのすべてのコード例は、Mavenを使用して構築されています。 0nGitHubを超えるさまざまなMaven構成を必ず確認してください。