Как я могу программно добавить артефакт в MavenProject?

Я пишу плагин 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 и сохранить его?


person Noremac    schedule 17.04.2013    source источник
comment
Если он уже существует и вы о нем знаете, вы мне расскажете? :). Я обновил заголовок, чтобы уточнить. Я хочу программно добавить зависимость.   -  person Noremac    schedule 18.04.2013


Ответы (1)


Я не думаю, что это возможно, и для своих целей я решил вместо этого потребовать, чтобы пользователь добавил зависимость в pom-файл проекта (и выдал ошибку, если у него ее нет).

Похоже, что вы не позволяете пользователю изменять конфигурацию проекта через плагин до такой степени, что вы можете сломать сборку. Я нашел хороший пост на продвинутая разработка MOJO здесь. Цитата оттуда:

Если бы этот параметр можно было указать отдельно от раздела основных зависимостей, пользователи могли бы легко сломать свои сборки, особенно если рассматриваемый моджо скомпилировал исходный код проекта. В этом случае прямая настройка может привести к тому, что зависимость будет присутствовать для компиляции, но будет недоступна для тестирования. Таким образом, аннотация @readonly заставляет пользователей настраивать POM, а не настраивать только конкретный плагин.

person Noremac    schedule 19.04.2013