1.6. アプリケーション検証項目一覧

1.6.1. WebOTX 旧バージョンの非互換項目

1.6.1.1. *.tld ファイルが不正な場所に存在しています
チェック内容:
Webアプリケーションの /WEB-INF/tags 配下に implicit.tld 以外の *.tld ファイルが存在しないか確認してください。
メッセージレベル:
警告
説明:
/WEB-INF/tags 配下に implicit.tld 以外の *.tld ファイルがある場合は、アプリケーションのロード時にエラーとなるよう WebOTX V9 から仕様を変更しました。
これはJSP2.1で「JSP.7.3.1 Identifying Tag Library Descriptors Tag」の仕様が変更されたためです。
旧バージョンと同じ動作にする場合、以下のシステムプロパティを設定してください。
システムプロパティ
  -Dcom.nec.webotx.webcontainer.jsp.TldInTags=true
上記のシステムプロパティを設定しない場合は、アプリケーション側で /WEB-INF/tags 配下にある implicit.tld 以外の *.tld ファイルを /WEB-INF/tags 以外の /WEB-INF 配下に移動してください。 ただし、/WEB-INF/classes, /WEB-INF/lib は推奨しません。
1.6.1.2. EJB エンドポイント上で無効な WS-ReliableMessaging が使用されています
チェック内容:
EJB プロジェクトのソースフォルダ内の *.wsdl に WS-ReliableMessaging の名前空間の要素が定義されるていること、または、ソースフォルダのルートに wsit-*.xml ファイルが配置されていないか確認してください。
メッセージレベル:
エラー
説明:
EJB エンドポイント上で WS-ReliableMessaging の機能はサポートされません。
Web サービスが EJB エンドポイント上で動作する場合は、WS-ReliableMessaging を使用しないように変更するか、または、動的 Web プロジェクトに変更します。
1.6.1.3. EJB プロジェクトに複数の Web サービスエンドポイントが定義されています
チェック内容:
1 つの EJB プロジェクト内に、2 つ以上の @WebService アノテーションが付与されていないか確認してください。
メッセージレベル:
エラー
説明:
Standard において、 Web サービスエンドポイントを複数含む EJB を配備した場合、 複数の Web サービスエンドポイントのうち、ひとつの Web サービスしか呼び出すことができません。
Web サービスエンドポイント毎に EJB プロジェクトを作成するようにします。
1.6.1.4. コネクタコネクションプールのプールオブジェクトの変更を確認してください
チェック内容:
javax.jms.Connection の setClientID() の呼び出し箇所を確認してください。
メッセージレベル:
警告
説明:
V8.11 でのコネクタコネクションプールのプールオブジェクト変更により、JMS リソースアダプタを使用して JMS コネクションを取得する場合、 コネクションファクトリリソースに対してクライアント ID を指定していると、 次のエラーが発生する可能性があります。
  Exception caught: javax.jms.JMSException: WOJMSRA:CFA:allocation failure:createQueueConnection:Error in allocating a connection. Cause:
  WOJMSRA:MC:InvalidClientIDException-[C4052]: クライアント ID はすでに使用されています - MyClientID

このような場合は、次のいずれかの対処を行ってください。
  • コネクションファクトリリソースで「クライアントID の 共有(server.resources.jms-resource.jms-connection-factory.connection-factory-name.wojmsEnableSharedClientID) 」に共有のクライアント ID を設定する。
  • コネクションファクトリリソースで以下の「クライアントID(server.resources.jms-resource.jms-connection-factory.connection-factory-name.wojmsConfiguredClientID) 」を設定せずに、アプリケーションで個別のクライアントIDを設定する。
いずれの変更も行うことができない場合は、JMSサービスの設定により、プールオブジェクトを旧バージョンと同じにして回避することも可能です。
otxadmin> set server.jms-service.property.wojmsConnectionPooling=false
1.6.1.5. ステートフル Session Bean の EJBContext クラスのメソッド呼び出しを確認してください
チェック内容:
javax.ejb.SessionBean を実装するクラスの ejbActivate、ejbPassivate メソッド内で、 javax.ejb.EJBContext クラスの isCallerInRole、getCallerPrincipal メソッドの呼び出し箇所を確認してください。
メッセージレベル:
エラー
説明:
ステートフル Session Beanで、ejbActivate() と ejbPassivate() メソッド内から、 EJBContext クラスの isCallerInRole() と getCallerPrincipal() メソッドを呼び出すことはできません。
修正方法:isCallerInRole()、getCallerPrincipal() メソッドの呼び出しを ejbActivate()、ejbPassivate() メソッドから削除します。
1.6.1.6. Connection の setAutoCommit メソッドの呼び出しを確認してください
チェック内容:
java.sql.Connection の getAutoCommit() メソッドの呼び出し箇所を確認してください。
メッセージレベル:
警告
説明:
java.sql.Statement.getConnection メソッドで返却された java.sql.Connection の setAutoCommit メソッドを直接呼び出さないでください。 呼び出すと、JDBC データソースによる autoCommit モードの自動変更が正しく行われません。

1.6.2. Apache Tomcat の非互換項目

