我正在寻找一个Java API,可用于从远程存储库中检索Maven工件。我发现了 Eclipse Ather 到目前为止,它看起来很复杂,因为我的需求,所以我正在寻找更简单的东西。
我需要的是:
- 我必须指定远程Maven存储库的位置
- 我喜欢基于它的groupId + artifactId +版本来获取工件
- API必须提供工件的当前远程版本(考虑定期构建的SNAPSHOT工件,以便它们在其版本中具有生成的部分)
- 返回工件的位置,首选HTTP URL(我将使用例如Apache HTTP Client自己获取它)
- 可选地,检索作为所请求的工件的依赖项的工件。
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
);
因此,您需要提供的所有内容是:
- 本地仓库位置,作为目录名称
- 存储库列表(
MavenProject#getRemoteRepositories()
)
- 神器的Maven坐标
- Maven范围寻找
找到的每个依赖项的绝对路径都可以获得 Artifact#getPath()
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;
}
以太开玩笑实际上是非常简单而优雅的做法。这是Maven 3中的一个主要增强功能,许多人都在寻找它。看着 这个 一些初始代码可以使用。我不记得获取工件的确切URL的方法,但AFAIR支持其他要求。
你尝试过使用过吗? Apache常春藤?它支持获取maven依赖项。
这个用例的文档有点稀疏,但我发现了一些有关Ivy程序化使用的信息 这里。