名前
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
ツールは、JARファイルまたは非推奨のAPI要素を使用するためのクラス・ファイルのその他の集計をスキャンするJDKによって提供される静的分析ツールです。 jdeprscan
ツールで識別される非推奨APIは、Java SEで定義されているAPIのみです。 サード・パーティ・ライブラリで定義した非推奨APIはレポートされません。
JARファイルまたはクラス・ファイルのセットをスキャンするには、まず、スキャンされたクラスが依存するすべてのクラスがクラスパスに存在することを確認する必要があります。 「jdeprscanコマンドのオプション」で説明されている--class-path
オプションを使用して、クラスパスを設定します。 通常、アプリケーションを起動する際に使用するのと同じクラス・パスを使用します。
jdeprscan
によってすべての依存クラスが見つからない場合は、欠落している各クラスに対してエラー・メッセージが生成されます。 これらのエラー・メッセージは、通常、次の形式です:
error: cannot find class ...
このようなエラーが発生した場合は、依存するクラスがすべて含まれるようにクラス・パスを調整する必要があります。
jdeprscanコマンドのオプション
次のオプションを使用できます。
--class-path
path-
依存するクラスを解決するための検索パスを指定します。
pathには、システム固有のパス・セパレータで区切られた1つ以上のディレクトリで構成される検索パスを指定できます。 たとえば:
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
- スキャン用に推奨されなくなった一連の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>
です。これは、メソッドが実際にコンストラクタであることを意味する特別な名前です。 別の特殊な名前は<clinit>
で、クラスの静的イニシャライザを示します。
他のメソッドは、メソッド名別にリストされます。 メソッド名の後には、引数リストと戻り値の型があります:
(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
をリリース値8で実行します:
$ 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 deprecated
JDK 9でjdeprscan
を実行します:
$ 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