以编程方式获取 Maven 工件 [已关闭]

2022-09-03 15:24:44

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

我需要的是:

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

答案 1

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()


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

推荐