取Maven构件编程[关闭](Fetching Maven artifacts programmat

2019-06-24 08:01发布

我在寻找可用于从远程仓库retreive Maven工件的Java API。 我发现Eclipse的粥 ,但迄今为止它看起来过于复杂满足我的需求,所以我正在寻找一些更简单。

我需要的是:

  • 我必须指定远程Maven仓库的位置
  • 我想获取基于它的神器是的groupId +的artifactId +版本
  • 该API必须提供的神器当前的远程版本(想想这是定期构建,使他们在他们的版本生成的部分快照文物)
  • 返回神器的位置,一个HTTP URL是首选(我会在自己与如拿去。Apache的HTTP客户端)
  • 可选retreive神器的这是一个要求的家属。

Answer 1:

jcabi-以太网可以帮助你(我是一个开发者)。 这是围绕以太一个简单的包装,让你找到一个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()



Answer 2:

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


Answer 3:

奥德开玩笑其实很简单,优雅的这样做的方式。 这是一个在Maven的3个主要的改进和许多一直在寻找它的一个。 看看这一段初始代码的工作。 我不记得一个方法来获得神器的真实地址,但其他要求支持AFAIR。



Answer 4:

你是否尝试过使用Apache的常青藤 ? 它支持抓取Maven依赖。

这个用例的文档是有点稀疏,但我发现在程序中使用常春藤的一些信息在这里 。



文章来源: Fetching Maven artifacts programmatically [closed]