1. 序章

この記事では、特定のクラスを含むすべてのjarファイルを見つける方法を学びます。 コマンドベースとプログラムベースの2つの異なるアプローチを使用してこれを示します。

2. コマンドベース

このアプローチでは、shellコマンドを使用して、ObjectMapperクラスを持つローカルMavenリポジトリ内のすべてのjarを識別します。 jar内のクラスを識別するスクリプトを作成することから始めましょう。 スクリプトは、jarおよびgrepコマンドを使用して、適切な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クラスを記述して、javaクラスパスで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リポジトリから特定のクラスを識別しました。 次に、2番目のアプローチでは、クラスパスから実行時に使用されるjarを検索して、クラスをインスタンス化するプログラムを作成する方法を学びました。

どちらの方法も効果的ですが、独自のユースケースがあります。