2016-09-22 4 views
3

Maven central(または他のNexusリポジトリ)のアーティファクトについては、すべての直接の依存関係のリストを作成したい。Maven Central上のアーティファクトの直接の依存関係をすべて見つけ出す

最初は、pom.xmlを読み込んで、依存関係セクションからすべてのエントリを集めることを考えました。しかし、私はこれらのエントリにはバージョンがない(依存関係管理によって提供される)かもしれない、あるいはエントリが親のポムから来るかもしれないことに気づいた。

私の2番目のアイデアは、ある種の人工Mavenプロジェクトを構築し、mvn dependency:treeで依存関係を集めることでした。これは複雑になるかもしれません。

最も直接的な(信頼できる)方法は何でしょうか?

+0

直接の依存関係のみが必要な理由を説明できますか?ここで何を達成しようとしていますか? – user2189998

+0

推移的な依存関係をスキップするように設定されたuber jarについてはどうですか? –

+0

@ user2189998これは実際には複雑です - 私はMavenの中央ジャーの振る舞いを模倣するいくつかのアーティファクトのためのポムを構築する必要があります。これは奇妙に思えますが(実際はそうですが)、長い議論の末、これがレガシープロジェクトの問題を避ける唯一の方法だと思われます。 –

答えて

4

Mavenプラグインの外では、これをプログラムでAetherを使用して行うことができます。

直接の依存関係や潜在的な再配置のようなアーティファクトに関する情報を取得します。

まず、あなたのPOMにオードの依存関係を追加します。

<dependencies> 
    <dependency> 
     <groupId>org.eclipse.aether</groupId> 
     <artifactId>aether-impl</artifactId> 
     <version>${aetherVersion}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.aether</groupId> 
     <artifactId>aether-connector-basic</artifactId> 
     <version>${aetherVersion}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.aether</groupId> 
     <artifactId>aether-transport-file</artifactId> 
     <version>${aetherVersion}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.aether</groupId> 
     <artifactId>aether-transport-http</artifactId> 
     <version>${aetherVersion}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-aether-provider</artifactId> 
     <version>${mavenVersion}</version> 
    </dependency> 
</dependencies> 
<properties> 
    <aetherVersion>1.1.0</aetherVersion> 
    <mavenVersion>3.3.9</mavenVersion> 
</properties> 

は、次に、あなたが持つことができます。これはオードリポジトリシステムを作成し、読むためにそれを言っている何

public static void main(final String[] args) throws Exception { 
    DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); 
    RepositorySystem system = newRepositorySystem(locator); 
    RepositorySystemSession session = newSession(system); 

    RemoteRepository central = new RemoteRepository.Builder("central", "default", "http://repo1.maven.org/maven2/").build(); 

    Artifact artifact = new DefaultArtifact("groupId:artifactId:version"); 
    ArtifactDescriptorRequest request = new ArtifactDescriptorRequest(artifact, Arrays.asList(central), null); 
    ArtifactDescriptorResult result = system.readArtifactDescriptor(session, request); 

    for (Dependency dependency : result.getDependencies()) { 
     System.out.println(dependency); 
    } 
} 

private static RepositorySystem newRepositorySystem(DefaultServiceLocator locator) { 
    locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); 
    locator.addService(TransporterFactory.class, FileTransporterFactory.class); 
    locator.addService(TransporterFactory.class, HttpTransporterFactory.class); 
    return locator.getService(RepositorySystem.class); 
} 

private static RepositorySystemSession newSession(RepositorySystem system) { 
    DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); 
    LocalRepository localRepo = new LocalRepository("target/local-repo"); 
    session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); 
    // set possible proxies and mirrors 
    session.setProxySelector(new DefaultProxySelector().add(new Proxy(Proxy.TYPE_HTTP, "host", 3625), Arrays.asList("localhost", "127.0.0.1"))); 
    session.setMirrorSelector(new DefaultMirrorSelector().add("my-mirror", "http://mirror", "default", false, "external:*", null)); 
    return session; 
} 

を与えられたアーティファクトのアーティファクト記述子。アーティファクトはコンストラクタnew DefaultArtifact("...")で構築され、必要な座標が与えられます。

要求オブジェクトは、このアーティファクトとそれをフェッチするリポジトリのリストで作成されます。上記のサンプルでは、​​Maven Centralのみが追加されましたが、RemoteRepository.Builderクラスを使用して追加することで、RemoteRepositoryを追加できます。 readArtifactDescriptorを呼び出した後、結果には直接依存関係のリストが含まれます。これはgetDependencies()で取得できます。

プロキシーとミラーは、それぞれDefaultProxySelectorDefaultMirrorSelectorの助けを借りて構成することができます。 DefaultProxySelector.addは、Proxyを引数として取ります。これは、コンストラクタでその型("http"など)、host、port、およびオプションでAuthentication(認証オブジェクトを作成する場合はAuthenticationBuilderクラスを参照してください)のリストと、 -proxiedホスト。同様に、DefaultMirrorSelector.addは、そのID、URL、タイプ(Mavenの場合は"default"ですが、例えばP2を持つことができます)、リポジトリマネージャ、実際のリポジトリID(mirror specificationによる)、リポジトリ・タイプはミラーリングされません。

+0

これは本当に便利で詳細な回答です。それは私に多くの時間を節約しました。 –

0

次のワークフローは大丈夫のようだ:

  1. 、中央Mavenのからポンポンをダウンロードし、それを別のディレクトリに置くとpom.xmlという名前を付けます。

  2. mvn dependency:list -DexcludeTransitiveを適用し、コンソール出力を取得します。

  3. コンソール出力から依存関係のリストをフィルタリングします。

関連する問題