2012-05-10 132 views
11

我正在寻找一个可用于从远程存储库中检索Maven构件的Java API。到目前为止,我发现Eclipse Ather,但它看起来过于复杂,因此我寻求更简单的东西。以编程方式获取Maven构件

我需要的是:

  • 我必须指定远程Maven仓库
  • 我想取此基础上工件的该地点的groupId +的artifactId +版本
  • 的API有提供当前的工件远程版本(考虑定期构建的SNAPSHOT工件,以便它们在其版本中具有生成的部分)
  • 返回工件的位置,首选HTTP URL(我将在我的工具上获取它拥有例如Apache HTTP Client)
  • (可选)检索作为请求者的依赖项的工件。
+0

这听起来像你尝试用以太库推倒重来获得。所以我会深入研究Aether lib,并且可能会询问他们的邮件列表中是否存在使用不同的工件解析器(稍后下载等)的可能性。我怀疑,但只是尝试。 – khmarbaise

+0

我会试一试。 – NagyI

+2

这里列出的一些常春藤选项:http://stackoverflow.com/questions/3955209/using-ivy-dependencies-manager-programmatically/3963721#3963721 –

回答

9

jcabi-aether可能会帮助你(我是开发者)。这是围绕以太一个简单的包装,让你找到一个Maven构件的所有传递依赖:

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

因此,你需要提供作为输入的是:

  • 本地仓库的位置,作为目录名
  • repote库(MavenProject#getRemoteRepositories()
  • 神器
  • Maven的坐标
  • Maven的范围的名单来寻找
  • 发现每一个依赖

绝对路径可以作为Artifact#getPath()

+0

我接受这个,因为它看起来像我需要的最接近的东西,似乎易于使用。 – NagyI

+0

感谢您的伟大项目。我发现它在测试Maven插件(嘲笑检索工件的行为)方面很有用。 –

+0

随意在Github上登录:https://github.com/jcabi/jcabi-aether/stargazers :) – yegor256

0

以太网jest实际上是非常简单和优雅的方式做到这一点。这是Maven 3的主要增强之一,许多人正在寻找它。请参阅this以了解一些最初使用的代码。我不记得一种方法来获取工件的确切URL,但其他要求支持AFAIR。

+0

我不喜欢使用Aether这是我必须创建的问题之一一个临时存储库只是为了获取一个工件。我不想让Aether下载文件。我只是想知道哪个是最新版本的神器,它在网络上的位置。想象一下,我有一个应用程序分发zip文件,它没有任何独立的工件,所以它只是孤立的。我可以轻松地自行取出,或者在下载时更好地解开它。 – NagyI

+0

@Michal Kalinowski,你给的例子展示了如何在maven插件中使用Aether。你知道有哪些文档展示了如何在常规(非插件)Java程序中使用它? – user944849

0

您是否尝试过使用Apache Ivy?它支持获取Maven依赖关系。

这个用例的文档有点稀疏,但是我发现了关于编程使用Ivy here的一些信息。

+0

这不是绝对的程序化。它需要预定义的XML文件来定义依赖关系和其他配置。如果这些是在执行期间动态确定的(从外部源获取)呢?我不喜欢到处都有临时文件。 – NagyI

+0

我想你可能需要这些文件来确定远程回购的位置,但希望你不需要使用配置文件来检索特定的依赖关系。 Gradle和SBT使用常青藤来获取依赖关系,我认为他们没有xml配置文件。 –

+0

我明白了。然后,我会深入探究常春藤。谢谢! – NagyI

1
public List<Artifact> 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<Artifact> artifacts = new ArrayList<Artifact>(); 

    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; 
} 
+0

你可以建议如何使用更新的Maven和Eclipse Aether进行这项工作吗? – wilx