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 サーブレットのマッピングを無効化する必要があります。
以下を実施してください。
・web.xml で default サーブレットの enabled を false に設定
(この変更の他のアプリケーションへの影響はありません)
上記 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コンテナ
【カテゴリー】運用/設定