1.6.2.1. Context Environment コンポーネントをデプロイメント記述子に記述してください
チェック内容:
context.xml ファイル内の <Environment> 要素を定義する箇所を検出します。
メッセージレベル:
エラー
説明:
web.xml ファイル内に <Environment> 要素と同じ情報を定義する <env-entry> 要素が存在しているかを確認します。
存在していないまたは情報が異なる場合、作成または更新する必要があります。
修正方法:Tomcat の <Environment> 要素の代わりに web.xml の <env-entry> 要素を使用します。
1.6.2.2. Context Listener コンポーネントをデプロイメント記述子に記述してください
チェック内容:
context.xml ファイル内の <Listener> 要素を定義する箇所を検出します。
メッセージレベル:
エラー
説明:
推奨処置としては、org.apache.catalina.LifecycleListener を使用する Java ファイルを、javax.servlet.ServletContextListener を使用するように変換して、適切な <listener> 要素を web.xml ファイルに追加します。
1.6.2.3. Context Parameter コンポーネントをデプロイメント記述子に記述してください
チェック内容:
context.xml ファイル内の <Parameter> 要素を定義する箇所を検出します。
メッセージレベル:
エラー
説明:
web.xml ファイル内に <Parameter> 要素と同じ情報を定義する <context-param> 要素が存在しているかを確認します。
存在していないまたは情報が異なる場合、作成または更新する必要があります。
修正方法:Tomcat の <Parameter> 要素の代わりに web.xml の <context-param> 要素を使用します。
1.6.2.4. Context Resource コンポーネントをデプロイメント記述子に記述してください
チェック内容:
context.xml ファイル内の <Resource> 要素を定義する箇所を検出します。
メッセージレベル:
エラー
説明:
web.xml ファイル内に <Resource> 要素と同じ情報を定義する <resource-ref> 要素が存在しているかを確認します。
存在していないまたは情報が異なる場合、作成または更新する必要があります。
修正方法:Tomcat の <Resource> 要素の代わりに web.xml の <resource-ref> 要素を使用します。
1.6.2.5. Context ResourceLink コンポーネントをデプロイメント記述子に記述してください
チェック内容:
context.xml ファイル内の <ResourceLink> 要素を定義する箇所を検出します。
メッセージレベル:
エラー
説明:
web.xml ファイル内に <ResourceLink> 要素と同じ情報を定義する <resource-ref> 要素が存在しているかを確認します。
存在していないまたは情報が異なる場合、作成または更新する必要があります。
修正方法:Tomcat の <ResourceLink> 要素の代わりに web.xml の <resource-ref> 要素を使用します。
1.6.2.6. Context Valve コンポーネントを使用しないでください
チェック内容:
context.xml ファイル内の <Valve> 要素を定義する箇所を検出します。
メッセージレベル:
エラー
説明:
Java サーブレット・フィルターを使用すれば、Java EE で Valve コンポーネントの機能を実現できます。
Apache Tomcat の <Valve> コンポーネントの代わりに Java サーブレット・フィルターを使用します。

1.6.3. Apache Tomcat と WebOTX 旧バージョンの共通の非互換項目

1.6.3.1. RequestDispatcher forward 後のレスポンス flush タイミングの変更を確認してください
チェック内容:
javax.servlet.RequestDispatcherクラス の forward メソッドを呼び出す箇所があるか確認します。
メッセージレベル:
警告
説明:
RequestDispatcherクラスの forward メソッドを使用して別のサーブレットに転送した場合に、レスポンスが flush (コミットされてクライアントに返却)されるタイミングが V7以前 と V8以降で異なります。

V7 以前 - forward 先の処理が終了してもレスポンスが flush されません。
V8 以降 - forward 先の処理が終了した時点でレスポンスが flush されます。

V7以前と同じ様に動作させる方法は次の2通りあります。

1) 全てのアプリケーションに適用する場合
システムプロパティで次のオプションを指定
-Dcom.nec.webotx.enterprise.forwardResponseFlush=false

2) 個別のアプリケーションに適用する場合
nec-web.xml で次のプロパティを指定
<nec-web-app>
  ...
   <property name="forwardResponseFlush" value="false"/>
  ...
</nec-web-app>

  true : forward先サーブレットの処理が終了するとflushする(既定値)
  false : forward先サーブレットの処理が終了してもflushしない(V7互換)
1.6.3.2. Servlet のリスナ機能の中でJNDIを使用しないでください
チェック内容:
javax.servlet.ServletContextListener, javax.servlet.ServletContextAttributeListener, javax.servlet.http.HttpSessionActivationListener の実装クラスでjavax.naming.*パッケージを使用している箇所を確認します。
メッセージレベル:
警告
説明:
javax.servlet.ServletContextListener、javax.servlet.ServletContextAttributeListener、javax.servlet.http.HttpSessionActivationListener 内でJNDI(名前環境の lookup 等)を使用すると、例外 が発生する場合があります。
修正方法:JNDI(名前環境の lookup 等)を使用しないようにします。
1.6.3.3. context-root に無効な / を含む値が指定されています
チェック内容:
WebアプリケーションのWEB-INF/nec-web.xml の context-root要素に多階層のコンテキストパスが定義されていないか確認します。
メッセージレベル:
警告
説明:
context-rootが"sample/ap" のように多階層のパス構造になっている場合、一部の機能が使用できません。
使用できない機能は以下の二つです。
  1) セッションレプリケーション
  2) アドバンスドモードにおけるリクエスト振り分け
