以编程方式获取Maven工件

时间:2012-05-10 14:30:21

标签: java api maven dependencies aether

我正在寻找可用于从远程存储库中检索Maven工件的Java API。到目前为止我找到了Eclipse Ather,但它看起来很复杂,因此我需要更简单的东西。

我需要的是:

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

4 个答案:

答案 0 :(得分:10)

jcabi-aether可以帮到你(我是开发人员)。它是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
);

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

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

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

获得

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您是否尝试过使用Apache Ivy?它支持获取maven依赖项。

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