2012-05-10 72 views
11

我正在尋找一個可用於從遠程存儲庫中檢索Maven構件的Java API。到目前爲止,我發現Eclipse Ather,但它看起來過於複雜,因此我尋求更簡單的東西。以編程方式獲取Maven構件

我需要的是:

  • 我必須指定遠程Maven倉庫
  • 我想取此基礎上工件的該地點的groupId +的artifactId +版本
  • 的API有提供當前的工件遠程版本(考慮定期構建的SNAPSHOT工件,以便它們在其版本中具有生成的部分)
  • 返回工件的位置,首選HTTP URL(我將在我的工具上獲取它擁有例如Apache HTTP Client)
  • (可選)檢索作爲請求者的依賴項的工件。
+0

這聽起來像你嘗試用以太庫推倒重來獲得。所以我會深入研究Aether lib,並且可能會詢問他們的郵件列表中是否存在使用不同的工件解析器(稍後下載等)的可能性。我懷疑,但只是嘗試。 – khmarbaise

+0

我會試一試。 – NagyI

+2

這裏列出的一些常春藤選項:http://stackoverflow.com/questions/3955209/using-ivy-dependencies-manager-programmatically/3963721#3963721 –

回答

9

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

+0

我接受這個,因爲它看起來像我需要的最接近的東西,似乎易於使用。 – NagyI

+0

感謝您的偉大項目。我發現它在測試Maven插件(嘲笑檢索工件的行爲)方面很有用。 –

+0

隨意在Github上登錄:https://github.com/jcabi/jcabi-aether/stargazers :) – yegor256

0

以太網jest實際上是非常簡單和優雅的方式做到這一點。這是Maven 3的主要增強之一,許多人正在尋找它。請參閱this以瞭解一些最初使用的代碼。我不記得一種方法來獲取工件的確切URL,但其他要求支持AFAIR。

+0

我不喜歡使用Aether這是我必須創建的問題之一一個臨時存儲庫只是爲了獲取一個工件。我不想讓Aether下載文件。我只是想知道哪個是最新版本的神器,它在網絡上的位置。想象一下,我有一個應用程序分發zip文件,它沒有任何獨立的工件,所以它只是孤立的。我可以輕鬆地自行取出,或者在下載時更好地解開它。 – NagyI

+0

@Michal Kalinowski,你給的例子展示瞭如何在maven插件中使用Aether。你知道有哪些文檔展示瞭如何在常規(非插件)Java程序中使用它? – user944849

0

您是否嘗試過使用Apache Ivy?它支持獲取Maven依賴關係。

這個用例的文檔有點稀疏,但是我發現了關於編程使用Ivy here的一些信息。

+0

這不是絕對的程序化。它需要預定義的XML文件來定義依賴關係和其他配置。如果這些是在執行期間動態確定的(從外部源獲取)呢?我不喜歡到處都有臨時文件。 – NagyI

+0

我想你可能需要這些文件來確定遠程回購的位置,但希望你不需要使用配置文件來檢索特定的依賴關係。 Gradle和SBT使用常青藤來獲取依賴關係,我認爲他們沒有xml配置文件。 –

+0

我明白了。然後,我會深入探究常春藤。謝謝! – NagyI

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

你可以建議如何使用更新的Maven和Eclipse Aether進行這項工作嗎? – wilx