上記機能を使用する場合は、 <context-root> の値を "sample_ap" のように '/' を含まない形に変更します。

詳細は、 [注意制限事項 > 3. Webコンテナ > 3.1. 注意事項 > 3.1.4. Webアプリケーションの運用/実行 > コンテキストパスに "/" を含む場合の注意事項] を参照してください。
1.6.3.4. resource-ref に対応する WebOTX 固有の配備記述子定義が欠落しています
チェック内容:
web.xml内の <resource-ref> 要素の子要素 <res-ref-name> で定義するリソース参照名が、nec-web.xml の <resource-ref> 要素の子要素 <res-ref-name> で定義されている事を確認します。
メッセージレベル:
警告
説明:
アプリケーションからJDBCデータソースをルックアップする際に、引数として"java:comp/env/"から始まるリソース参照名(環境ネーミングコンテキスト名)を用いている場合、 環境ネーミングコンテキスト名と JDBC データソースの JNDI 名(JNDI物理名) とのマッピングを nec-web.xml に <resource-ref> 要素 として記述する必要があります。
 
web.xml及びnec-web.xmlの定義例:
以下のような定義がweb.xmlにある場合、
...
<resource-ref>
   <res-ref-name>MyResourceRefName</res-ref-name>
  ...
</resource-ref>
 
以下の要素をnec-web.xmlに追加します。
...
<resource-ref>
   <res-ref-name>MyResourceRefName</res-ref-name>
   <jndi-name>MyResourceRefName</jndi-name>
</resource-ref>
1.6.3.5. security-role に対応する WebOTX 固有の配備記述子の定義が欠落しています
チェック内容:
web.xml内の <security-role> 要素の子要素 <role-name> で定義するロール名が、nec-web.xml の <security-role-mapping> 要素の子要素 <role-name> で定義されている事を確認します。
メッセージレベル:
警告
説明:
web.xml及びnec-web.xmlの定義例:
以下のような定義がweb.xmlにある場合、
...
.<security-role>
   <role-name>MyRoleMame</role-name>
</security-role>
 
以下の要素をnec-web.xmlに追加します。
...
<security-role-mapping>
   <role-name>MyRoleMame</role-name>
   <principal-name> ... </principal-name>
   <group-name> ... </group-name>
</security-role-mapping>
...
1.6.3.6. エラーページでは、page ディレクティブが定義されていないことを確認してください
チェック内容:
web.xml の <error-page> 下の <location> 要素でカスタムエラーページとしてJSPが定義されているかを確認します。
メッセージレベル:
警告
説明:
エラーページとしてJSPを定義しており、かつpageディレクティブで contentType や pageEncoding を定義するとエラーページの表示で文字化けする場合があります。
エラーページでは、page ディレクティブを定義しないようにします。
1.6.3.7. コンテキスト・ルックアップが対応する配備記述子エントリーを持つ必要があります
チェック内容:
Webアプリケーションの処理において、javax.naming.InitialContext のlookup() の引数で指定する「リソース参照名」がweb.xmlで定義されている事を確認します。
メッセージレベル:
情報
説明:
lookup メソッドの引数に指定するリソース参照名は、web.xml ファイルで定義する必要があります。
web.xml ファイル内に対応する要素 <resource-ref>、 <resource-env-ref>、 または <env-entry> が存在し、Webアプリケーションのコードで指定しているリソース参照名が定義されている事を確認します。
 
web.xml定義例:
initCtx.lookup("java:comp/env/myInitialParam") ;
を使用する場合、web.xmlに以下のいずれかを定義する必要があります。
<resource-ref>
   <res-ref-name>myInitialParam</res-ref-name>
  ...
</resource-ref>
<resource-env-ref>
   <resource-env-ref-name>myInitialParam</resource-env-ref-name>
  ...
</resource-env-ref>
<env-entry>
   <env-entry-name>myInitialParam</env-entry-name>
  ...
</env-entry>
1.6.3.8. 値が空の無効な load-on-startup が使用されています
チェック内容:
web.xml の <web-app> − <servlet> 要素の子要素として <load-on-startup> 要素を定義している場合、値が定義されているか(空になっていないか)を確認します。
メッセージレベル:
エラー
説明:
Servlet API 2.4 以降に準拠したWebアプリケーションで、空の <load-on-startup> 要素を含むWebアプリケーション(war)は配備できません。
空の <load-on-startup> 要素を削除するか、適切な値を定義します。
1.6.3.9. 機能していない InvokerServlet が使用されています
チェック内容:
web.xml内の <servlet-class> 要素で次のように InvokerServlet が定義している場合、同時に指定が必要なシステムプロパティが定義されている事を確認します。
 
.<servlet>
..<servlet-name>invoker</servlet-name>
..<servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>
メッセージレベル:
警告
説明:
Tomcat 5.5 以前で機能していた InvokerServlet の機能が、セキュリティ上の観点から Tomcat 6.0 以降では、デフォルトで動作しないようになっています。Tomcat7.0 をベースにしている WebOTX V9 およびそれ以降では、この問題が発生します。
 
InvokerServlet を使用する場合は、上記の定義に加えて下記の設定が必要になります。
システムプロパティ
  -Dorg.apache.catalina.servlets.enableInvokerServlet=true
