加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 以编程方式解析插件外的Maven依赖项 – 获取RepositoryS

发布时间:2020-12-14 06:05:49 所属栏目:Java 来源:网络整理
导读:也许这将是一个比我最初想到的更大的任务,但不管我试图从一个文件加载一个MavenProject,然后解决它的依赖.我有两个代码,但我缺少一些我需要的对象引用;具体来说我需要获取RepositorySystemSession和RepositorySystem的实例.任何提示? 注意:我用maven-plugi
也许这将是一个比我最初想到的更大的任务,但不管我试图从一个文件加载一个MavenProject,然后解决它的依赖.我有两个代码,但我缺少一些我需要的对象引用;具体来说我需要获取RepositorySystemSession和RepositorySystem的实例.任何提示?

注意:我用maven-plugin标记了这个问题,但这不是一个Maven插件.我很高兴地要求Maven 3(认为我已经有了..)

以下是我到目前为止的代码:

构建MavenProject:

public static MavenProject loadProject(File pomFile) throws Exception
{
    MavenProject ret = null;
    MavenXpp3Reader mavenReader = new MavenXpp3Reader();

    if (pomFile != null && pomFile.exists())
    {
        FileReader reader = null;

        try
            {
            reader = new FileReader(pomFile);
            Model model = mavenReader.read(reader);
            model.setPomFile(pomFile);

            ret = new MavenProject(model);
        }
        finally
        {
            // Close reader
        }
    }

    return ret;
}

解决依赖关系:

public static List<Dependency> getArtifactsDependencies(MavenProject project,String dependencyType,String scope) throws Exception
{    
    DefaultArtifact pomArtifact = new DefaultArtifact(project.getId());

    RepositorySystemSession repoSession = null; // TODO
    RepositorySystem repoSystem = null; // TODO

    List<RemoteRepository> remoteRepos = project.getRemoteProjectRepositories();
    List<Dependency> ret = new ArrayList<Dependency>();

    Dependency dependency = new Dependency(pomArtifact,scope);

    CollectRequest collectRequest = new CollectRequest();
    collectRequest.setRoot(dependency);
    collectRequest.setRepositories(remoteRepos);

    DependencyNode node = repoSystem.collectDependencies(repoSession,collectRequest).getRoot();
    DependencyRequest projectDependencyRequest = new DependencyRequest(node,null);

    repoSystem.resolveDependencies(repoSession,projectDependencyRequest);

    PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
    node.accept(nlg);

    ret.addAll(nlg.getDependencies(true));

    return ret;
}

我知道这可能是一个不寻常的要求,也许我应该只是废弃我正在做的事情,并把它作为一个插件包装…但我只是想完成我现在开始!提前致谢.

解决方法

尝试 jcabi-aether,这是一个包装从 Apache Aether从Sonatype:
final File repo = this.session.getLocalRepository().getBasedir();
final Collection<Artifact> deps = new Aether(this.getProject(),repo).resolve(
  new DefaultArtifact("junit","junit-dep","","jar","4.10"),JavaScopes.RUNTIME
);

如果你是外面的Maven插件:

final File repo = new File(System.getProperty("java.io.tmpdir"),"my-repo");
final MavenProject project = new MavenProject();
project.setRemoteArtifactRepositories(
  Arrays.asList(
    new RemoteRepository(
      "maven-central","default","http://repo1.maven.org/maven2/"
    )
  )
);
final Collection<Artifact> deps = new Aether(project,JavaScopes.RUNTIME
);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读