コンテンツ

目次

一般

Apache Tomcat® のバージョン間の移行またはアップグレードに適用される一般的な考慮事項については、まず一般的な移行ガイドページをお読みください。

8.0.x または 8.5.x から 9.0.x への移行

このセクションでは、アップグレード時に下位互換性の問題を引き起こす可能性のある 8.0.x / 8.5.x と 9.0.x の間の既知のすべての変更をリストします。これらの変更点と新機能の一部は、Apache Tomcat 8.5.x にもすでに含まれています。

Java 8 が必須

Apache Tomcat 9.0.x には Java 8 以降が必要です。Apache Tomcat 8.0.x および 8.5.x には Java 7 が必要でした。

仕様 API

Apache Tomcat 9 は、Java Servlet 4.0、JavaServer Pages 2.3、Java Unified Expression Language 3.0、および Java API for WebSocket 1.0 の仕様をサポートしています。仕様のバージョン間の変更点は、各仕様ドキュメントの変更点付録に記載されています。

Servlet 4.0 API

ワイルドカードインポート構文を使用する JSP ページでは、Servlet API で追加された新しいクラスが Web アプリケーション内のクラスと競合する可能性があります。たとえば、パッケージ "a" にクラス PushBuilder が含まれている場合、Tomcat 9 では以下の JSP ページはコンパイルされなくなります。

<%@page import="a.*"%>
<% PushBuilder pushBuilder = new PushBuilder(); %>

これは、javax.servlet.http.* の暗黙的なインポートと a.* の明示的なインポートが、Servlet 4.0 で追加されたクラス PushBuilder の競合する定義を提供するからです。解決策は、明示的なインポート import="a.PushBuilder" を使用することです。

JavaServer Pages 2.3

これは Tomcat 8.x から変更されていません。

Expression Language 3.0

これは Tomcat 8.x から変更されていません。

WebSocket 1.1

これは Tomcat 8.x から変更されていません。

BIO コネクタの削除

以下の変更は 8.5.0 以降に適用されます。

HTTP および AJP の両方に対応する Java ブロッキング IO 実装 (BIO) は削除されました。ユーザーは Java 非ブロッキング IO 実装 (NIO) に切り替えることをお勧めします。

HTTP コネクタの変更

HTTP の理由句は完全に削除されました。一部の RFC に準拠していないクライアントでは、理由句がない場合に失敗することが知られています。このような失敗はクライアント側の問題であり、Tomcat の問題ではありません。

Comet サポートの削除

以下の変更は 8.5.0 以降に適用されます。

Comet のサポートは、直接的な代替手段なしに削除されました。Comet を使用しているアプリケーションは、WebSocket への移行を推奨します。

HTTP/2 サポートの追加

以下の機能は 8.5.0 以降で利用可能です。

HTTP/2 は、h2 (TLS 経由、ALPN でネゴシエート) および h2c (クリアテキスト、HTTP/1.1 アップグレードでネゴシエート) をサポートしています。HTTP/2 はコネクタで明示的に有効にする必要があります。有効にするには、以下を挿入します。

<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
HTTP/2 を有効にしたいコネクタ内に。セキュアな NIO または NIO2 コネクタで HTTP/2 を有効にするには、それらのコネクタが TLS に OpenSSL エンジンを使用している必要があることに注意してください。

TLS 仮想ホスティングと複数証明書サポートの追加

以下の機能は 8.5.0 以降で利用可能です。

Tomcat 9 は、単一のコネクタに対して複数の TLS 仮想ホストをサポートしており、各仮想ホストは複数の証明書をサポートできます。仮想ホストの定義は Connector 要素内にネストされ、複数の仮想ホストが指定されている場合は、Connector の defaultSSLHostConfigName 属性を使用してデフォルトが指定されます。証明書の定義は仮想ホスト内にネストされます。

次の例は、単一の APR/ネイティブコネクタを、各ホストが RSA および EC 証明書の両方を持つ複数の TLS 仮想ホストに対して構成する方法を示しています。


