14

リモートリポジトリからMavenアーティファクトを取得するために使用できるJavaAPIを探しています。私はこれまでEclipseAtherを見つけましたが、私のニーズには複雑に見えるので、もっと単純なものを探しています。

私が必要なのは:

  • リモートMavenリポジトリの場所を指定する必要があります
  • groupId +ArtifactId+バージョンに基づいてアーティファクトをフェッチするのが好きです
  • APIは、アーティファクトの現在のリモートバージョンを提供する必要があります(バージョンに生成された部分があるように定期的にビルドされるSNAPSHOTアーティファクトについて考えてください)
  • アーティファクトの場所を返します。HTTPURLが推奨されます(Apache HTTPクライアントなどを使用して自分でフェッチします)
  • オプションで、要求されたアーティファクトの依存関係であるアーティファクトを取得します。
4

4 に答える 4

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

したがって、入力として提供する必要があるのは次のとおりです。

  • ディレクトリ名としてのローカルリポジトリの場所
  • repoteリポジトリのリスト(MavenProject#getRemoteRepositories()
  • アーティファクトのMaven座標
  • 探すMavenスコープ

見つかったすべての依存関係の絶対パスは、次のように取得できます。Artifact#getPath()

于 2012-05-20T08:01:45.377 に答える
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;
}
于 2013-03-04T17:38:22.847 に答える
0

Apache Ivyを使ってみましたか?Mavenの依存関係のフェッチをサポートします。

このユースケースのドキュメントは少しまばらですが、Ivyのプログラムによる使用に関する情報をここで見つけました。

于 2012-05-10T15:07:25.990 に答える
0

エーテルジェストは、実際にはこれを行うための非常にシンプルでエレガントな方法です。これはMaven3の主要な機能拡張の1つであり、多くの人がそれを探していました。使用する初期コードについては、これを参照してください。アーティファクトの正確なURLを取得する方法を覚えていませんが、他の要件はAFAIRでサポートされています。

于 2012-05-10T15:01:53.737 に答える