1.6.3.10. security-role の定義が配備記述子から欠落しています
チェック内容:
web.xml内の <security-constraint> − <auth-constraint> 要素の子要素 <role-name> に定義するロール名が、 <security-role> 要素の子要素 <role-name> で定義されている事を確認します。
メッセージレベル:
エラー
説明:
web.xml定義例:
.<security-constraint>
..<auth-constraint>
...<role-name>MyRoleMame</role-name>
 
上記で定義されているロール名を、次の要素でも定義します。
.<security-role>
   <role-name>MyRoleMame</role-name>
</security-role>
1.6.3.11. 無効な初期コンテキスト java:/comp が XML ファイルに使用されています
チェック内容:
XMl ファイル内「java:/comp」で始まる文字列を検出します。
メッセージレベル:
エラー
説明:
WebOTX Application Server 以外のアプリケーションサーバでは、'java:/comp' の使用を許可している場合があります。 WebOTX Application Server では、'java:/comp' の使用を許可していないため、アプリケーション内で 'java:/comp' を使用している場合は 'java:comp' に変更します。
1.6.3.12. 無効な初期コンテキスト java:/comp が使用されています
チェック内容:
ファイル内の「java:/comp」で始まる文字列リテラルを検出します。
メッセージレベル:
エラー
説明:
WebOTX Application Server 以外のアプリケーションサーバでは、'java:/comp' の使用を許可している場合があります。 WebOTX Application Server では、'java:/comp' の使用を許可していないため、アプリケーション内で 'java:/comp' を使用している場合は 'java:comp' に変更します。
1.6.3.13. 他のアプリケーションサーバで定義している固有の MBean を参照してはいけません
チェック内容:
javax.management.ObjectName() のコンストラクタの呼び出し箇所を検出します。
メッセージレベル:
警告
説明:
WebOTX Application Server 以外のアプリケーションサーバによって提供される MBean を参照する場合は、WebOTX Application Server上で提供しているMBeanに変更する必要があります。

1.6.4. Java SE 5 の非互換項目

1.6.4.1. JAXP 1.1 パッケージ名を文字列リテラルで使用しないでください
チェック内容:
以下 JAXP 1.1 パッケージ名の文字列リテラルとして使用する箇所を検出します。
  org.apache.crimson.*
  org.apache.xml.*
  org.apache.xalan.*
  org.apache.xpath.*
  org.apache.xalan.xsltc.*
メッセージレベル:
エラー
説明:
内部 JAXP クラスが変更されましたので、以下のパッケージの内部クラスは使用しません。
  org.apache.crimson.*
  org.apache.xml.*
  org.apache.xalan.*
  org.apache.xpath.*
  org.apache.xalan.xsltc.*
1.6.4.2. JAXP API 使用法の互換性を確認してください
チェック内容:
以下のパッケージを使用する箇所を検出します。
  javax.xml.parsers.*
  javax.xml.transform.*
  org.w3c.dom.*
  org.xml.sax.*
メッセージレベル:
警告
説明:
JRE 1.4.2 で使用した JAXP API を JRE 5 で使用すると、互換性の問題が発生する可能性がありますので、確認が必要です。
確認必要なパッケージは以下のとおりです。
  javax.xml.parsers
  javax.xml.transform
  javax.xml.transform.dom
  javax.xml.transform.sax
  javax.xml.transform.stream
  org.w3c.dom
  org.xml.sax
  org.xml.sax.ext
  org.xml.sax.helpers
1.6.4.3. String 値を派生させる場合は BigDecimal toPlainString メソッドを明示的に使用してください
チェック内容:
以下箇所にBigDecimalクラスが使用される場合を検出します。
  @String's InfixExpression (+操作など)
  AStringBuffer の append() メソッドのパラメーター
  BStringBuilder の append() メソッドのパラメーター
  CString の valueOf() メソッドのパラメーター
  DPrintStreamの print() メソッドのパラメーター
  EPrintStreamの println() メソッドのパラメーター
メッセージレベル:
警告
説明:
BigDecimal の toString() メソッドの振る舞いは、前のバージョンとは異なります。
J2SE 5.0 では、BigDecimal に toPlainString() が追加されました。これは、以前のバージョンの toString() メソッドのように振る舞います。
推奨処置としては、 toString を toPlainString に変更します。
1.6.4.4. sun.* パッケージからの API を使用しないでください
チェック内容:
sun.*パッケージを使用する箇所を検出します。
メッセージレベル:
エラー
説明:
sun.* パッケージの一部の API は JRE 5 で変更され、JRE 1.4.2 との間に互換性の問題があります。
これらの API は、開発者が使用するためのものではありません。
1.6.4.5. 互換性のない BigDecimal クラスの toString メソッドが使用されています
チェック内容:
java.math.BigDecimal の toString() メソッドを呼び出す箇所を検出します。
メッセージレベル:
エラー
説明:
BigDecimal の toString() メソッドの振る舞いは、前のバージョンとは異なります。
J2SE 5.0 では、BigDecimal に toPlainString() が追加されました。これは、以前のバージョンの toString() メソッドのように振る舞います。
推奨処置としては、 toString を toPlainString に変更します。

1.6.5. Java SE 6 の非互換項目

