aether api实现从指定maven仓库下载jar包




最近公司做项目遇到一个需求,通过用户提供的groupId和artifactId以及version到指定maven库中下载jar包。平时的maven项目中,依赖的jar包都是通过pom文件设置,然后maven通过<dependency></dependency>去下载jar包,现在要做的就是maven下载的这一功能。

通过上网去查阅,知道了可以在命令行利用mvn dependency:copy -Dartifact=groupId:artifactId:version -DoutputDirectory=? -Dmdep.stripVerison=true的命令下载到本地仓库。但是有一个问题,利用mvn可能涉及到maven环境的问题,这样程序移植的时候会有很多问题。最好是由一个api借口,以jar包的形式引入,完全脱离本地的maven环境。

这个问题在网上搜索了好久,终于利用google找到了答案。它就是Aether。官方网址是http://wiki.eclipse.org/Aether     上面有相关的说明和API 文档。下面就来说一说具体的实现流程。

依据官方文档,首先应引入jar包,创建一个maven项目,在pom文件中添加如下依赖:


  
  
  1. <properties>
  2. <aetherVersion>1.0.0.v20140518 </aetherVersion>
  3. <mavenVersion>3.1.0 </mavenVersion>
  4. <wagonVersion>1.0 </wagonVersion>
  5. </properties>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.eclipse.aether </groupId>
  9. <artifactId>aether-api </artifactId>
  10. <version>${aetherVersion}<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.eclipse.aether<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>aether-util<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>${aetherVersion} </version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.eclipse.aether </groupId>
  14. <artifactId>aether-impl </artifactId>
  15. <version>${aetherVersion}<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.eclipse.aether<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>aether-connector-basic<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>${aetherVersion} </version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.eclipse.aether </groupId>
  19. <artifactId>aether-transport-file </artifactId>
  20. <version>${aetherVersion}<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.eclipse.aether<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>aether-transport-http<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>${aetherVersion} </version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.eclipse.aether </groupId>
  24. <artifactId>aether-transport-wagon </artifactId>
  25. <version>${aetherVersion}<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.apache.maven<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>maven-aether-provider<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>${mavenVersion} </version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.apache.maven.wagon </groupId>
  29. <artifactId>wagon-ssh </artifactId>
  30. <version>${wagonVersion} </version>
  31. </dependency>
  32. </dependencies>


然后建立RepositorySystem,这个是用来操作maven仓库的主要接口:


  
  
  1. /**
  2. * 建立RepositorySystem
  3. * @return RepositorySystem
  4. */
  5. private static RepositorySystem newRepositorySystem()
  6. {
  7. DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
  8. locator.addService( RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class );
  9. locator.addService( TransporterFactory.class, FileTransporterFactory.class );
  10. locator.addService( TransporterFactory.class, HttpTransporterFactory.class );
  11. return locator.getService( RepositorySystem.class );
  12. }
然后建立RepositorySystemSession对象:


  
  
  1. /**
  2. * create a repository system session
  3. * @param system RepositorySystem
  4. * @return RepositorySystemSession
  5. */
  6. private static RepositorySystemSession newSession( RepositorySystem system,String target )
  7. {
  8. DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
  9. LocalRepository localRepo = new LocalRepository( /*"target/local-repo" */target);
  10. session.setLocalRepositoryManager( system.newLocalRepositoryManager( session, localRepo ) );
  11. return session;
  12. }

