簡體   English   中英

在Maven Central上查找工件的所有直接依賴項

[英]Find all direct dependencies of an artifact on Maven Central

對於Maven中心(或任何其他給定的Nexus存儲庫)上的工件,我想列出所有直接依賴項。

起初,我考慮過只讀取pom.xml並從依賴項部分收集所有條目。 但我注意到這些條目可能沒有版本(由依賴關系管理提供),或者條目可能來自父poms。

我的第二個想法是構建某種人工Maven項目並使用mvn dependency:tree收集mvn dependency:tree 這可能會變得復雜。

什么是最直接(但也可靠)的方式?

在Maven插件之外,您可以使用Aether以編程方式執行此操作。 有一個方法readArtifactDescriptor正是這樣做的:

獲取有關工件的信息,例如其直接依賴關系和潛在的重定位。

首先,將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;
}

這樣做是創建一個Aether存儲庫系統並告訴它讀取給定工件的工件描述符。 使用構造函數new DefaultArtifact("...")構造工件,為其提供所需的坐標。

使用此工件和要從中獲取它的存儲庫列表創建請求對象。 在上面的示例中,只添加了Maven Central,但您可以通過使用RemoteRepository.Builder類創建它們來添加更多RemoteRepository 在調用readArtifactDescriptor ,結果包含可以使用getDependencies()檢索的直接依賴項列表。

可以分別在DefaultProxySelectorDefaultMirrorSelector的幫助下配置代理和鏡像。 DefaultProxySelector.addProxy作為參數,可以使用其構造函數創建它的類型(如"http" ),主機,端口和可選的Authentication (查看AuthenticationBuilder類以創建身份驗證對象),以及非代理主機列表。 以同樣的方式, DefaultMirrorSelector.add獲取其id,URL,類型(對於Maven來說是"default" ,但您可以使用P2),無論它是存儲庫管理器,實際存儲庫ID都是鏡像的(根據鏡像)規范 ),以及未鏡像的存儲庫類型。

以下工作流程似乎沒問題:

  1. 從Maven central下載pom,將其放在一個單獨的目錄中,並將其命名為pom.xml

  2. 應用mvn dependency:list -DexcludeTransitive並獲取控制台輸出。

  3. 從控制台輸出中過濾依賴項列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM