以编程方式获取Maven工件
我正在寻找一个Java API,可用于从远程存储库中检索Maven工件。 到目前为止,我已经找到了Eclipse Ather ,但它看起来因为我的需求而变得复杂,所以我正在寻找更简单的东西。
我需要的是:
- 我必须指定远程Maven存储库的位置
- 我喜欢基于它的groupId + artifactId +版本来获取工件
- API必须提供工件的当前远程版本(考虑定期构建的SNAPSHOT工件,以便它们在其版本中具有生成的部分)
- 返回工件的位置,首选HTTP URL(我将使用例如Apache HTTP Client自己获取它)
- 可选地,检索作为所请求的工件的依赖项的工件。
jcabi-aether可以帮助你(我是开发人员)。 它是Aether的简单包装器,可以让您找到Maven工件的所有传递依赖项:
File repo = this.session.getLocalRepository().getBasedir(); Collection 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 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 artifacts = new ArrayList (); 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中的一个主要增强function,许多人都在寻找它。 看看这个可以使用的初始代码。 我不记得获取工件的确切URL的方法,但AFAIR支持其他要求。
你尝试过使用Apache Ivy吗? 它支持获取maven依赖项。
这个用例的文档有点稀疏,但我在这里找到了有关Ivy程序化使用的一些信息。
- Java:如何将UTC时间戳转换为本地时间?
- 是否存在不允许空值的基本Java Set实现?
- 什么是Java Data Mining,JDM?
- Java USB库
- 通过Java发送电子邮件 – javax.mail.MessagingException:无法连接到SMTP主机:localhost,port:587;
- 使用Java API从Hive获取表属性
- 在org.apache.catalina.core.JreMemoryLeakPreventionListener中急切调用URLConnection的setDefaultUseCaches(false)的原因是什么
- javax.ws.rs.core.Cookie vs javax.ws.rs.core.NewCookie,有什么区别?
- REST API URL中的额外查询参数