我正在编写一个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方法是将工件附加到现有工件(即将sources / javadocs jar附加到工件),这不是我的目标。相反,我从maven项目中获取了工件并添加了我的工件:
project.getArtifacts().add(mavenArtifact);
它将我的工件添加到项目中(当我调用项目的getArtifactMap()和getCompileClasspathElements()时会显示我的工件。但是,这种更改不会持续存在。这是我真正担心的问题。所以问题已演变成:
我可以对MavenProject进行更改并保持不变吗?
答案 0 :(得分:0)
我不认为这是可能的,并且出于我的目的,我决定要求用户在项目的pom文件中添加依赖项(如果没有它,则会出错)。
似乎在设计上,您不允许用户通过插件将项目配置混乱到可以破坏构建的点。我找到了good post on advanced MOJO development here。引用它:
如果此参数可以与main分开指定 依赖关系部分,用户可以轻松打破他们的构建 - 特别是如果有问题的mojo编译项目源代码。在 在这种情况下,直接配置可能导致依赖性 用于编译,但不可用于测试。因此, @readonly注释函数强制用户配置 POM,而不是仅配置特定的插件。