![](/img/trans.png)
[英]Maven artifact - How to obtain all statistics (Not only download on 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()
檢索的直接依賴項列表。
可以分別在DefaultProxySelector
和DefaultMirrorSelector
的幫助下配置代理和鏡像。 DefaultProxySelector.add
將Proxy
作為參數,可以使用其構造函數創建它的類型(如"http"
),主機,端口和可選的Authentication
(查看AuthenticationBuilder
類以創建身份驗證對象),以及非代理主機列表。 以同樣的方式, DefaultMirrorSelector.add
獲取其id,URL,類型(對於Maven來說是"default"
,但您可以使用P2),無論它是存儲庫管理器,實際存儲庫ID都是鏡像的(根據鏡像)規范 ),以及未鏡像的存儲庫類型。
以下工作流程似乎沒問題:
從Maven central下載pom,將其放在一個單獨的目錄中,並將其命名為pom.xml
。
應用mvn dependency:list -DexcludeTransitive
並獲取控制台輸出。
從控制台輸出中過濾依賴項列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.