ページの先頭です。
ここから本文です。

よくあるご質問(サポートFAQ)

【WebOTX Application Server】WebOTX Application Server で Spring Boot 2.x を使う方法(OTX-FAQ-000871)

質問内容

Spring Boot 2.x を使用した Web アプリケーションを WebOTX Application Server で動作させる方法を教えてください。

回答内容

Spring Boot を使ったアプリケーションを WebOTX Application Server 上で動作させるには、アプリケーションと WebOTX Application Server の両方に下記で解説する追加の設定が必要です。本 FAQ で解説する設定は、Spring Boot を使用した最小のアプリケーションを動作させる場合の内容であり、アプリケーションの作り (依存ライブラリなど) によっては追加の設定が必要になる場合があります。
なお、アプリケーション内の web.xml, nec-web.xml を変更した後は、war を配備し直してください。

※ WebOTX Application Server Standard/Enterprise V9.x および WebOTX Application Server Standard V10.1 の場合、以下の回避方法を実施してもプロセスグループ上では Spring Boot を使用したアプリケーションは動作しません。WebOTX Application Server Standard V10.2 以降では、プロセスグループ上でも動作します。また、WebOTX V8 以前は本 FAQ の対象外です。

■ 1. Java EE のアノテーション解析の無効化

※ この設定は WebOTX V10.1 以降では必須ではありません。エラーログの出力を抑制したい場合は実施してください。

WebOTX は Java EE アプリケーションサーバの仕様に準拠しているため、war 内のクラスに対して Java EE のアノテーションを解析します。

しかし Spring Boot の auto-configuration 機能と以下の JDK の不具合により、WebOTX が war 内のクラスをアノテーション解析しようとすると java.lang.ArrayStoreException が発生し配備に失敗します。

JDK-7183985 : (ann) Class.getAnnotation() throws an ArrayStoreException when the annotation class not present
http://bugs.java.com/view_bug.do?bug_id=7183985

※ この JDK の不具合は JDK 11 で修正されました。

この問題を回避するために、Spring Boot を使用するアプリケーションに対して、WebOTX が行う Java EE のアノテーション解析を無効化する必要があります。

この時、アプリケーション内で Java EE のアノテーションを使用していると、そのアノテーションは無視されるので注意してください。Spring Boot および Spring Framework の機能だけ使っていて、Java EE のアノテーションを使用していない場合は問題ありません。

[Java EE のアノテーション解析を無効化する方法]
以下の内容を含む web.xml を war の WEB-INF に追加してください。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
</web-app>

既に web.xml が存在する場合は、<web-app> 要素に metadata-complete="true" という属性を追加してください。


■ 2. ServletWebServerFactoryAutoConfiguration の除外

Spring Boot の auto-configuration 機能で、Web コンテナ関連の設定が誤って有効になります。これは、その設定が有効となる条件のクラスが WebOTX に含まれているためです。しかし、Spring Boot の Web コンテナ関連の設定は WebOTX 上では正しく動作しないので、この設定を無効にする必要があります。

Spring Boot の設定ファイルまたは、設定用のクラスで、以下のクラスを auto-configuration 機能から除外してください。

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

例えば、プロパティファイル (application.properties) で Spring Boot の設定を行う場合は、プロパティファイルに以下を追加してください。
(application.properties は WEB-INF/classes に配置します)

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

設定方法の詳細は、Spring Boot のドキュメントを参照してください。


■ 3. server.policy の変更

WebOTX ではセキュリティマネージャが有効になっていますが、Spring Boot の動作に必要な権限が既定では設定されていません。

以下の権限を <WebOTXインストールディレクトリ>/domains/<ドメイン名>/config/server.policy に追加してください。

grant {
permission java.lang.RuntimePermission "getenv.*";
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "defineClass";
permission java.lang.RuntimePermission "modifyThread";
permission java.lang.RuntimePermission "shutdownHooks";
permission java.lang.RuntimePermission "accessClassInPackage.*";
};

※ server.policy は WebOTX のドメインを停止した状態で編集してください。

特定のアプリケーションに対してのみ権限を与える場合は、上記の代わりに以下を追加してください。

grant codeBase "file:${com.nec.webotx.instanceRoot}/applications/<アプリケーション名>/-" {
permission java.lang.RuntimePermission "getenv.*";
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "defineClass";
permission java.lang.RuntimePermission "modifyThread";
permission java.lang.RuntimePermission "shutdownHooks";
permission java.lang.RuntimePermission "accessClassInPackage.*";
};


■ 4. default サーブレットの無効化

WebOTX では Web アプリケーションの既定の設定で default サーブレットが / にマッピングされています。このサーブレットマッピングが Spring Boot のサーブレットマッピングと衝突するため、default サーブレットを無効化するか、default サーブレットのマッピングを無効化する必要があります。

以下のいずれかを実施してください。

a. <WebOTXインストールディレクトリ>/domains/<ドメイン名>/config/default-web.xml で default サーブレットの servlet-mapping をコメントアウト
(この変更により、同じドメイン内の他のアプリケーションでも、既定の / に対する default サーブレットのマッピングが無効化されます)
b. web.xml で default サーブレットの enabled を false に設定
(この変更の他のアプリケーションへの影響はありません)

※ default-web.xml は WebOTX のドメインを停止した状態で編集してください。

b を実施する場合、上記 1 のアノテーション解析の無効化と合わせると、以下の web.xml を war に含めることになります。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet>
<servlet-name>default</servlet-name>
<enabled>false</enabled>
</servlet>
</web-app>


■ 5. welcom-file-list の無効化

WebOTX では Web アプリケーションの既定の設定で welcome-file が設定されています。この設定が Spring Boot のマッピングと衝突するため、この既定の設定を無効化する必要があります。

<WebOTXインストールディレクトリ>/domains/<ドメイン名>/config/default-web.xml の <welcom-file-list> から全ての <welcome-file> をコメントアウトしてください。
(この変更により、同じドメイン内の他のアプリケーションでも、既定の welcome-file が無効化されます)

<welcome-file-list>
<!-- <welcome-file>index.html</welcome-file> -->
<!-- <welcome-file>index.htm</welcome-file> -->
<!-- <welcome-file>index.jsp</welcome-file> -->
</welcome-file-list>

※ default-web.xml は WebOTX のドメインを停止した状態で編集してください。


■ 6. nec-web.xml の追加 (javax.* パッケージの上書きを許可)

Spring Boot を使用すると、Java EE の API を含む jar ファイルが war 内に含まれます。これらが WebOTX が提供するものと競合するため、war 内のものを優先するよう設定する必要があります。

war 内のものを優先するには、以下の内容を含む nec-web.xml を war の WEB-INF に追加してください。

<?xml version="1.0" encoding="UTF-8"?>
<nec-web-app>
<class-loader delegate="false">
<property name="overrideablejavaxpackages" value="javax"/>
</class-loader>
</nec-web-app>

既に nec-web.xml が存在する場合は、上記の <class-loader> 要素を追加してください。<class-loader> 要素が既に存在する場合は、<class-loader> 要素に delegate="false" を指定し、子要素に上記の <property> 要素を追加してください。overrideablejavaxpackages プロパティが既に存在する場合は、value に javax を , で区切って追加してください。

【対象製品】Application Server
【確認済みのバージョン】V9以降
【確認済みのエディション】すべて
【確認済みの対象OS】すべて
【確認済みのJavaバージョン】すべて
【コンポーネント】Webコンテナ
【カテゴリー】運用/設定

製品名カテゴリ

WebOTX
WebOTX Application Server

  • コンテンツID: 3150114634
  • 公開日: 2019年10月29日
  • 最終更新日:2020年06月16日

アンケート

サポート情報充実のためアンケートにご協力をお願いいたします。



コメント欄:
ここからページ共通メニューです。 ページ共通メニューを読み飛ばす。