Я пишу плагин Maven, и я хотел бы автоматически разрешать определенные зависимости и добавлять их в качестве зависимостей в проект на основе параметров, заданных плагину.
Мне удалось успешно разрешить зависимости с помощью эфир, но, похоже, существует разрыв между эфиром и MavenProject.
В MavenProject#addAttachedArtifact есть метод, который, как я предполагаю, я хочу использовать. Однако для этого требуется org.apache.maven.artifact.Artifact, а из эфира — org.sonatype.aether.artifact.Artifact. Я нашел плагин с методом преобразования между два, но я полагаю, что должен быть более стандартный подход.
Я также пытался использовать DefaultArtifactFactory для создания org.apache.maven.artifact.Artifact, но получаю исключение NullPointerException при попытке получить ArtifactHandler.
код:
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 к артефакту), что не является моей целью. Вместо этого я получил артефакты из проекта maven и добавил свой артефакт:
project.getArtifacts().add(mavenArtifact);
который добавляет мой артефакт в проект (мой артефакт затем отображается, когда я вызываю проект getArtifactMap() и getCompileClasspathElements(). Однако это изменение не сохраняется. Это проблема, о которой я действительно беспокоился. Таким образом, вопрос превратился в :
Можно ли внести изменения в MavenProject и сохранить его?