jdeprscan
jdeprscanツールは、非推奨のAPI要素の使用についてjarファイル(またはクラス・ファイルの他の集合)をスキャンする静的分析ツールとして使用します。
形式
jdeprscan [options] {dir|jar|class}-
options -
「jdeprscanコマンドのオプション」を参照してください。
-
dir|jar|class -
jdeprscanコマンドは、非推奨APIの使用について各引数をスキャンします。引数には次のものがあります。-
dir: ディレクトリ -
jar: JARファイル -
class: クラス名またはクラス・ファイル
クラス名では、ドット(
.)をセパレータとして使用する必要があります。たとえば:java.lang.Threadネストされたクラスには、ドル記号
$をセパレータとして使用する必要があります。たとえば:java.lang.Thread$Stateクラス・ファイルも指定できます。たとえば:
build/classes/java/lang/Thread$State.class -
説明
jdeprscanツールは、非推奨のAPI要素の使用についてJARファイルまたはクラス・ファイルの他の集合をスキャンする、JDKで提供される静的分析ツールです。jdeprscanツールで識別されるのは、Java SEで定義した非推奨APIのみです。サード・パーティ・ライブラリで定義した非推奨APIはレポートされません。
JARファイルまたは一連のクラス・ファイルをスキャンするには、まずスキャン対象クラスが依存するクラスがすべてクラス・パスに存在することを確認する必要があります。「jdeprscanコマンドのオプション」の説明に従って--class-pathオプションを使用し、クラス・パスを設定します。通常、アプリケーションを起動する際に使用するのと同じクラス・パスを使用します。
jdeprscanでは、依存するクラスの一部を検出できない場合、欠落しているクラスごとにエラー・メッセージが生成されます。一般に、このようなエラー・メッセージの形式は次のとおりです。
error: cannot find class ... このようなエラーが発生した場合は、依存するクラスがすべて含まれるようにクラス・パスを調整する必要があります。
jdeprscanコマンドのオプション
次のオプションを使用できます。
-
--class-path path -
依存するクラスを解決するための検索パスを指定します。
pathには、システム固有のパス・セパレータで区切られた1つ以上のディレクトリで構成される検索パスを指定できます。たとえば:-
Oracle Solaris、LinuxおよびmacOS:
--class-path /some/directory:/another/different/dir
ノート:
Windowsでは、コロン(
:)のかわりに、セミコロン(;)をセパレータとして使用します。-
Windows:
--class-path \some\directory;\another\different\dir
-
-
--for-removal -
スキャンまたはリストの対象を削除予定の非推奨であるAPIに制限します。リリース値6、7または8と一緒に使用できません。
-
--full-version -
ツールのフル・バージョン文字列を出力します。
-
--helpまたは—h -
ヘルプ・メッセージをフル出力します。
-
--listまたは—l -
一連の非推奨APIを出力します。スキャンは実行されないため、ディレクトリ、jarまたはクラスの引数を指定する必要はありません。
-
--release 6|7|8|9|10|11 -
スキャン対象の一連の非推奨APIを提供しているJava SEリリースを指定します。
-
--verboseまたは—v -
処理中の追加メッセージ出力を有効にします。
-
--version -
簡略化されたツールのバージョン文字列を出力します。
jdeprscanの出力例
このライブラリのJARファイルは、commons-math3-3.6.1.jarのような名前が付けられます。非推奨APIの使用についてこのJARファイルをスキャンするには、次のコマンドを実行します。
jdeprscan commons-math3-3.6.1.jar このコマンドは数行の出力を生成します。たとえば、1行の出力は次のようになります。
class org/apache/commons/math3/util/MathUtils uses deprecated method java/lang/Double::<init>(D)V ノート:
JVMS 4.2.1で説明されているように、スラッシュ区切りのバイナリ名を使用してクラス名を指定します。これは、クラス・ファイルで内部的に使用される形式です。
ここで使用される非推奨APIは、java.lang.Doubleクラスのメソッドです。
非推奨メソッドの名前は<init>で、メソッドが実際にはコンストラクタであることを示す特殊な名前です。もう1つの特殊な名前は<clinit>で、これはクラスのstatic初期化子を示します。
他のメソッドは、メソッド名別にリストされます。メソッド名に続いて、引数リストおよび戻り値の型が出力されます。
(D)Vこれは、1つのdouble値(プリミティブ)を取り、voidを返すことを示します。引数および戻り値の型は暗号化してもかまいません。たとえば、出力の別の行は次のようになります。
class org/apache/commons/math3/util/Precision uses deprecated method java/math/BigDecimal::setScale(II)Ljava/math/BigDecimal;出力のこの行では、非推奨メソッドはクラスjava.math.BigDecimalにあり、メソッドはsetScale()です。この場合、(II)は、2つのint引数を取ることを意味します。カッコの後のLjava/math/BigDecimal;は、java.math.BigDecimalへの参照を返すことを示します。
バージョン固有にできるjdeprscanによる分析
過去3つのJDKリリースと関してjdeprscanを使用できます。たとえば、JDK 9を実行している場合は、JDK 8、7および6をチェックできます。
public class Deprecations {
SecurityManager sm = new RMISecurityManager(); // deprecated in 8
Boolean b2 = new Boolean(true); // deprecated in 9
}完全なクラスは、JDK 7では警告なしにコンパイルします。JDK 9のシステムでjdeprscanを実行すると、次のように表示されます。
$ jdeprscan --class-path classes --release 7 example.Deprecations
(no output) jdeprscanを実行します。$ jdeprscan --class-path classes --release 8 example.Deprecations
class example/Deprecations uses type java/rmi/RMISecurityManager deprecated
class example/Deprecations uses method in type java/rmi/RMISecurityManager deprecatedjdeprscanを実行します。$ jdeprscan --class-path classes example.Deprecations
class example/Deprecations uses type java/rmi/RMISecurityManager deprecated
class example/Deprecations uses method in type java/rmi/RMISecurityManager deprecated
class example/Deprecations uses method java/lang/Boolean <init> (Z)V deprecated