接下来实现的是从指定maven仓库下载指定的jar包:

  
  
  1. /**
  2. * 从指定maven地址下载指定jar包
  3. * @param artifact maven-jar包的三围定位(groupId:artifactId:version)
  4. * @param repositoryURL maven库的URL地址
  5. * @param username 若需要权限,则需使用此参数添加用户名,否则设为null
  6. * @param password 同上
  7. * @throws ArtifactResolutionException
  8. */
  9. public static void DownLoad(Params params) throws ArtifactResolutionException
  10. {
  11. String groupId=params.getGroupId();
  12. String artifactId=params.getArtifactId();
  13. String version=params.getVersion();
  14. String repositoryUrl=params.getRepository();
  15. String target=params.getTarget();
  16. String username=params.getUsername();
  17. String password=params.getPassword();
  18. RepositorySystem repoSystem = newRepositorySystem();
  19. RepositorySystemSession session = newSession( repoSystem ,target);
  20. RemoteRepository central= null;
  21. if(username== null&&password== null)
  22. {
  23. central = new RemoteRepository.Builder( "central", "default", repositoryUrl ).build();
  24. } else{
  25. Authentication authentication= new AuthenticationBuilder().addUsername(username).addPassword(password).build();
  26. central = new RemoteRepository.Builder( "central", "default", repositoryUrl ).setAuthentication(authentication).build();
  27. }
  28. /**
  29. * 下载一个jar包
  30. */
  31. Artifact artifact= new DefaultArtifact(groupId+ ":"+artifactId+ ":"+version);
  32. ArtifactRequest artifactRequest= new ArtifactRequest();
  33. artifactRequest.addRepository(central);
  34. artifactRequest.setArtifact(artifact);
  35. repoSystem.resolveArtifact(session, artifactRequest);
  36. System.out.println( "success");
  37. /**
  38. * 下载该jar包及其所有依赖jar包
  39. */
  40. /*
  41. *
  42. Dependency dependency =
  43. new Dependency( new DefaultArtifact( artifact ),null);
  44. CollectRequest collectRequest = new CollectRequest();
  45. collectRequest.setRoot( dependency );
  46. collectRequest.addRepository( central );
  47. DependencyNode node = repoSystem.collectDependencies( session, collectRequest ).getRoot();
  48. DependencyRequest dependencyRequest = new DependencyRequest();
  49. dependencyRequest.setRoot( node );
  50. repoSystem.resolveDependencies( session, dependencyRequest );
  51. PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
  52. node.accept( nlg );
  53. System.out.println( nlg.getClassPath() );*/
  54. }
  55. }

其中Params对象是相关的一些参数,包括groupId,artifactId,version,远程maven仓库的URL地址repository,下载后存放的路径target,访问maven仓库的username和password:


  
  
  1. public class Params {
  2. /**
  3. * jar包在maven仓库中的groupId
  4. */
  5. private String groupId;
  6. /**
  7. * jar包在maven仓库中的artifactId
  8. */
  9. private String artifactId;
  10. /**
  11. * jar包在maven仓库中的version
  12. */
  13. private String version;
  14. /**
  15. * 远程maven仓库的URL地址,默认使用bw30的远程maven-public库
  16. */
  17. private String repository= "http://ae.mvn.bw30.com/repository/maven-public/";
  18. /**
  19. * 下载的jar包存放的目标地址,默认为./target/repo
  20. */
  21. private String target= "temp";
  22. /**
  23. * 登录远程maven仓库的用户名,若远程仓库不需要权限,设为null,默认为null
  24. */
  25. private String username= null;
  26. /**
  27. * 登录远程maven仓库的密码,若远程仓库不需要权限,设为null,默认为null
  28. */
  29. private String password= null;
  30. public Params() {
  31. super();
  32. }
  33. public Params(String groupId, String artifactId) {
  34. super();
  35. this.groupId = groupId;
  36. this.artifactId = artifactId;
  37. }
  38. public Params(String groupId, String artifactId, String username,
  39. String password) {
  40. super();
  41. this.groupId = groupId;
  42. this.artifactId = artifactId;
  43. this.username = username;
  44. this.password = password;
  45. }
  46. public Params(String groupId, String artifactId, String version,
  47. String repository, /*String target,*/ String username, String password) {
  48. super();
  49. this.groupId = groupId;
  50. this.artifactId = artifactId;
  51. this.version = version;
  52. this.repository = repository;
  53. /*this.target = target;*/
  54. this.username = username;
  55. this.password = password;
  56. }
  57. public Params(String groupId, String artifactId, String version,
  58. String username, String password) {
  59. super();
  60. this.groupId = groupId;
  61. this.artifactId = artifactId;
  62. this.version = version;
  63. this.username = username;
  64. this.password = password;
  65. }
  66. public String getGroupId() {
  67. return groupId;
  68. }
  69. public void setGroupId(String groupId) {
  70. this.groupId = groupId;
  71. }
  72. public String getArtifactId() {
  73. return artifactId;
  74. }
  75. public void setArtifactId(String artifactId) {
  76. this.artifactId = artifactId;
  77. }
  78. public String getVersion() {
  79. return version;
  80. }
  81. public void setVersion(String version) {
  82. this.version = version;
  83. }
  84. public String getRepository() {
  85. return repository;
  86. }
  87. public void setRepository(String repository) {
  88. this.repository = repository;
  89. }
  90. public String getTarget() {
  91. return target;
  92. }
  93. /*public void setTarget(String target) {
  94. this.target = target;
  95. }*/
  96. public String getUsername() {
  97. return username;
  98. }
  99. public void setUsername(String username) {
  100. this.username = username;
  101. }
  102. public String getPassword() {
  103. return password;
  104. }
  105. public void setPassword(String password) {
  106. this.password = password;
  107. }
  108. }