1.6.5.1. Duration と XMLGregorianCalendar equals メソッドの互換性を確認してください
チェック内容:
javax.xml.datatype.Duration の equals() と javax.xml.datatype.XMLGregorianCalendar の equals() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 6 では、equals() の引数に null を渡した場合に false が返るようになりました。 以前は NullPointerException がスローされていました。
アプリケーション・ロジックを調べて、NullPointerException ではなく false が返ることが想定されているか確認してください。
1.6.5.2. EventHandler の呼び出しの例外ロジックを確認してください
チェック内容:
java.beans.EventHandler のコンストラクタまたは create() の呼び出しを検出します。
メッセージレベル:
警告
説明:
Java SE 6 では、EventHandler コンストラクタと create() メソッドのパラメタ target, action, listenerInterface に null を指定した場合は、
コンストラクタや create() メソッドを呼び出したタイミングで IllegalArgumentException または NullPointerException がスローされるようになりました。
以前は、コンストラクタと create() メソッド呼び出しより後に、NullPointerException がスローされていました。
1.6.5.3. FileChannel lock メソッドの OverlappingFileLockException を確認してください
チェック内容:
java.nio.channels.FileChannel の lock() の呼び出しで OverlappingFileLockException に対する catch ブロックがない場合、またはメソッドに OverlappingFileLockException の throws 宣言がない場合を検出します。
メッセージレベル:
警告
説明:
Java SE 5 までは、FileChannel.lock() メソッドが OverlappingFileLockException をスローしませんでしたが、Java SE 6 からは、OverlappingFileLockException をスローするようになりました。
この変更がアプリケーションに影響を及ぼさないか確認してください。
1.6.5.4. JMX ObjectName 要素内のダブルスラッシュを削除してください
チェック内容:
javax.management.ObjectName のコンストラクタ第一引数であるドメイン名に "//" を含む場合を検出します。
メッセージレベル:
警告
説明:
JSR 255 では、javax.management.ObjectName のドメイン部分に「カスケード」の分離文字として「//」を使用する計画があります。 JSR 255 は Java SE 6 の一部ではありませんが、ObjectName のドメイン部分には、今後、互換性の問題が生じないように、「//」を含めないことをお勧めします。ObjectName は、次のような形式になっています。
domain:key1=value1,key2=value2,key3=value3,*
アプリケーションに、「//」を使用したドメイン名を持つ ObjectName の付いた MBean が含まれている場合は、MBean のドメイン名を変更する必要があります。
1.6.5.5. Runtime クラスの exec メソッドの仕様変更による影響を確認してください
チェック内容:
java.lang.Runtime の exec() メソッドのうち第一引数が String のメソッドを呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7u21 以降およびJava SE 6u45 で java.lang.Runtime クラスの以下のメソッドの動作が変更されています。

  exec(String command)
  exec(String command, String[] envp)
  exec(String command, String[] envp, File dir)

変更内容は、コマンドの文字列に空白を含むか、エスケープされたダブル・クオート(\")を含む場合にコマンド起動が失敗する問題を引き起こす可能性があります。

  exec("C:\\Program Files\\bin\\foo.exe bar") ;

コマンド部分をエスケープしたダブルクォーテーションで囲ったとしても、実行に失敗します。

exec("\"C:\\Program Files\\bin\\foo.exe\" bar") ;

修正方法:
第一引数が String 配列のメソッドを使用してください。

  exec(String[] command)
  exec(String[] command, String[] envp)
  exec(String[] command, String[] envp, File dir)

コマンド部分と引数部分を配列の別の要素として呼び出します。

  exec(new String[]{"C:\\Program Files\\bin\\foo.exe", "bar"}) ;

1.6.6. Java SE 7 の非互換項目

1.6.6.1. AWT 例外ハンドラーの振る舞いの変更を確認してください
チェック内容:
"sun.awt.exception.handler" という文字列を使用する箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 では、新規例外処理メカニズムが追加されています。
以前はシステム・プロパティー sun.awt.exception.handler が使用されていた箇所は、Java SE 7 で Thread.UncaughtExceptionHandler クラスを使用するように書き換える必要があります。
1.6.6.2. Character クラスの isLowerCase、isUpperCase メソッドでの振る舞いの変更を確認してください
チェック内容:
java.lang.Character の isLowerCase() 、isLowerCase()、isUpperCase() 、isUpperCase() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
2つのメソッドは、Java SE 7 で指定されたユニコード定義に準拠するように更新されました。以前に true を戻していたこれらのメソッドのインスタンスが現在では、false を戻す可能性があります。またその逆の可能性もあります。
これらのメソッドの振る舞いの変更がアプリケーションに影響がないかをご確認ください。
1.6.6.3. Comparable クラスの compareTo メソッドでの振る舞いの変更を確認してください
チェック内容:
java.lang.Comparable の compareTo() の実装箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 では、配列とコレクションにおいて、既定で使用されるソートアルゴリズム が変更されました。これが影響し、java.lang.Comparable 実装クラスが仕様に 違反している場合、Java SE 7 では、ソートを行った際、java.lang.IllegalArgumentException をスローする場合があります。
例) 仕様に違反している場合の例
  a.compareTo(b) == 1 かつ b.compareTo(a) == 1が成立する場合
  また、次のシステムプロパティを指定すると、Java SE 6 でのソートアルゴリズムが使用されるため、例外が発生しなくなります。ただし compareTo に矛盾があるため、ソートは正しく行なわれません。
  ‐Djava.util.Arrays.useLegacyMergeSort=true
