Jdeprscan - 已弃用 API 元素扫描器
介绍 jdeprscan
jdeprscan - 静态分析工具,用于扫描 jar 文件(或其他类文件集合)以查找已弃用 API 元素的使用情况
概要
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
工具是 JDK 提供的静态分析工具,用于扫描 JAR 文件或其他类文件集合以查找已弃用 API 元素的使用情况。jdeprscan
工具仅识别 Java SE 定义的已弃用 API。第三方库定义的已弃用 API 不会被报告。
要扫描 JAR 文件或一组类文件,您必须首先确保扫描的类所依赖的所有类都存在于类路径中。使用 --class-path
选项设置类路径,如 jdeprscan
命令的选项中所述。通常,您会使用与调用应用程序时相同的类路径。
如果 jdeprscan
找不到所有依赖类,它将为每个缺少的类生成一条错误消息。这些错误消息通常采用以下形式
error: cannot find class ...
选项
提供以下选项
--class-path path
提供一个搜索路径来解析依赖类。
path 可以是一个搜索路径,该路径由一个或多个用系统特定路径分隔符分隔的目录组成。例如
Linux 和 macOS
--class-path /some/directory:/another/different/dir
Windows
--class-path \some\directory;\another\different\dir
--for-removal
将扫描或列出限制为已弃用以供移除的 API。不能与版本值为 6、7 或 8 一起使用。
--full-version
打印出工具的完整版本字符串。
--help
或 —h
打印出完整的帮助消息。
--list
或 —l
打印已弃用 API 的集合。不会进行扫描,因此不应提供任何目录、jar 或类参数。
--release 15|16
指定提供用于扫描的已弃用 API 集的 Java SE 版本。
--verbose
或 —v
在处理过程中启用其他消息输出。
--version
打印出工具的缩写版本字符串。
示例
此库的 JAR 文件将被命名为类似于 commons-math3-3.6.1.jar
的名称。要扫描此 JAR 文件以查找已弃用 API 的使用情况,请运行以下命令
jdeprscan commons-math3-3.6.1.jar
此命令会产生几行输出。例如,一行输出可能是
class org/apache/commons/math3/util/MathUtils uses deprecated method java/lang/Double::<init>(D)V
它使用的已弃用 API 是 java.lang.Double
类上的方法。
已弃用方法的名称是 <init>
,这是一个特殊名称,表示该方法实际上是一个构造函数。另一个特殊名称是 <clinit>
,它表示一个类静态初始化器。
其他方法仅按其方法名称列出。在方法名称之后是参数列表和返回类型
(D)V
这表明它只接受一个双精度值(一个基本类型)并返回 void。参数和返回类型可能会变得难以理解。例如,另一行输出可能是
class org/apache/commons/math3/util/Precision uses deprecated method java/math/BigDecimal::setScale(II)Ljava/math/BigDecimal;
在这行输出中,已弃用方法位于 java.math.BigDecimal
类上,该方法是 setScale()
。在这种情况下,II
表示它接受两个 int 参数。括号后的 Ljava/math/BigDecimal;
表示它返回对 java.math.BigDecimal
的引用。
您可以相对于前三个 JDK 版本使用 jdeprscan
。例如,如果您正在运行 JDK 16,那么您可以针对所有早期的 JDK 进行检查。
例如,请查看此代码片段
public class Deprecations {
SecurityManager sm = new RMISecurityManager(); // deprecated in 8
Boolean b2 = new Boolean(true); // deprecated in 9
}
在 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
上次更新: 2021 年 9 月 14 日