使用Maven 2 API获取WAR Artifact的依赖项

爱德。

我发现了一些有关工件检索问题的文章,但是答案似乎不适用于我的具体情况。

我正在编写一个插件,该插件将有助于生成瘦身的战争EAR,并且正在运行为EAR maven模块编写的插件。在插件代码中,我已经达到了我想要获得WAR依赖项的依赖项/工件的阶段-当前,这些问题并没有通过我尝试过的任何解决。我认为这是因为即使在我的EAR模块上运行dependency:tree也没有包含它们,它们也不是“传递”依赖关系。

// Neither of the two below return WAR transitive dependencies, just the WARs
project.getDependencies()
project.getArtifacts()

我目前的新方法是:

ArtifactRepository localRepository = project.getDistributionManagementArtifactRepository();
List remoteRepositories = project.getRemoteArtifactRepositories();

ResolutionGroup resolutionGroup = artifactMetadataSource.retrieve(warArtifact, localRepository, remoteRepositories);
Set<Artifact> artifactDependencies = resolutionGroup.getArtifacts();

(注意,这是利用项目的ArtifactMetadataSource组件对象和依赖项maven-dependency-plugin:2.4

这是行不通的artifactDependencies集合为空。现在这必须成为可能,因为mvn dependency:tree在模块的目录中运行可以正常运行warArtifact

有任何想法吗?

爱德。

我终于有了答案。诚然,它不能正确回答我的原始问题,但这就是我所追求的。

原因是它不能完全回答我的原始帖子:它需要Maven 3。

无论如何,这里是有兴趣的人:

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.collection.CollectRequest;
import org.sonatype.aether.graph.Dependency;
import org.sonatype.aether.graph.DependencyNode;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.resolution.DependencyRequest;
import org.sonatype.aether.util.artifact.DefaultArtifact;
import org.sonatype.aether.util.graph.PreorderNodeListGenerator;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @goal findShareables
 * @phase process-resources
 */
@SuppressWarnings("unchecked")
public class ShareableJarsInWarsExtractor extends AbstractMojo
{
    // ...

    /**
     * The MavenProject object.
     *
     * @parameter expression="${project}"
     * @readonly
     */
    private MavenProject project;

    /**
     * The entry point to Aether, i.e. the component doing all the work.
     *
     * @component
     */
    private RepositorySystem repoSystem;

    /**
     * The current repository/network configuration of Maven.
     *
     * @parameter default-value="${repositorySystemSession}"
     * @readonly
     */
    private RepositorySystemSession repoSession;

    /**
     * The project's remote repositories to use for the resolution of plugins and their dependencies.
     *
     * @parameter default-value="${project.remotePluginRepositories}"
     * @readonly
     */
    private List<RemoteRepository> remoteRepos;


    public void execute() throws MojoExecutionException
    {
        Artifact projectArtifact = getProjectArtifact();
        List<Dependency> projectDependencies = getArtifactsDependencies(projectArtifact);

        for (Dependency d : projectDependencies)
        {
            if (d.getArtifact() != null && "war".equals(d.getArtifact().getExtension()))
            {
                List<Dependency> warDependencies = getArtifactsDependencies(d.getArtifact());
                // I now have all of the WAR's dependencies!! Hooray!

                // ...
            }
        }

        // ...
    }


    private List<Dependency> getArtifactsDependencies(Artifact a)
    {
        List<Dependency> ret = new ArrayList<Dependency>();

        // Note: I get the POM artifact, not the WAR or whatever.
        DefaultArtifact pomArtifact = new DefaultArtifact(a.getGroupId(), a.getArtifactId(), "pom", a.getVersion());
        CollectRequest collectRequest = new CollectRequest();
        collectRequest.setRoot(new Dependency(pomArtifact, "compile"));
        collectRequest.setRepositories(remoteRepos);

        try
        {
            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));
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        return ret;
    }


    private Artifact getProjectArtifact()
    {
        // Todo: There must be a better way!
        return new DefaultArtifact(project.getArtifact().toString());
    }


    // ...
}

我的POM定义了以下依赖关系:

        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-model</artifactId>
            <version>3.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-core</artifactId>
            <version>3.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-artifact</artifactId>
            <version>3.0.4</version>
        </dependency>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Maven获取依赖项jar的路径

获取除测试依赖项以外的Maven依赖项列表

为什么在Maven Artifact搜索中使用Intellij添加依赖项无效?

JavaFX 2作为Maven依赖项

使用Maven将Java模块依赖项资源合并到WAR中

使用Maven复制依赖项

使用Dagger 2查看依赖项注入

在常规Maven构建中使用Eclipse p2存储库中的依赖项吗?

如何在 Android 上使用 Kotlin 获取 Dagger 2 模块中的组件依赖项?

如何在.NET Core 2 API选项中使用依赖项注入?

如何使用自定义 url 而不是 Maven Central 来获取依赖项

Jersey 2.x(2.6)所需的Maven依赖项

如何使用 Bazel 在 BUILD 文件的依赖项部分直接指定 groupid、artifact 和 version?

IntelliJ IDEA:如何获取 Maven 依赖项的用法?

Quarkus 未获取 maven 依赖项中的 @WebFilter

Maven:以编程方式获取所有依赖项

获取有关Maven依赖项的信息

如何获取本地 Maven 包以引入其依赖项?

使用angular2.api.ts时,“未将模块angular2 / src / core / compiler / interfaces声明为依赖项”

使用Maven依赖项的轻量级方法?

使用Jar作为intelliJ / Maven依赖项

如何使用Maven管理项目依赖项?

使用Maven下载Spring 3.0.0依赖项

如何检测未使用的Maven依赖项

使用Eclipse调试本地Maven依赖项

Maven插件API:从Artifact获取MavenProject

使用 Maven 获取 Eclipse 项目依赖的文档

Java Gradle API的Maven依赖项参数是什么?

Maven 找不到 Java Discord API 依赖项