1.6.6.4. DatagramChannel クラスの send、receive、connect メソッドでの振る舞いの変更を確認してください
チェック内容:
java.nio.channels.DatagramChannel の send() , receive() , connect() メソッドを呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
これらのメソッドは、メソッド呼び出し時にチャネルがバインドされていない場合に発生することに関して振る舞いの変更があります。
以前の振る舞いは、sun.nio.ch.bugLevel プロパティーを設定すれば復元できます。 これは、「1.4」、「1.5」、または「1.6」の値に設定できます。
1.6.6.5. File クラスの setReadOnly、setWritable、canWrite メソッドでの振る舞いの変更を確認してください
チェック内容:
java.io.File の setReadOnly() , setWritable() , setWritable() , canWrite() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 では、これらのメソッドに新規の振る舞いが追加されました。
Windows において、setReadOnly と canWrite メソッドはディレクトリーに関してDOSの読み取り専用属性をもう設定しません。Windows 環境でディレクトリーに対してこれらのメソッド呼び出されると、false を戻します。
さらに java.io.File クラスのインスタンスがディレクトリを表す場合、canWrite メソッドは Java SE 6 の場合、常に false を返していましたが、Java SE 7 では、常に true を返すように変更されました。
1.6.6.6. Formatter クラスの format メソッドの書式文字列に "% の s" を使用しないでください
チェック内容:
java.util.Formatter の format() メソッドの第一引数に"%#s"を含む場合、または java.io.PrintStream の printf() メソッドの第一引数に"%#s"を含む場合を検出します。
メッセージレベル:
エラー
説明:
java.io.PrintStream オブジェクトに関するメソッド printf(String, ...) メソッドの第一引数に"%#s"を含む場合に、Java SE 6 では、toString() の結果が出力されていましたが、Java SE 7 では、仕様どおり、java.util.FormatFlagsConversionMismatchException がスローされます。
対処として、String については、"%#s" ではなく、"%s" を使用してください。
1.6.6.7. Locale クラスの getDefault メソッドでの振る舞いの変更を確認してください
チェック内容:
java.util.Locale の getDefault() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
このメソッドには、関連した振る舞いの変更があります。ユーザは、現在では、表示ロケール (たとえばストリングのビジュアル表示) または書式ロケール (たとえばストリングの実際の形式) にアクセスできるようになっています。これを実現するために、Java SE 7 では、次の新規メソッドが追加されました。
  getDefault(Locale.Catgory cat)
この場合、Locale.Category は DISPLAY オプションまたは FORMAT オプションがある新規列挙です。
1.6.6.8. MouseEvent クラスの getButton メソッドでの振る舞いの変更を確認してください
チェック内容:
instances of the java.awt.event.MouseEvent の getButton() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
このメソッドは、Java SE 6 では、マウス・ボタンまたはスクロール・ホイールのアクションを表す [0-3] の範囲の int 値を戻すために使用されました。複数のスクロール・ホイールまたは 4 つ以上のボタンがある新規モデルのマウス・デバイスに合わせるために、Java SE 7 では、このメソッドは、0 からボタンの数までの int 値を戻します。
ユーザは、コードを評価し、振る舞いの変更によって影響を受けるかどうかを判断し、適切なテストを実施した上で、コードに必要な変更を加える必要があります。
また、ユーザはプロパティー sun.awt.enableExtraMouseButtons を false に設定すると、Java SE 6 の古い振る舞いを保存できます。
1.6.6.9. String クラスの intern メソッドでの振る舞いの変更を確認してください
チェック内容:
java.lang.String クラスの intern() 呼び出す箇所を検出します。
メッセージレベル:
情報
説明:
Java SE 6 では、java.lang.String クラスの intern された文字列(文字列リテラル使用時と intern() メソッド呼び出し時に使用されます) は、パーマネント領域に割り当てられていました。Java SE 7 では、通常のヒープ領域に割り当てられるよう変更されました。
このため、Java SE 6 使用時と比較すると、パーマネント領域の使用量は減少しますが、その分通常ヒープ領域の使用量は増加します。
これが影響し、通常ヒープ領域が枯渇し、GC 多発や java.lang.OutOfMemoryError が発生する場合があります。(intern された文字列を多く使うアプリケーションほどメモリ使用量の差が顕著になります。)
対処として、VisualVM などを活用し、ヒープ領域およびパーマネント領域のサイズを調整してください。
1.6.6.10. ThreadGroup クラスの setMaxPriority メソッドでの振る舞いの変更を確認してください
チェック内容:
java.lang.ThreadGroup の setMaxPriority() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
API に関する資料には、「pri 引数が Thread.MIN_PRIORITY より小さいか、Thread.MAX_PRIORITY より大きいと、グループの最大優先順位は未変更のままです。」との記述があります。
Java SE 7 より前では、このメソッドには指定どおりの振る舞いがありませんでした。Java SE 7 での変更は、この指定された振る舞いを実現するためのものです。
1.6.6.11. Toolkit クラスの getPrintJob メソッドでの振る舞いの変更を確認してください
チェック内容:
java.awt.Toolkit の getPrintJob() を呼び出す箇所に、NullPointerException の throws や catch 処理がない場合を検出します。
メッセージレベル:
警告
説明:
Java SE 7 では、このメソッドに新規の振る舞いがあります。以前は、ヘッドレス環境のメソッド getPrintJob は、 HeadlessException をスローしていました。
現在では、このメソッドは正しい NullPointerException をスローします。
1.6.6.12. URLConnection クラスと HttpURLConnection クラスの getInputStream メソッドでの振る舞いの変更を確認してください
チェック内容:
java.net.URLConnection の getInputStream() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 以前では、このメソッドに新規の振る舞いがあります。現在では、getInputStream メソッドは、HTTP 接続で呼び出され、その接続で応答コード -1 が戻された場合、java.io.IOException をスローします。 以前はクライアント側で接続がハングしました。
getResponseCode メソッドからの戻り値をチェックし、新しい接続を開くか、ストリーム上で getErrorStream を呼び出すことで -1 戻り値を処理し、この問題に対処してください。
1.6.6.13. Window クラスの setBackground メソッドでの振る舞いの変更を確認してください
チェック内容:
java.awt.Window の setBackground() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 では、このメソッドに新規の振る舞いがあります。現在では、このメソッドは、UnsupportedOperationException をスローします。
この例外は、透明視覚効果をサポートしないシステムで実行していて、ウィンドウに透明背景色を適用する場合にスローされます。
アプリケーションを Java SE 7 以上でのみ実行する場合、透明背景色の適用前に、コードで新規の GraphicsDevice.isWindowTranslucencySupported メソッドを使用してサポートをチェックすることができます。
あるいは、アプリケーションを Java SE 7 以前のレベルで実行する必要がある場合、ウィンドウの背景を設定中に障害が発生すると、UnsupportedOperationException を処理してリカバリー・アクションをコーディングするように選択することができます。
1.6.6.14. 空の TreeSet クラスの add メソッドおよび TreeMap クラスの put メソッドでの振る舞いの変更を確認してください
チェック内容:
java.util.TreeSet の add() 、java.util.TreeMapの put() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 では、これらのメソッドに新規の振る舞いが追加されました。現在では、上記のメソッドは、挿入されたオブジェクトが null であると、java.lang.NullPointerException をスローします。
Java SE 6 以前の実装では、add() メソッドまたは put() メソッドを使用した最初の挿入では、挿入されたオブジェクトが null であっても、java.lang.NullPointerException がスローされませんでした。

