概述

在本文中,我们将学习如何查找包含特定类的所有jar文件。我们将通过两种不同的方法来演示:命令行方式和程序方式。

2. 命令行方式

在这个方法中,我们将使用shell命令来识别本地Maven仓库中包含ObjectMapper类的所有jar文件。首先,我们编写一个脚本来在jar文件中查找该类。脚本使用jargrep命令打印出相应的jar文件:

jar -tf $1 | grep $2 && echo "Found in : $1"

其中$1是jar文件路径,$2是类名。在这种情况下,类名始终为com.fasterxml.jackson.databind.ObjectMapper。将上述命令保存在bash文件findJar.sh中。然后,在本地Maven仓库上运行以下find命令,配合findJar.sh以获取结果jar文件:

$ find ~/.m2/repository -type f -name '*.jar' -exec ./findJar.sh {} com.fasterxml.jackson.databind.ObjectMapper \;
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$1.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$2.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$3.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$DefaultTypeResolverBuilder.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper$DefaultTyping.class
com/spotify/docker/client/shaded/com/fasterxml/jackson/databind/ObjectMapper.class
Found in : <strong>/home/user/.m2/repository/com/spotify/docker-client/8.16.0/docker-client-8.16.0-shaded.jar</strong>
com/fasterxml/jackson/databind/ObjectMapper$1.class
com/fasterxml/jackson/databind/ObjectMapper$2.class
com/fasterxml/jackson/databind/ObjectMapper$3.class
com/fasterxml/jackson/databind/ObjectMapper$DefaultTypeResolverBuilder.class
com/fasterxml/jackson/databind/ObjectMapper$DefaultTyping.class
com/fasterxml/jackson/databind/ObjectMapper.class
Found in : <strong>/home/user/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.12.3/jackson-databind-2.12.3.jar</strong>

3. 程序方式

在基于程序的方法中,我们将编写一个Java类来查找classpath中的ObjectMapper类。我们可以按照下面的程序显示jar文件:

public class App { 
    public static void main(String[] args) { 
        Class klass = ObjectMapper.class; 
        URL path = klass.getProtectionDomain().getCodeSource().getLocation(); 
        System.out.println(path); 
    } 
}

输出:

file:/Users/home/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.12.3/jackson-databind-2.12.3.jar

在这里,每个Class类都有getProtectionDomain().getCodeSource().getLocation()方法,它提供了所需类存在的jar文件位置。因此,我们可以使用它来获取包含该类的jar文件。

4. 总结

在本文中,我们学习了从jar列表中查找类的命令行和编程方法。

首先,我们以一个示例开始。然后,我们探索了一种命令行方法,用于从本地Maven仓库中识别给定类。接着,在第二种方法中,我们学会了编写程序来从classpath中找到用于实例化类的jar文件。

这两种方法都很有效,但它们各自适用于不同的场景。