web-dev-qa-db-ja.com

JARの依存関係をリストする方法

jARで参照されている(サードパーティの)クラスを含むサードパーティの「パッケージ」を一覧表示できるツールはありますか? JARファイル定義から「ホーム」パッケージを認識し、JAR内で参照されたサードパーティクラスまでのサードパーティクラスの完全修飾名のリストを出力するとします。

org.Apache.commons  
org.Apache.maven
javax.servlet.jsp
org.Eclipse.persistence
org.Apache.jackrabbit

その目的は、そのJARファイルのMaven依存関係を見つけて、Mavenアーティファクトとしてデプロイする必要があることです。

49
lisak

JarAnalyzer

jarファイル用の依存関係管理ユーティリティ。主な目的は、ディレクトリを走査し、そのディレクトリ内の各jarファイルを解析し、jarファイル間の依存関係を識別することです。出力は、jarファイル間のPhysicalDependenciesを表すxmlファイルです。

さまざまなデザインパターンを含むPhysicalDependenciesの詳細については、-をご覧ください 拡張可能なJava...

25
MJB

JDK 8以降の新しいツール:jdeps

https://wiki.openjdk.Java.net/display/JDK8/Java+Dependency+Analysis+Tool

jdepsは、開発者がアプリケーションやライブラリの静的な依存関係を理解するために使用するJDK 8以降に追加された新しいコマンドラインツールです。 jdepsは、指定されたクラスファイルの静的分析ツールです。

23
Barry Kelly

以下を実行できます(Mavenプロジェクトの場合)。

mvn dependency:tree

推移的な依存関係も表示されるため、依存関係の競合をデバッグするのに非常に役立ちます。

10

(私が理解したように)mavenを使用する場合、Maven Dependencyプラグインを使用できます。

最初に、すべてのjarを含む基本的なpom.xmlを作成する必要があります。この例をコピーし(例としてhibernateを使用)、jarを置き換えます。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
       <groupId>com.mycompany.app</groupId>
       <artifactId>my-app</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>jar</packaging>
       <name>Maven Quick Start Archetype</name>
       <url>http://maven.Apache.org</url>
       <dependencies>
          <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-core</artifactId>
             <version>3.5.0-Final</version>
          </dependency>
<!-- add here other dependencies -->
       </dependencies>
    </project>

次にターミナルを開き、上記のpom.xmlの含まれるフォルダーに移動して、次のコマンドを実行します。

mvn依存関係:ツリー

これにより、依存関係のリストが出力されます...

または、フォルダーにダウンロードしてコピーする場合は、すべての依存関係で次のコマンドを実行します。

mvn依存関係:コピー依存関係

フォルダー./target/dependenciesにすべての依存関係があります。

3
obe6

Tattleltaleは、これを行うJBossのツールです

tattletale.jboss.org/

3
user2492456

私が最初に考えたのは、クラスローダーを使用してjar内のすべてのクラスファイルを反復処理し、リフレクションを使用して各ファイルの依存関係を分析することでこれを実現できるということでした。ただし、Classクラスには、この情報を伝えるメソッドがありません。したがって、次の考えは、何らかの種類のバイトコードアナライザー( asm など)を使用して、コンパイルクラスからすべての参照クラスを引き出すことです。

この情報を取得できると仮定すると、次の問題は、クラスをjarにバックトレースすることです。ある意味では、これは簡単な部分です。必要なのは、Mavenリポジトリ、ディレクトリ、またはjarがどこにある場合でも、各jarのクラスローダーを作成し、特定のクラスが含まれているかどうかを順番に尋ねるからです。

その考え方の欠点は、Javaクラス(生のソースまたはコンパイル済み)がインポートされたクラスをどこから取得するかを詳細に記述していないことです。あなたが考えるよりも頻繁に)、あなたはどちらを使用するかを言うことができないでしょう。

Javaは、クラスパスで最初に見つかったものが正しいものであると仮定し、間違っていることが判明した場合は例外をスローします(MethodNotFoundException)。各クラスのどのメソッドが呼び出されるかを把握し、それらをクラスパス内のクラスと比較するためのバイトコードを使用すると、依然として正しくなることができません。

要するに、おそらくあなたが望むことを行うことは可能ですが、おそらく非常に難しく、時間がかかるでしょう。

私が通常これに対処する方法は、テストコードでクラスを起動し、興味のあるすべてのメソッドを実行できるようになるまで依存関係を追加し続けることです。

2
drekka

あなたのものがMavenベースのプロジェクトである場合

mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath

以下のリンクをご覧ください http://maven.Apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html

あなたの場合があります

mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath -f pathtopom.xml of third party 
1
srinannapa

これは、このツールの代替手段になる可能性があります。ただし、参照されるクラスはリストしません。最後の番号は「パッケージレベル」を決定します。

jar tvf yourjar.jar | Perl -nle'BEGIN{$depth=(shift)-1}print join(".", (split(/\//, (split)[-1]))[0..$depth])' 3

問題は、この方法では、クラス定義から参照されたクラスを取得することが不可能であることです。そのため、可能な唯一の方法はJavaで行うことです。

質問は:Javaそれを行うことができるツールはありますか?

編集:

必要なものが見つかりました:M2Eclipseにはクラス検索という機能があります

Mavenリポジトリビューで、リポジトリを右クリックして完全なインデックスを有効にします

次に、ナビゲート> Mavenからタイプを開く-そこで、Javaパッケージ規則に基づいて利用可能なすべてのアーティファクトを調べることができます

0
lisak