gpt4 book ai didi

java - 如何以编程方式将 Artifact 添加到 MavenProject?

转载 作者:行者123 更新时间:2023-12-01 19:13:22 25 4
gpt4 key购买 nike

我正在编写一个 Maven 插件,我想自动解析特定的依赖项,并根据为插件提供的参数将它们作为依赖项添加到项目中。

我已经能够通过 aether 成功解决依赖关系,但以太和 MavenProject 之间似乎存在脱节。

MavenProject#addAttachedArtifact 上有一个方法,我猜这就是我想要使用的方法。然而,它需要一个 org.apache.maven.artifact.Artifact,而从 aether 检索的是 org.sonatype.aether.artifact.Artifact。我找到了plugin两者之间有一个转换方法,但我认为应该有一个更标准的方法。

我还尝试使用 DefaultArtifactFactory 创建 org.apache.maven.artifact.Artifact,但在尝试获取 ArtifactHandler 时出现 NullPointerException。

代码:

DefaultArtifactFactory factory = new DefaultArtifactFactory();
Artifact mavenArtifact = factory.createBuildArtifact("com.beust", "jcommander", "1.27", "jar");

结果:

 Caused by: java.lang.NullPointerException
at org.apache.maven.artifact.factory.DefaultArtifactFactory.createArtifact(DefaultArtifactFactory.java:155)
at org.apache.maven.artifact.factory.DefaultArtifactFactory.createArtifact(DefaultArtifactFactory.java:117)
at org.apache.maven.artifact.factory.DefaultArtifactFactory.createArtifact(DefaultArtifactFactory.java:111)
at org.apache.maven.artifact.factory.DefaultArtifactFactory.createBuildArtifact(DefaultArtifactFactory.java:75)
at com.foo.bar.module.IncludeModuleFrontEndMojo.execute(IncludeModuleFrontEndMojo.java:165)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
... 20 more

所以说真的,这些是我尝试过的事情,解决这些问题会很棒,但我真的在寻找正确的方法来做到这一点。有什么想法吗?

更新

我编写了自己的两个类之间的转换方法:

private static org.apache.maven.artifact.Artifact aetherToMavenArtifactBasic(Artifact artifact, String scope, ArtifactHandler artifactHandler) {
DefaultArtifact mavenArtifact = new DefaultArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), scope, artifact.getExtension(), artifact.getClassifier(), artifactHandler);
mavenArtifact.setFile(artifact.getFile());
mavenArtifact.setResolved(true);
return mavenArtifact;
}

并发现 MavenProject#addAttachedArtifact 方法是将 Artifact 附加到现有 Artifact (即将源/javadocs jar 附加到 Artifact ),这不是我的目标。相反,我从 Maven 项目中获取了 Artifact 并添加了我的 Artifact :

project.getArtifacts().add(mavenArtifact);

它将我的 Artifact 添加到项目中(当我调用项目的 getArtifactMap() 和 getCompileClasspathElements() 时,会显示我的 Artifact 。但是,这种更改不会持续存在。这是我真正担心的问题。所以问题已经演变成:

我可以对 MavenProject 进行更改并使其保留吗?

最佳答案

我认为这是不可能的,出于我的目的,我决定要求用户在项目的 pom 文件中添加依赖项(如果没有,则会出错)。

从设计上来说,您似乎不允许用户通过插件来破坏项目配置,以免破坏构建。我找到了good post on advanced MOJO development here 。摘自其中的一段话:

If this parameter could be specified separately from the main dependencies section, users could easily break their builds – particularly if the mojo in question compiled project source code. In this case, direct configuration could result in a dependency being present for compilation, but being unavailable for testing. Therefore, the @readonly annotation functions to force users to configure the POM, rather than configuring a specific plugin only.

关于java - 如何以编程方式将 Artifact 添加到 MavenProject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16070149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com