上面是根据三围来下载jar包,但是jar包的版本会有很多,所以有如下需求:给定groupId和artifactId,列出所有的version,用户选择某一version后再利用上面的方法下载,那么怎么列出所有的version呢?Aether API给出了一些借口,稍加组合即可:


  
  
  1. /**
  2. * 根据groupId和artifactId获取所有版本列表
  3. * @param params Params对象,包括基本信息
  4. * @return version列表
  5. * @throws VersionRangeResolutionException
  6. */
  7. public static List<Version> getAllVersions(Params params) throws VersionRangeResolutionException
  8. {
  9. String groupId=params.getGroupId();
  10. String artifactId=params.getArtifactId();
  11. String repositoryUrl=params.getRepository();
  12. String target=params.getTarget();
  13. String username=params.getUsername();
  14. String password=params.getPassword();
  15. RepositorySystem repoSystem = newRepositorySystem();
  16. RepositorySystemSession session = newSession( repoSystem ,target);
  17. RemoteRepository central= null;
  18. if(username== null&&password== null)
  19. {
  20. central = new RemoteRepository.Builder( "central", "default", repositoryUrl ).build();
  21. } else{
  22. Authentication authentication= new AuthenticationBuilder().addUsername(username).addPassword(password).build();
  23. central = new RemoteRepository.Builder( "central", "default", repositoryUrl ).setAuthentication(authentication).build();
  24. }
  25. Artifact artifact = new DefaultArtifact( groupId+ ":"+artifactId+ ":[0,)" );
  26. VersionRangeRequest rangeRequest = new VersionRangeRequest();
  27. rangeRequest.setArtifact( artifact );
  28. rangeRequest.addRepository( central );
  29. VersionRangeResult rangeResult = repoSystem.resolveVersionRange( session, rangeRequest );
  30. List<Version> versions = rangeResult.getVersions();
  31. System.out.println( "Available versions " + versions );
  32. return versions;
  33. }

在这里面最令人恶心的是由于之前是三围坐标,创建Artifact对象的时候传进去groupId:artifactId:verison的字符串就行了,现在没有verison了,找了好久的API都是必带verison的,甚至试了一下通配符也不成。后来找到了官方的example的源码,才发现原来是用[0,)来表示所有的verison,就是数学中的0到正无穷呀,想改成啥区间的version都可以了。

后面的需求就是解压下载下来的jar包,然后将其中的js文件夹再压缩供用户下载引用,压缩、解压的方法网上好多,就不再说明了。

另外,Aether官方提供的示例代码还实现很多其他的功能,有需要的可以下载来参考。

示例代码官方git地址:git://git.eclipse.org/gitroot/aether/aether-demo.git   或

ssh://git.eclipse.org/gitroot/aether/aether-demo.git  或

http://git.eclipse.org/gitroot/aether/aether-demo.git

我的源代码地址:[email protected]:xiaosiyuan/maven-download-jar.git 或

https://git.oschina.net/xiaosiyuan/maven-download-jar.git


        </div>
            </div>
        </article>


猜你喜欢

转载自blog.csdn.net/qq_36898043/article/details/81098926