【问题标题】:How can I programmatically add an Artifact to the MavenProject?如何以编程方式将工件添加到 MavenProject?
【发布时间】:2013-04-10 19:29:28
【问题描述】:

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

我已经能够通过aether 成功解决依赖关系,但似乎 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 方法是将工件附加到现有工件(即将源/javadocs jar 附加到工件),这不是我的目标。相反,我从 maven 项目中获取了工件并添加了我的工件:

project.getArtifacts().add(mavenArtifact);

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

我可以对 MavenProject 进行更改并使其保持不变吗?

【问题讨论】:

  • 如果它已经存在并且你知道,你能告诉我吗? :)。我更新了标题以澄清。我正在寻找以编程方式添加依赖项。

标签: java maven maven-plugin aether


【解决方案1】:

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

您似乎在设计上不允许用户通过插件将项目配置弄得一团糟,以至于您可能会破坏构建。我找到了good post on advanced MOJO development here。引用自它:

如果这个参数可以与主参数分开指定 依赖项部分,用户可以轻松破坏他们的构建 - 特别是如果有问题的 mojo 编译了项目源代码。在 在这种情况下,直接配置可能会导致依赖 存在用于编译,但不可用于测试。所以, @readonly 注释功能强制用户配置 POM,而不是只配置特定的插件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2011-08-22
    • 2013-12-30
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多