<Connector port="8443"
           protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="150"
           SSLEnabled="true"
           defaultSSLHostConfigName="openoffice.apache.org" >
    <SSLHostConfig hostName="openoffice.apache.org" >
        <Certificate certificateKeyFile="conf/openoffice.apache.org-rsa-key.pem"
                     certificateFile="conf/openoffice.apache.org-rsa-cert.pem"
                     type="RSA" />
        <Certificate certificateKeyFile="conf/openoffice.apache.org-ec-key.pem"
                     certificateFile="conf/openoffice.apache.org-ec-cert.pem"
                     type="EC" />
    </SSLHostConfig>
    <SSLHostConfig hostName="www.openoffice.org" >
        <Certificate certificateKeyFile="conf/www.openoffice.org-rsa-key.pem"
                     certificateFile="conf/www.openoffice.org-rsa-cert.pem"
                     type="RSA" />
        <Certificate certificateKeyFile="conf/www.openoffice.org-ec-key.pem"
                     certificateFile="conf/www.openoffice.org-ec-cert.pem"
                     type="EC" />
    </SSLHostConfig>
</Connector>

内部 API

Tomcat 9 の内部 API は Tomcat 8 とおおむね互換性がありますが、詳細レベルでは多くの変更があり、バイナリ互換ではありません。Tomcat の内部と連携するカスタムコンポーネントを開発する方は、関連する API の JavaDoc を確認する必要があります。

特に注目すべきは次のとおりです。

  • コネクタ全体で、重複コードを削減し、実装間の動作を整合させるための大規模なリファクタリングが行われました。(この変更は 8.5.x に含まれています。)
  • 非推奨の digest 属性は Realm から削除されました。(この変更は 8.5.x に含まれています。)

JSR-77 実装の削除

以下の変更は 8.5.0 以降に適用されます。

JSR-77 実装は不完全であり、8.5.x および 9.0.x で削除されました。具体的には、JMX に公開されていた以下のメソッドが削除されました。

  • StandardContext.getServlets()
  • StandardContext.isStateManageable()
  • StandardContext.getDeploymentDescriptor()
  • StandardWrapper.isStateManageable()

クラスタリング

以下の変更は 8.5.0 以降に適用されます。

MessageDispatch15Interceptor は、Java 5 の機能を MessageDispatchInterceptor に追加するために使用されていました。MessageDispatch15Interceptor は、Java 5 の機能を MessageDispatchInterceptor に統合することにより、Tomcat 8.5.x および 9.0.x で削除されました。

InstanceListener の削除

以下の変更は 8.5.0 以降に適用されます。

InstanceListener のサポートは 8.5.x および 9.0.x で削除されました。具体的には、以下のクラスが削除されました。

  • org.apache.catalina.InstanceListener
  • org.apache.catalina.InstanceEvent
  • org.apache.catalina.util.InstanceSupport

SessionManager

以下の変更は 8.5.0 以降に適用されます。

以下のセッションマネージャー属性は、8.5.x および 9.0.x で完全に削除されました。

  • distributable
  • maxInactiveInterval
  • sessionIdLength

代替は以下のとおりです。

  • distributable 属性は 8.0 で非推奨となり、指定された値は無視されます。これは Context を介して設定する必要があります。この値は、/WEB-INF/web.xml 内の <distributable /> 要素の有無に基づいて継承されます。
  • maxInactiveInterval 属性は 8.0 で非推奨となりました。値が指定された場合、警告ログが出力されます。これは Context を介して設定する必要があります。この値は、/WEB-INF/web.xml 内の <session-timeout> 要素の値に基づいて継承されます。
  • ManagersessionIdLength 属性は、SessionIdGeneratorsessionIdLength 属性に置き換えられました。

クッキー

デフォルトの CookieProcessor は、現在 Rfc6265CookieProcessor です。CookieProcessorContext ごとに設定可能で、LegacyCookieProcessor を使用して 8.0.x の動作を得ることができます。

Web アプリケーション

Manager および HostManager の Web アプリケーションは、デフォルトで RemoteAddrValve が設定されており、localhost からの接続にこれらのアプリケーションへのアクセスを制限します。

Engine と Host の設定

startStopThreads の動作は、実効値が 1 の場合に変更されました。この場合、子要素は、単一スレッドで構成された ExecutorService を介するのではなく、現在のスレッドで開始されます。

Context の設定

clearReferencesStatic 属性は 8.5.x および 9.0.x で削除されました。

ロギング

デフォルトでは、ログファイルは 90 日間保持され、その後ファイルシステムから削除されます。

