以编程方式获取Maven工件

我正在寻找一个Java API,可用于从远程存储库中检索Maven工件。 到目前为止,我已经找到了Eclipse Ather ,但它看起来因为我的需求而变得复杂,所以我正在寻找更简单的东西。

我需要的是:

  • 我必须指定远程Maven存储库的位置
  • 我喜欢基于它的groupId + artifactId +版本来获取工件
  • API必须提供工件的当前远程版本(考虑定期构建的SNAPSHOT工件,以便它们在其版本中具有生成的部分)
  • 返回工件的位置,首选HTTP URL(我将使用例如Apache HTTP Client自己获取它)
  • 可选地,检索作为所请求的工件的依赖项的工件。

jcabi-aether可以帮助你(我是开发人员)。 它是Aether的简单包装器,可以让您找到Maven工件的所有传递依赖项:

File repo = this.session.getLocalRepository().getBasedir(); Collection deps = new Aether(this.getProject(), repo).resolve( new DefaultArtifact("junit", "junit-dep", "", "jar", "4.10"), JavaScopes.RUNTIME ); 

因此,您需要提供的所有内容是:

  • 本地仓库位置,作为目录名称
  • 存储库列表( MavenProject#getRemoteRepositories()
  • 神器的Maven坐标
  • Maven范围寻找

找到的每个依赖项的绝对路径都可以作为Artifact#getPath()

  public List findDependencies(Artifact artifact) throws DependencyCollectionException { CollectRequest collectRequest = new CollectRequest(); collectRequest.setRoot( new Dependency(artifact, "" ) ); collectRequest.addRepository(repository); final MavenServiceLocator locator = new MavenServiceLocator(); locator.addService( RepositoryConnectorFactory.class, FileRepositoryConnectorFactory.class ); locator.addService( RepositoryConnectorFactory.class, WagonRepositoryConnectorFactory.class ); locator.setServices( WagonProvider.class, new WagonProvider() { public Wagon lookup(String roleHint) throws Exception { if (Arrays.asList("http", "https").contains(roleHint)) { return new LightweightHttpWagon(); } return null; } public void release(Wagon wagon) { } }); final RepositorySystem system = locator.getService(RepositorySystem.class); MavenRepositorySystemSession session = new MavenRepositorySystemSession(); session.setLocalRepositoryManager( system.newLocalRepositoryManager(localRepository) ); session.setTransferListener( new LoggingTransferListener() ); session.setRepositoryListener( new LoggingRepositoryListener() ); final List artifacts = new ArrayList(); system.collectDependencies(session, collectRequest).getRoot().accept( new DependencyVisitor() { public boolean visitEnter(DependencyNode dependencyNode) { artifacts.add(dependencyNode.getDependency().getArtifact()); return true; } public boolean visitLeave(DependencyNode dependencyNode) { return true; } }); return artifacts; } 

以太开玩笑实际上是非常简单而优雅的做法。 这是Maven 3中的一个主要增强function,许多人都在寻找它。 看看这个可以使用的初始代码。 我不记得获取工件的确切URL的方法,但AFAIR支持其他要求。

你尝试过使用Apache Ivy吗? 它支持获取maven依赖项。

这个用例的文档有点稀疏,但我在这里找到了有关Ivy程序化使用的一些信息。