1.6.7. Java SE 8 の非互換項目

1.6.7.1. BigDecimal クラスの stripTrailingZeros メソッドの互換性を確認してください
チェック内容:
java.math.BigDecimal の stripTrailingZeros() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 以前では、計算上0(ゼロ) に等しい値に対して、上記メソッドが呼ばれるとき、その値自体が返却されていました。
Java SE 8 では、定数の BigDecimal.ZERO が返却されるようになりました。
1.6.7.2. Class クラスの getMethod、getMethods メソッドの戻り値の変更を確認してください
チェック内容:
java.lang.Class の getMethod()、getMethods()を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
この返却値に重複した複数のデフォルトメソッドが含まれる場合、Java SE 8u11 以前では、両方返却値に含めていましたが、Java SE 8u20 以降では、メソッド呼び出し順の優先度が高いもののみを返却値に含むように修正されました。
1.6.7.3. Collection クラスの removeAll、retainAll メソッドへの呼び出しの例外ロジックを確認してください
チェック内容:
java.util.Collection の removeAll() と retainAll() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 では、コレクション自体が空の場合には引数にnullが指定されても処理が続行されていましたが、Java SE 8 では、java.lang.NullPointerException がスローされます。
1.6.7.4. DateFormat クラスと SimpleDateFormat クラスの出力形式の変更を確認してください
チェック内容:
java.text.SimpleDateFormat の format() と java.text.DateFormat の format() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 8 では、このメソッドの出力形式が一部変更されました。Java SE 7 以前で、DateFormatSymbols によって返却される月の名前の形式と Java SE 8 で返却される形式は異なります。
日本語や英語や中国語に影響はありませんが、チェコ語、フィンランド語、クロアチア語、ポーランド語などに影響があります。多言語をサポートしていて上記クラスを使用している場合、実行結果に問題がないか確認してください。
1.6.7.5. NumberFormat クラスと DecimalFormat クラスの format メソッドの互換性を確認してください
チェック内容:
java.text.NumberFormat の format() と java.text.DecimalFormat の format() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 8 では、このメソッドの振る舞いが変更されました。これまで誤った値が出力されていた処理について、正しい値が出力されるよう修正されました。
たとえば、double型の“0.8055d”に対して、format メソッドによる丸め処理を実行したとき、Java SE 7 では、0.806 という結果に対し、Java SE 8 では、0.805 という結果になります。
1.6.7.6. Proxy クラスのコンストラクタへの呼び出しの例外ロジックを確認してください
チェック内容:
java.lang.reflect.Proxy クラスおよびそのサブクラスのコンストラクタを呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 では、コンストラクタ java.lang.reflect.Proxy(InvocationHandler h) の呼び出し時に h が null の場合でも例外は発生しませんでしたが、Java SE 8 では、java.lang.NullPointerException がスローされます。
1.6.7.7. String クラスと Pattern クラスの split メソッドの戻り値の変更を確認してください
チェック内容:
以下のメソッドの第一引数が""の場合を検出します:
  java.lang.String の split()
  java.util.regex.Pattern の compile()
メッセージレベル:
警告
説明:
Java SE 8 では、split() の返却値が変更されました。Java SE 7 では、空文字列で分割すると分割結果の先頭に空文字列が生成されていましたが、Java SE 8 からは先頭に空文字列が生成されません。
ソース例:
  String[] ret1="Sapmle".split("") ;
  String[] ret2=Pattern.compile("") .split("Sapmle") ;
Java SE 7 以前の実行結果:
  ret1=[,S,a,m,p,l,e]
  ret2=[,S,a,m,p,l,e]
Java SE 8 の実行結果:
  ret1=[S,a,m,p,l,e]
  ret2=[S,a,m,p,l,e]
1.6.7.8. TypeVariable クラスの getUpperBound メソッドの戻り値の変更を確認してください
チェック内容:
javax.lang.model.type.TypeVariable の getUpperBound() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 8 では、このメソッドの返却値が変更されました。新しく導入された IntersectionType のインスタンスが返されるようになります(元は、DeclaredType のインスタンスが返されました)。
1.6.7.9. javax.xml.stream パッケージの一部クラスの newFactory メソッドの動作変更を確認してください
チェック内容:
javax.xml.stream.XMLEventFactory の newFactory() と javax.xml.stream.XMLOutputFactory の newFactory()、javax.xml.stream.XMLInputFactory の newFactory() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
Java SE 7 では、サービスをインスタンス化する時に、2番目のパラメータ(ClassLoader) が無視されていました。Java SE 8 では、無視されません。
1.6.7.10. 動的プロキシクラスが実装するインタフェースの可視性を確認してください
チェック内容:
java.lang.reflect.Proxy の getProxyClass() を呼び出す箇所を検出します。
メッセージレベル:
警告
説明:
public でないインタフェースを実装する java.lang.reflect.Proxy をスーパークラスとする動的プロキシクラスの可視性が Java SE 7 では、public でしたが、Java SE 8 では、public でなくなります。そのため、Proxy.getProxyClass メソッドと Constructor.newInstance メソッドを使用してプロキシのインスタンスを作成しているとき、「実装するインタフェースが public でない」かつ「呼び出し元が同じパッケージ内に配置されていない」場合にIllegalAccessExceptionで失敗します。
IllegalAccessException が発生した場合、以下のいずれかの回避策で対処できます。
  (1) Constructor.setAccessible メソッド を呼び出し、accessible フラグを true に設定する
  (2) Proxy.newProxyInstance メソッド を使用してインスタンスを生成する

1.6.8. Java SE 9 の非互換項目

1.6.8.1. JDK内部APIを使用しないでください
チェック内容:
以下のパッケージ配下、クラス、メソッドを使用する箇所を検出します。:
com.sun.nio.file.*
sun.misc.Signal
sun.misc.SignalHandler
sun.misc.Unsafe
sun.reflect.ReflectionFactory
sun.reflect.Reflection::getCallerClass(int)
メッセージレベル:
警告
説明:
Java SE 9 では、JDK内部APIの使用が制限されるようになりました。
JDK内部APIの依存性を削除するよう、コードを修正してください。
1.6.8.2. Java SE 9 で廃止されたメカニズムを使用しないでください
チェック内容:
ファイル内に含まれる String 文字列 "java.ext.dirs" あるいは "java.endorsed.dirs" を検出します。
メッセージレベル:
警告
説明:
Java SE 8 以前では、拡張機能メカニズム("java.ext.dirs")、推奨標準優先メカニズム("java.endorsed.dirs")を使用できますが、
Java SE 9 では、廃止されました。これらのメカニズムを使用しないよう修正してください。
1.6.8.3. Java SE 9 で削除されたjarファイルを使用しないでください
チェック内容:
ファイル内に含まれる String 文字列 "rt.jar" あるいは "tools.jar" を検出します。
メッセージレベル:
警告
説明:
Java SE 8 以前では、rt.jarとtools.jarを使用できますが、Java SE 9 では、削除されました。
これらの jar ファイルを参照しないよう修正してください。
1.6.8.4. Java SE 9 で使用するJavaのバージョン表記の互換性を確認してください
チェック内容:
下記を含む String 文字列を検出します。:
java -version
java -showversion
java -fullversion
java.version
java.runtime.version
java.vm.version
java.specification.version
java.vm.specification.version
メッセージレベル:
警告
説明:
Java SE 9 では、Javaのバージョン表記が $MAJOR.$MINOR.$SECURITY に変更されました。
このため、アプリケーションが以下のコマンドあるいはシステムプロパティでJavaのバージョン文字列を取得している場合は、書式の変更による影響が無いかを確認してください。

コマンド:
  java -version
  java -showversion
  java -fullversion

システムプロパティ:
  java.version
  java.runtime.version
  java.vm.version
  java.specification.version
  java.vm.specification.version

また、Java SE 9では、Javaのバージョン情報が取得可能なAPI(java.lang.Runtime.Version)を提供しています。
上記のコマンドやシステムプロパティでJavaのバージョン表記を取得している場合は、本APIへの置換を検討してください。