9.0.x のアップグレード

Apache Tomcat のインスタンスを Tomcat 9 のあるバージョンから別のバージョンにアップグレードする場合、特に $CATALINA_HOME と $CATALINA_BASE に別々の場所を使用している場合は、新しい属性やデフォルト値の変更など、設定ファイルの変更がアップグレードの一部として適用されていることを確認する必要があります。これらの変更を特定するのに役立つよう、以下のフォームを使用して、Tomcat 9 の異なるバージョンの設定ファイル間の違いを表示できます。

Tomcat 9.0.x の注目すべき変更点

Tomcat 開発者は、各パッチリリースが以前のリリースと完全に下位互換性があることを目指しています。しかし、バグを修正するために、互換性を破る必要がある場合があります。ほとんどの場合、これらの変更は気づかれないでしょう。このセクションでは、完全に下位互換性がない変更で、アップグレード時に問題を引き起こす可能性のある変更をリストします。

  • 9.0.96 では、プールされた JSP タグのリリース方法が変更され、以前のバージョンの Apache Tomcat 9 でコンパイルされた一部の JSP ファイルとの間でバイナリ互換性の問題が発生しました。この非互換性は 9.0.97 で修正されるため、9.0.96 より前にコンパイルされた JSP は、9.0.97 以降で再コンパイルなしで再び実行されるはずです。
  • 9.0.74 以降では、Connector 属性 maxParameterCount のデフォルト値が 10,000 から 1,000 に減らされました。
  • 9.0.31 以降では、AJP コネクタのデフォルトの listen アドレスが、すべてのアドレスではなくループバックアドレスに変更されました。

    参照: AJP コネクタ

  • 9.0.31 以降では、AJP コネクタの requiredSecret 属性は非推奨となり、secret 属性に置き換えられました。

    参照: AJP コネクタ

  • 9.0.31 以降では、secretRequired 属性が AJP コネクタに追加されました。デフォルトである true に設定されている場合、secret が指定されていない限り、AJP コネクタは起動しません。

    参照: AJP コネクタ

  • 9.0.31 以降では、allowedRequestAttributesPattern 属性が AJP コネクタに追加されました。認識されない属性を持つリクエストは、403 エラーでブロックされるようになりました。

    参照: AJP コネクタ

  • 9.0.44 以降では、HostConfig.check(String) メソッドのセマンティクスが変更されました。メソッドを呼び出す前にアプリケーションをサービス済みとしてマークするのではなく、リソースチェックの前にアプリケーションをサービス済みとしてマークし、チェック完了後にアプリケーションをサービス済みでないとしてマークします。メソッド呼び出し時にアプリケーションがサービス済みとしてマークされている場合、そのメソッドは NO-OP となります。

  • 9.0.48 以降では、NIO ポーラーが簡素化され、ブロックポーラーとセレクタの設定が削除されました。これらが設定に含まれていても起動エラーにはなりませんが、警告が表示される可能性があり、効果はありません。

  • 9.0.51 以降では、機密性の高い転送保証により「Cache-Control: private」を追加する際に、Tomcat は「Expires」HTTP レスポンスヘッダーを追加しなくなりました。これにより、独自のヘッダーを明示的に設定せず、Tomcat の以前の動作に依存しているアプリケーションのキャッシュ動作が変更される可能性があります。キャッシュを無効にしたい場合は、アプリケーションで明示的に設定する必要があります。詳細については、BZ 65513 を参照してください。

  • 9.0.53 以降では、Commons FileUpload の更新されたフォークが java.nio.file.Files を使用するようになった結果、マルチパートアップロードを使用するアプリケーションは、進行中のすべてのマルチパートアップロードを保存するのに十分な直接メモリを JVM が設定されていることを確認する必要があります。

  • 9.0.56 以降では、システムプロパティ org.apache.juli.AsyncLoggerPollInterval は使用されなくなりました。

Tomcat 9.0.x 設定ファイルの相違点

以下のボックスから設定ファイル、古いバージョン、新しいバージョンを選択し、「差分を表示」をクリックして差分を確認してください。差分は新しいタブ/ウィンドウに表示されます。

注: 差分がない場合は、エラーページが表示されます。

作業コピー内から、以下のような Git コマンドを使用することもできます。

git diff 9.0.0 9.0.12 -- conf/