Apache Karaf へのインストール
Apache Karaf コンテナーに Red Hat Fuse をインストールする
概要
はじめに
Red Hat Fuse は軽量で柔軟性に富んだインテグレーションプラットフォームで、オンプレミスとクラウドにおいて、企業全体における迅速なインテグレーションを可能にします。
Apache Camel に基づく Fuse は、パターンベースのインテグレーション、豊富なコネクターカタログ、および広範なデータ変換機能を活用して、ユーザーがすべてを統合できるようにします。
多様性を受け入れるオープンソースの強化
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ をご覧ください。
第1章 Apache Karaf への開発用 Fuse のインストール
Karaf で実行される Fuse アプリケーションを開発するには、以下のトピックで説明するように Fuse をローカルでインストールします。
1.1. Apache Karaf に Fuse をインストールする準備
Apache Karaf に Fuse をインストールする準備をするには、システムをチェックして、ハードウェア要件を満たしていること、サポートされているプラットフォームであること、およびサポートされている Java ランタイムを備えていることを確認します。Web サービス、API、およびトランスポートプロトコルに関して、サポート対象の標準ソフトウェアを使用する計画であることも確認してください。
手順
Fuse をインストールするシステムで、以下を確認します。
- 250 MB の空きディスク領域がある
- 2 GB の RAM がある
このハードウェア要件は、Fuse on Apache Karaf の完全なインストール用です。さらに、Fuse を実行しているシステムでは、キャッシュ、永続メッセージストア、およびその他の機能用に領域が必要です。実際の要件は、Fuse アプリケーションの用途によって異なります。
- Fuse をインストールするシステムがサポート対象のプラットフォームを実行していることを確認します。Red Hat は、Red Hat Fuse でサポートされる構成 に記載のプラットフォームで、Fuse 製品をテストおよびサポートします。
- システムが Fuse on Apache Karaf でサポートされる Java ランタイムを実行していることを確認します。Red Hat Fuse でサポートされる構成 で、サポート対象の Java バージョンを確認してください。
-
Java ランタイムが空白を含むディレクトリーパスにインストールされていないことを確認してください。たとえば、
C:\Program Files\Java\jdk8
は受け入れ可能なパスではありません。パスに空白があると、実行時に Fuse on Apache Karaf で予期しないエラーが発生します。 - Red Hat Fuse でサポートされる構成 のリストを確認し、サポート対象の標準ソフトウェアを使用していることを確認します。
1.2. Apache Karaf への Fuse のインストール
Red Hat カスタマーポータルから Fuse 7.12 on Karaf の標準インストールパッケージをダウンロードできます。Apache Karaf コンテナーの標準アセンブリーをインストールし、完全な Fuse テクノロジースタックを提供します。
Fuse 機能およびバンドルのカスタムサブセットが含まれる Fuse 7.12 の独自のカスタムアセンブリーを作成できます。カスタム クイックスタートは、Maven を使用して Red Hat Fuse のカスタムアセンブリーを作成する方法を説明します。Fuse Software Downloads ページで利用可能なダウンロード可能なファイルから、すべてのクイックスタートをインストールできます。
前提条件
Fuse をインストールする予定のシステムが、「Apache Karaf に Fuse をインストールする準備」に記載されているハードウェアおよびソフトウェア要件を満たしている。
手順
ブラウザーで Fuse Software Downloads ページに移動します。
Red Hat カスタマーポータルにログインしていない場合は、ログインのプロンプトが表示され、ダウンロードページが表示されます (アカウントが Red Hat Fuse サブスクリプションに関連付けられている必要があります)。
- Fuse の Software Downloads ページの Red Hat Fuse 7.12 on Karaf Installer の右側にある Download をクリックし、ローカル zip ファイルを取得します。
zip ファイルのコンテンツを、すべてのパーミッションが設定されたディレクトリーに展開します。
パス名に空白文字や
#
、%
、^
、"
などの特殊文字が含まれるディレクトリーに、この Zip ファイルを 展開しない でください。たとえば、C:\Documents and Settings\Greco#Roman\Desktop\fuse
に展開しないでください。IBM JDK を使用している場合は、以下の追加の手順を実行します。
Fuse インストールディレクトリーの
/lib/endorsed
ディレクトリーで、saaj-api .jar
ファイルを削除します。以下に例を示します。rm lib/endorsed/org.apache.servicemix.specs.saaj-api-1.3-2.9.0.jar
JAVA_OPTS
環境変数を設定します。JAVA_OPTS=-Xshareclasses:none
Karaf コンテナーを起動する前に、
JAVA_OPTS
環境変数を設定する必要があります。
管理ユーザーを追加して、Fuse on Karaf コンテナーへのリモートアクセスを有効にし、Fuse Console にアクセスします。
デフォルトでは、コンテナーにはユーザーが定義されていません。この場合、フォアグラウンドでコンテナーを実行できますが、コンテナーにリモートでアクセスすることはできず、バックグラウンドで実行することはできません。以下の手順に従い、少なくとも
admin
ロールのあるユーザーを 1 人作成することが推奨されます。-
テキストエディターで、Fuse インストールディレクトリーにある
etc/users.properties
ファイルを開きます。 以下の行を探します。
#admin = admin,_g_:admingroup #_g_\:admingroup = group,admin,manager,viewer,systembundles,ssh
- 各行について、その行をコメント解除するために先頭の # 文字を削除します。
- 最初の行で、最初のインスタンスの admin を、user1 などの希望するユーザー名に変更します。
同じ行で、2 番目のインスタンスの admin を、そのユーザーのパスワードに変更します (例:passw0rd)。
以下に例を示します。
user1 = passw0rd,_g_:admingroup _g_\:admingroup = group,admin,manager,viewer,systembundles,ssh
- ファイルを保存してから閉じます。
-
テキストエディターで、Fuse インストールディレクトリーにある
-
Fuse を起動するには、Linux/Unix で
bin/fuse
、Windows ではbin\fuse.bat
を実行します。 -
任意で、Fuse Console にアクセスするには、Web ブラウザーで提供された URL を開き、
etc/users.properties
ファイルで設定したユーザー名およびパスワードを使用してログインします。Fuse Console の使用に関する詳細は、Managing Fuse を参照してください。
1.3. Fuse on Karaf のオフライン実行について
Apache Karaf コンテナーを、インターネット接続なしでオフラインモードで実行できます。ただし、コンテナーにカスタムアプリケーションをデプロイする場合、これらのアプリケーションと共にコンテナーをオフラインモードで実行するためには、ローカルの Maven リポジトリーに追加の依存関係をダウンロードしないといけない場合があります。
Apache Karaf コンテナーをオフラインモードで実行するには、以下の依存関係を区別する必要があります。
- ランタイム依存関係 は、Apache Karaf コンテナーをデフォルト設定で実行するために必要な依存関係です。
- ビルド時の依存関係 は、カスタムアプリケーションのビルドに必要な依存関係で、これにはサードパーティーのライブラリーが含まれます。
以下は、オフラインモードで実行できることと、(インターネット接続が利用できる) オンラインモードで何を実行する必要があるかの概要です。
-
Apache Karaf コンテナーをそのデフォルト設定で実行する ことはオフラインモードでサポートされています。Apache Karaf コンテナーのデフォルト設定は、
etc/org.apache.karaf.features.cfg
ファイルのfeaturesBoot
プロパティーによって指定されます。必要な依存関係は、インストールのsystem/
サブディレクトリーに提供されます。 -
追加機能のインストール は、一般的にオフラインモードでは サポートされません。原則では、
features:install
コマンドを使用して、標準機能のリポジトリーから任意の機能をインストールできますが (etc/org.apache.karaf.features.cfg
ファイルのfeaturesRepositories
プロパティーによって指定)、これらの機能の大部分はインターネットからダウンロードする必要があるため、オフラインモードではサポートされていません。 - カスタムアプリケーションのデプロイ は、一般的にオフラインモードでは サポートされません。最小限のビルド時依存関係のセットを持つアプリケーションをオフラインでデプロイできる場合があります。ただし、カスタムアプリケーションについては、通常、Apache Maven で JAR ファイルをダウンロードできるようにインターネット接続を必要とするサードパーティーの依存関係があります。
1.4. オプションでのスタンドアロン Apache ディストリビューションの使用
Red Hat Fuse は、ダウンロードする追加パッケージを提供します。これには、Apache Camel および Apache CXF の標準ディストリビューションが含まれます。ApacheCamel または ApacheCXF の標準のアップストリームディストリビューション (OSGi コンテナーなし) を使用する場合は、ダウンロードした extras
パッケージのアーカイブバージョンを使用します。
手順
- Red Hat カスタマーポータル にログインします。
- Red Hat カスタマーポータル → Downloads → Red Hat Fuse → Downloads ページに移動します。
-
Software Downloads
ページのVersion
ドロップダウンリストから7.12.0
を選択します。 Red Hat Fuse 7.12.0 Extras アーカイブをダウンロードします。
extras アーカイブファイルには、ネストされた以下のアーカイブファイルが含まれます。
-
apache-camel-2.23.2.fuse-790054-redhat-00001.zip
-
apache-cxf-3.3.6.fuse-790049-redhat-00001.zip
-
- これらのファイルを目的の場所にコピーし、プラットフォームに適したユーティリティーを使用して展開します。
アーカイブファイルを、パス名にスペースのあるディレクトリーに展開しないでください。たとえば、C:\Documents and Settings\Greco Roman\Desktop\fuse
に展開しないでください。
第2章 Fuse on Apache Karaf へのホットフィックスパッチの適用
2.1. 機能およびバンドルへのパッチ適用
パッチは、Fuse on Apache Karaf インストールにあるファイルの更新バージョンが含まれる ZIP アーカイブです。これには以下が含まれます。
- バンドル: 最も一般的で、最も単純なケースでは、ホットフィックスパッチに単一のバンドルが含まれる場合があります。
-
$FUSE_HOME/etc
および$FUSE_HOME/bin
ディレクトリーにそれぞれ存在する設定ファイルおよびスクリプト。 -
通常のバンドルではなく、
$FUSE_HOME/lib
ディレクトリーに存在するライブラリー。 -
機能定義の変更: 通常、Karaf 機能は
$FUSE_HOME/system
ディレクトリーで利用できる記述子に含まれますが、ホットフィックスパッチはこれらのファイルを変更しません。代わりに、ホットフィックスパッチが機能オーバーライドファイルを変更する可能性があります。このファイルは$FUSE_HOME/etc/org.apache.karaf.features.xml
です。これにより、特定の機能のバンドルをアップグレードしてホットフィックス方式で機能定義を変更したり、特定の機能が追加のバンドルを使用するようにしたりできます。
アップグレードとホットフィックスパッチの違い
- ホットフィックスパッチ: ホットフィックスパッチには、1 つまたは複数の重大なバグに対する修正が含まれます。これは、現在の Red Hat Fuse ディストリビューションに適用されることを想定しています。その主な目的は、既存のディストリビューションのバンドルとライブラリーの一部を更新することです。
- アップグレード: Fuse on Apache Karaf のアップグレードメカニズムを使用すると、更新されたバージョンの Fuse on Karaf を再インストールする必要なく、修正を Apache Karaf コンテナーに適用できます。アップグレードによりデプロイされたアプリケーションで問題が発生した場合に、アップグレードをロールバックすることもできます。Fuse on Apache Karaf のアップグレードプロセスでは、バンドル JAR、設定ファイル、および静的ファイルを含む任意のファイルが更新されます。
Fuse on Apache Karaf スタンドアロンでは、Karaf コンソールのパッチシェルからコマンドを使用してパッチを適用できます。このアプローチは破壊的ではなく、元に戻すことができます。以下の手順を使用して、Red Hat Fuse on Apache Karaf をアップグレードすることもできます。アップグレードの詳細は、Apache Karaf での Fuse のアップグレード を参照してください。
2.2. Red Hat Fuse on Apache Karaf へのホットフィックスパッチの適用
ホットフィックスメカニズムを使用して、利用可能な機能定義とバンドルを同時に更新できます。Fuse on Apache Karaf インストールにホットフィックスパッチを適用する手順は次のとおりです。
手順
- アップグレードする前に、Fuse on Apache Karaf インストールの完全バックアップを作成します。
端末を開き、Apache Karaf サーバーで Fuse を起動します。
[user@FUSE_HOME/bin ~] $ ./fuse
- 必要に応じて、カスタマーポータルから必要なパッチをダウンロードして、手順 5 に進みます。
patch:find
コマンドを入力し、Maven リポジトリーで利用可能なパッチを検索します。以下に例を示します。karaf@root()> patch:find Found new remote patch at mvn:org.jboss.redhat-fuse/fuse-karaf-patch-repository/7.8.0.fuse-sb2-780040/zip You can add the patch using "patch:add mvn:org.jboss.redhat-fuse/fuse-karaf-patch-repository/7.8.0.fuse-sb2-780040/zip" command, or simply use "patch:find --add" option.
注記--add
オプションを指定してpatch:find
コマンドを使用し、最新のパッチを見つけ、コンテナーの環境に追加できます。patch:add
コマンドを入力して、コンテナーの環境にパッチを追加します。以下に例を示します。karaf@root()> patch:add mvn:org.jboss.redhat-fuse/fuse-karaf-patch-repository/7.8.0.fuse-sb2-780040/zip [name] [installed] [rollup] [description] [CVEs] fuse-karaf-maintenance-patch-7.8.0.fuse-sb2-780040 false false fuse-karaf-maintenance-patch-7.8.0.fuse-sb2-780040 CVE-2020-28052 Current patch mechanism version: 7.8.0.fuse-780038 New patch mechanism version detected: 7.8.0.fuse-780040 Please run "patch:update" command to upgrade patching mechanism to version 7.8.0.fuse780040
注記patch:add
コマンドを使用する代わりに、.zip パッチファイルをFUSE_HOME/patches
ディレクトリーにコピーしてパッチファイルを自動的に追加することもできます。任意手順:
patch:update
コマンドを入力し、パッチメカニズム自体を更新します。karaf@root()> patch:update Current patch mechanism version: 7.8.0.fuse-780038 New patch mechanism version detected: 7.8.0.fuse-780040 Uninstalling patch features in version 7.8.0.fuse-780038 Installing patch features in version 7.8.0.fuse-780040
patch:simulate
コマンドを入力して、パッチのインストールをシミュレートします。これにより、パッチのインストール時にコンテナーに加えられる変更のログが生成されますが、実際にはコンテナーに何の変更も加えません。シミュレーションログを確認し、これらの変更を確認します。
patch:list
コマンドを入力し、追加されたパッチの一覧を表示します。このリストで、[name] 見出しの下にあるエントリーはパッチ ID です。karaf@root()> patch:list [name] [installed] [rollup] [description] [CVEs] fuse-karaf-maintenance-patch-7.8.0.fuse-sb2-780040 false false fuse-karaf-maintenance-patch-7.8.0.fuse-sb2-780040 CVE-2020-28052
パッチに明示的な CVE メタデータが含まれる場合は、
patch:show
コマンドを入力して詳細を表示できます。karaf@root()> patch:show fuse-karaf-maintenance-patch-7.8.0.fuse-sb2-780040 Patch ID: fuse-karaf-maintenance-patch-7.8.0.fuse-sb2-780040 Patch Commit ID: a2d7cf58e21116cde66c97232aea4be1ec304400 #### 1 CVE fix: - CVE-2020-28052: bouncycastle: password bypass in OpenBSDBCrypt.checkPassword utility possible Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1912881 CVE link: https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-28052
patch:install
コマンドを入力し、適用するパッチのパッチ ID を指定して、コンテナーにパッチを適用します。以下に例を示します。patch:install fuse-karaf-maintenance-patch-7.8.0.fuse-sb2-780040
2.3. パッチのロールバック
以下のように、patch:rollback
コマンドを使用して、インストールされたホットフィックスパッチをロールバックし、パッチ適用前の動作に戻すことができます。
手順
-
patch:list
コマンドを入力し、直近にインストールされたパッチのパッチ ID を取得します。 更新されたバンドルをロールバックするには、以下のコマンドを入力します。
karaf@root()> patch:rollback my-patch-x INFO : org.jboss.fuse.modules.patch.patch-management (2): Rolling back non-rollup patch "my-patch-x" removing overriden feature: hawtio-rbac/2.0.0.fuse-000117 refreshing features Enter feature:info command to view the information about the feature.
karaf@root()> feature:info hawtio-rbac Feature hawtio-rbac 2.0.0.fuse-000117 Details: Installs the hawtio RBAC enabler bundle(s) Feature has no configuration Feature has no configuration files Feature has no dependencies. Feature contains followed bundles: mvn:io.hawt/hawtio-osgi-jmx/2.0.0.fuse-000117 Feature has no conditionals.
2.4. Red Hat Fuse アプリケーションへのパッチ適用
新しい patch-maven-plugin
メカニズムを使用すると、パッチを Red Hat Fuse アプリケーションに適用できます。このメカニズムにより、異なる Red Hat Fuse の BOM によって提供される個々のバージョンを変更できます (たとえば、fuse-springboot-bom
と fuse-karaf-bom
など)。
2.4.1. patch-maven-plugin
patch-maven-plugin
は以下の操作を実行します。
- 現在の Red Hat Fuse BOM に関連するパッチメタデータを取得します。
-
BOM からインポートされた
<dependencyManagement>
に、バージョンの変更を適用します。
patch-maven-plugin
がメタデータを取得したら、プラグインが宣言されたプロジェクトの管理された依存関係および直接の依存関係すべてに対して繰り返し処理を行い、CVE/patch メタデータを使用して、一致する依存関係バージョンを置き換えます。バージョンが置き換えられたら、Maven ビルドが続行され、標準の Maven プロジェクトのステージに進みます。
2.4.2. Red Hat Fuse アプリケーションへのパッチ適用
patch-maven-plugin の目的は、Red Hat Fuse BOM にある依存関係のバージョンを、アプリケーションに適用するパッチのパッチメタデータに指定されたバージョンに更新することです。
手順
以下の手順では、アプリケーションにパッチを適用する方法を説明します。
patch-maven-plugin
をプロジェクトのpom.xml
ファイルに追加します。patch-maven-plugin
のバージョンは、Fuse BOM のバージョンと同じである必要があります。<build> <plugins> <plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>patch-maven-plugin</artifactId> <version>${version.org.jboss-redhat-fuse}</version> <extensions>true</extensions> </plugin> </plugins> </build>
mvn clean deploy
、mvn validate
、またはmvn dependency:tree
コマンドの 1 つを実行すると、プラグインはプロジェクトモジュールを検索して、Red Hat Fuse BOM のいずれかが使用されているかどうかを確認します。以下の 2 つのみがサポートされる BOM とみなされます。-
org.jboss.redhat-fuse:fuse-karaf-bom
: Fuse Karaf BOM の場合 -
org.jboss.redhat-fuse:fuse-springboot-bom
: Fuse Spring Boot BOM の場合
-
上記の BOM がいずれも見つからない場合は、プラグインによって以下のメッセージが表示されます。
$ mvn clean install [INFO] Scanning for projects... [INFO] ========== Red Hat Fuse Maven patching ========== [INFO] [PATCH] No project in the reactor uses Fuse Karaf or Fuse Spring Boot BOM. Skipping patch processing. [INFO] [PATCH] Done in 3ms
Fuse BOM が両方が見つかった場合は、
patch-maven-plugin
は以下の警告により停止します。$ mvn clean install [INFO] Scanning for projects... [INFO] ========== Red Hat Fuse Maven patching ========== [WARNING] [PATCH] Reactor uses both Fuse Karaf and Fuse Spring Boot BOMs. Please use only one. Skipping patch processing. [INFO] [PATCH] Done in 3ms
patch-maven-plugin
は以下の Maven メタデータ値のいずれかを取得しようと試みます。-
Fuse Karaf BOM を使用するプロジェクトの場合は、
org.jboss.redhat-fuse/fuse-karaf-patch-metadata/maven-metadata.xml
が解決されています。これは、org.jboss.redhat-fuse:fuse-karaf-patch-metadata:RELEASE
のアーティファクトのメタデータです。 Fuse Spring Boot BOM プロジェクトを使用するプロジェクトでは、
org.jboss.redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml
が解決されています。これは、org.jboss.redhat-fuse:fuse-springboot-patch-metadata:RELEASE
のアーティファクトのメタデータです。Maven によって生成されたメタデータの例
<?xml version="1.0" encoding="UTF-8"?> <metadata> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>fuse-springboot-patch-metadata</artifactId> <versioning> <release>7.8.1.fuse-sb2-781025</release> <versions> <version>7.8.0.fuse-sb2-780025</version> <version>7.7.0.fuse-sb2-770010</version> <version>7.7.0.fuse-770010</version> <version>7.8.1.fuse-sb2-781025</version> </versions> <lastUpdated>20201023131724</lastUpdated> </versioning> </metadata>
-
Fuse Karaf BOM を使用するプロジェクトの場合は、
-
patch-maven-plugin
はメタデータを解析し、現在のプロジェクトに適用可能なバージョンを選択します。これは、バージョン 7.8.xxx の Fuse BOM を使用する Maven プロジェクトでのみ可能です。バージョン範囲 7.8 および 7.9 以降と一致するメタデータのみが適用可能で、メタデータの最新バージョンのみが取得されます。 patch-maven-plugin
は、前の手順で見つかったgroupId
、artifactId
、およびversion
によって特定されたパッチメタデータをダウンロードする際に使用されるリモート Maven リポジトリーのリストを収集します。これらの Maven リポジトリーは、アクティブなプロファイルのプロジェクトの<repositories>
要素にリストされているもので、settings.xml
ファイルからのリポジトリーもリストされています。$ mvn clean install [INFO] Scanning for projects... [INFO] ========== Red Hat Fuse Maven patching ========== [INFO] [PATCH] Reading patch metadata and artifacts from 2 project repositories [INFO] [PATCH] - local-nexus: http://everfree.forest:8081/repository/maven-releases/ [INFO] [PATCH] - central: https://repo.maven.apache.org/maven2 Downloading from local-nexus: http://everfree.forest:8081/repository/maven-releases/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml ...
任意で、オフラインリポジトリーを使用する場合は、
-Dpatch
オプションを使用して、jboss-fuse/redhat-fuse
プロジェクトのfuse-karaf/fuse-karaf-patch-repository
モジュールまたはfuse-springboot/fuse-springboot-patch-repository
モジュールによって生成される ZIP ファイルを指定できます。これらの ZIP ファイルの内部構造は、Maven リポジトリーの構造と同じです。以下に例を示します。$ mvn clean install -Dpatch=../../../test/resources/patch-3.zip [INFO] Scanning for projects... [INFO] ========== Red Hat Fuse Maven patching ========== [INFO] [PATCH] Reading metadata and artifacts from /data/sources/github.com/jboss-fuse/redhat-fuse/fuse-tools/patch-maven-plugin/src/test/resources/patch-3.zip Downloading from fuse-patch: zip:file:/tmp/patch-3.zip-1742974214598205745/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml Downloaded from fuse-patch: zip:file:/tmp/patch-3.zip-1742974214598205745/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml (406 B at 16 kB/s) Downloading from fuse-patch: zip:file:/tmp/patch-3.zip-1742974214598205745/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/7.8.0.fuse-sb2-781023/fuse-springboot-patch-metadata-7.8.0.fuse-sb2-781023.xml Downloaded from fuse-patch: zip:file:/tmp/patch-3.zip-1742974214598205745/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/7.8.0.fuse-sb2-781023/fuse-springboot-patch-metadata-7.8.0.fuse-sb2-781023.xml (926 B at 309 kB/s) [INFO] [PATCH] Resolved patch descriptor: /home/user/.m2/repository/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/7.8.0.fuse-sb2-781023/fuse-springboot-patch-metadata-7.8.0.fuse-sb2-781023.xml ...
メタデータがリモートリポジトリー、ローカルリポジトリー、または ZIP ファイルからであるかどうかに関わらず、
patch-maven-plugin
によって分析されます。フェッチされたメタデータには CVE の一覧が含まれ、各 CVE には、影響を受ける Maven アーティファクトのリスト (glob パターンおよびバージョン範囲で指定) と、指定の CVE の修正が含まれるバージョンがあります。以下に例を示します。<?xml version="1.0" encoding="UTF-8" ?> <metadata xmlns="urn:redhat:fuse:patch-metadata:1"> <product-bom groupId="org.jboss.redhat-fuse" artifactId="fuse-springboot-bom" versions="[7.8,7.9)" /> <cves> <cve id="CVE-2020-xyz" description="Jetty can be configured to listen on port 8080" cve-link="https://nvd.nist.gov/vuln/detail/CVE-2020-xyz" bz-link="https://bugzilla.redhat.com/show_bug.cgi?id=42"> <affects groupId="org.eclipse.jetty" artifactId="jetty-*" versions="[9.4,9.4.32)" fix="9.4.32.v20200930" /> <affects groupId="org.eclipse.jetty.http2" artifactId="http2-*" versions="[9.4,9.4.32)" fix="9.4.32.v20200930" /> </cve> </cves> <fixes /> </metadata>
最後に、現在のプロジェクトの管理された依存関係に繰り返し処理が行われるときに、パッチメタデータに指定された修正リストが参照されます。一致するこれらの依存関係 (および管理された依存関係) は、固定バージョンに変更になります。以下に例を示します。
$ mvn clean install -U [INFO] Scanning for projects... [INFO ========== Red Hat Fuse Maven patching ========== [INFO] [PATCH] Reading patch metadata and artifacts from 2 project repositories [INFO] [PATCH] - local-nexus: http://everfree.forest:8081/repository/maven-releases/ [INFO] [PATCH] - central: https://repo.maven.apache.org/maven2 Downloading from local-nexus: http://everfree.forest:8081/repository/maven-releases/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml Downloading from central: https://repo.maven.apache.org/maven2/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml Downloaded from local-nexus: http://everfree.forest:8081/repository/maven-releases/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml (363 B at 4.3 kB/s) [INFO] [PATCH] Resolved patch descriptor: /home/user/.m2/repository/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/7.8.0.fuse-sb2-780032/fuse-springboot-patch-metadata-7.8.0.fuse-sb2-780032.xml [INFO] [PATCH] Patch metadata found for org.jboss.redhat-fuse/fuse-springboot-bom/[7.8,7.9) [INFO] [PATCH] - patch contains 1 CVE fix [INFO] [PATCH] Processing managed dependencies to apply CVE fixes... (https://nvd.nist.gov/vuln/detail/CVE-2020-xyz, https://bugzilla.redhat.com/show_bug.cgi?id=42_ [INFO] [PATCH] - CVE-2020-xyz: Jetty can be configured to expose itself on port 8080 [INFO] [PATCH] Applying change org.eclipse.jetty/jetty-*/[9.4,9.4.32) -> 9.4.32.v20200930 [INFO] [PATCH] - managed dependency: org.eclipse.jetty/jetty-alpn-client/9.4.30.v20200611 -> 9.4.32.v20200930 ... [INFO] [PATCH] - managed dependency: org.eclipse.jetty/jetty-openid/9.4.30.v20200611 -> 9.4.32.v20200930 [INFO] [PATCH] Applying change org.eclipse.jetty.http2/http2-*/[9.4,9.4.32) -> 9.4.32.v20200930 [INFO] [PATCH] - managed dependency: org.eclipse.jetty.http2/http2-client/9.4.30.v20200611 -> 9.4.32.v20200930 ... [INFO] [PATCH] Done in 635ms =================================================
パッチのスキップ
特定のパッチをプロジェクトに適用したくない場合、patch-maven-plugin
は skip
オプションを提供します。すでに patch-maven-plugin
をプロジェクトの pom.xml
ファイルに追加済みで、バージョンを変更したくない場合は、以下のいずれかの方法を使用してパッチをスキップできます。
-
以下のように、プロジェクトの
pom.xml
ファイルに skip オプションを追加します。
<build> <plugins> <plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>patch-maven-plugin</artifactId> <version>${version.org.jboss-redhat-fuse}</version> <extensions>true</extensions> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
-
または、以下のように
mvn
コマンドの実行時に-DskipPatch
オプションを使用します。
$ mvn dependency:tree -DskipPatch [INFO] Scanning for projects... [INFO] [INFO] ------< org.jboss.redhat-fuse:cve-dependency-management-module1 >------- [INFO] Building cve-dependency-management-module1 7.8.0.fuse-sb2-780033 [INFO] --------------------------------[ jar ]--------------------------------- ...
上記の出力にあるように、patch-maven-plugin
は呼び出されず、パッチはアプリケーションに適用されません。
第3章 Maven のローカルでの設定
一般的な Fuse アプリケーションの開発では、Maven を使用してプロジェクトをビルドおよび管理します。
以下のトピックでは、Maven をローカルで設定する方法を説明します。
3.1. Maven 設定の準備
Maven は、Apache の無料のオープンソースビルドツールです。通常は、Maven を使用して Fuse アプリケーションを構築します。
手順
- Maven ダウンロードページ から最新バージョンの Maven をダウンロードします。
システムがインターネットに接続していることを確認します。
デフォルトの動作では、プロジェクトのビルド中、Maven は外部リポジトリーを検索し、必要なアーティファクトをダウンロードします。Maven はインターネット上でアクセス可能なリポジトリーを探します。
このデフォルト動作を変更し、Maven によってローカルネットワーク上のリポジトリーのみが検索されるようにすることができます。これは Maven をオフラインモードで実行できることを意味します。オフラインモードでは、Maven によってローカルリポジトリーのアーティファクトが検索されます。「ローカル Maven リポジトリーの使用」 を参照してください。
3.2. Maven への Red Hat リポジトリーの追加
Red Hat Maven リポジトリーにあるアーティファクトにアクセスするには、Red Hat Maven リポジトリーを Maven の settings.xml
ファイルに追加する必要があります。Maven は、ユーザーのホームディレクトリーの .m2
ディレクトリーで settings.xml
ファイルを探します。ユーザー指定の settings.xml
ファイルがない場合、Maven は M2_HOME/conf/settings.xml
にあるシステムレベルの settings.xml
ファイルを使用します。
前提条件
Red Hat リポジトリーを追加する settings.xml
ファイルがある場所を把握している。
手順
以下の例のように、settings.xml
ファイルに Red Hat リポジトリーの repository
要素を追加します。
<?xml version="1.0"?> <settings> <profiles> <profile> <id>extra-repos</id> <activation> <activeByDefault>true</activeByDefault> </activation> <repositories> <repository> <id>redhat-ga-repository</id> <url>https://maven.repository.redhat.com/ga</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>redhat-ea-repository</id> <url>https://maven.repository.redhat.com/earlyaccess/all</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>jboss-public</id> <name>JBoss Public Repository Group</name> <url>https://repository.jboss.org/nexus/content/groups/public/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>redhat-ga-repository</id> <url>https://maven.repository.redhat.com/ga</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>redhat-ea-repository</id> <url>https://maven.repository.redhat.com/earlyaccess/all</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>jboss-public</id> <name>JBoss Public Repository Group</name> <url>https://repository.jboss.org/nexus/content/groups/public</url> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>extra-repos</activeProfile> </activeProfiles> </settings>
3.3. ローカル Maven リポジトリーの使用
インターネットへ接続せずにコンテナーを実行し、オフライン状態では使用できない依存関係を持つアプリケーションをデプロイする場合は、Maven 依存関係プラグインを使用してアプリケーションの依存関係を Maven オフラインリポジトリーにダウンロードできます。ダウンロード後、このカスタマイズされた Maven オフラインリポジトリーをインターネットに接続していないマシンに提供できます。
手順
pom.xml
ファイルが含まれるプロジェクトディレクトリーで、以下のようなコマンドを実行し、Maven プロジェクトのリポジトリーをダウンロードします。mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.0:go-offline -Dmaven.repo.local=/tmp/my-project
この例では、プロジェクトのビルドに必要な Maven 依存関係とプラグインは
/tmp/my-project
ディレクトリーにダウンロードされます。- このカスタマイズされた Maven オフラインリポジトリーを、インターネットに接続していない内部のマシンに提供します。
3.4. 環境変数またはシステムプロパティーを使用した Maven ミラーの設定
アプリケーションの実行時に、Red Hat Maven リポジトリーにあるアーティファクトにアクセスする必要があります。このリポジトリーは、Maven の settings.xml
ファイルに追加されます。Maven は以下の場所で settings.xml
を探します。
- 指定の URL を検索します。
-
見つからない場合は
${user.home}/.m2/settings.xml
を検索します。 -
見つからない場合は
${maven.home}/conf/settings.xml
を検索します。 -
見つからない場合は
${M2_HOME}/conf/settings.xml
を検索します。 -
どの場所にも見つからない場合は、空の
org.apache.maven.settings.Settings
インスタンスが作成されます。
3.4.1. Maven ミラー
Maven では、一連のリモートリポジトリーを使用して、ローカルリポジトリーで現在利用できないアーティファクトにアクセスします。ほとんどの場合、リポジトリーのリストには Maven Central リポジトリーが含まれますが、Red Hat Fuse では Maven Red Hat リポジトリーも含まれます。リモートリポジトリーへのアクセスが不可能な場合や許可されない場合は、Maven ミラーのメカニズムを使用できます。ミラーは、特定のリポジトリー URL を異なるリポジトリー URL に置き換えるため、リモートアーティファクトの検索時にすべての HTTP トラフィックを単一の URL に転送できます。
3.4.2. Maven ミラーの settings.xml
への追加
Maven ミラーを設定するには、以下のセクションを Maven の settings.xml
に追加します。
<mirror> <id>all</id> <mirrorOf>*</mirrorOf> <url>http://host:port/path</url> </mirror>
settings.xml
ファイルに上記のセクションがない場合は、ミラーが使用されません。XML 設定を提供せずにグローバルミラーを指定するには、システムプロパティーまたは環境変数を使用します。
3.4.3. 環境変数またはシステムプロパティーを使用した Maven ミラーの設定
環境変数またはシステムプロパティーのいずれかを使用して Maven ミラーを設定するには、以下を追加します。
-
環境変数 MAVEN_MIRROR_URL を
bin/setenv
ファイルに追加します。 -
システムプロパティー mavenMirrorUrl を
etc/system.properties
ファイルに追加します。
3.4.4. Maven オプションを使用した Maven ミラー URL の指定
環境変数またはシステムプロパティーによって指定された Maven ミラー URL ではなく、別の Maven ミラー URL を使用するには、アプリケーションの実行時に以下の Maven オプションを使用します。
-DmavenMirrorUrl=mirrorId::mirrorUrl
たとえば、
-DmavenMirrorUrl=my-mirror::http://mirror.net/repository
となります。-DmavenMirrorUrl=mirrorUrl
たとえば、
-DmavenMirrorUrl=http://mirror.net/repository
となります。この例では、<mirror> の <id> は mirror になります。
3.5. Maven アーティファクトおよびコーディネート
Maven ビルドシステムでは、アーティファクト が基本的なビルディングブロックです。ビルド後のアーティファクトの出力は、通常 JAR や WAR ファイルなどのアーカイブになります。
Maven の主な特徴として、アーティファクトを検索し、検索したアーティファクト間で依存関係を管理できる機能が挙げられます。Maven コーディネート は、特定のアーティファクトの場所を特定する値のセットです。基本的なコーディネートには、以下の形式の 3 つの値があります。
groupId:artifactId:version
Maven は、packaging の値、または packaging 値と classifier 値の両方を使用して基本的なコーディネートを拡張することがあります。Maven コーディネートには以下の形式のいずれかを使用できます。
groupId:artifactId:version groupId:artifactId:packaging:version groupId:artifactId:packaging:classifier:version
値の説明は次のとおりです。
- groupdId
-
アーティファクトの名前の範囲を定義します。通常、パッケージ名のすべてまたは一部をグループ ID として使用します。たとえば、
org.fusesource.example
です。 - artifactId
- グループ名に関連するアーティファクト名を定義します。
- version
-
アーティファクトのバージョンを指定します。バージョン番号には
n.n.n.n
のように最大 4 つの部分を使用でき、最後の部分には数字以外の文字を使用できます。たとえば1.0-SNAPSHOT
の場合は、最後の部分が英数字のサブ文字列である0-SNAPSHOT
になります。 - packaging
-
プロジェクトのビルド時に生成されるパッケージ化されたエンティティーを定義します。OSGi プロジェクトでは、パッケージングは
bundle
になります。デフォルト値はjar
です。 - classifier
- 同じ POM からビルドされた内容が異なるアーティファクトを区別できるようにします。
次に示すように、アーティファクトの POM ファイル内の要素で、アーティファクトのグループ ID、アーティファクト ID、パッケージング、およびバージョンを定義します。
<project ... > ... <groupId>org.fusesource.example</groupId> <artifactId>bundle-demo</artifactId> <packaging>bundle</packaging> <version>1.0-SNAPSHOT</version> ... </project>
前述のアーティファクトの依存関係を定義するには、以下の dependency
要素を POM ファイルに追加します。
<project ... > ... <dependencies> <dependency> <groupId>org.fusesource.example</groupId> <artifactId>bundle-demo</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> ... </project>
前述の依存関係に bundle
パッケージを指定する必要はありません。バンドルは特定タイプの JAR ファイルであり、jar
はデフォルトの Maven パッケージタイプであるためです。依存関係でパッケージタイプを明示的に指定する必要がある場合は、type
要素を使用できます。