Основной проект плагина maven не работает, дескрипторы плагина Mojo не генерируют
Я следую учебнику для создания плагина maven и не могу запустить mvn install без ошибок. Информация жалуется, что у меня нет требуемых дескрипторов mojo, когда аннотации должны генерировать их для меня. Я запускаю maven 3.0.5 и использую intellij как мой ide. вот мой основной класс:
@Mojo(name = "modify-connector")
public class ComplianceMojo extends AbstractMojo {
@Parameter
private String artifactId;
@Parameter
private String version;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
File jar = new File(getPluginContext().get("project.build.directory") + "/"
+ getPluginContext().get("project.build.finalname") + "/" + artifactId + "-" + version);
if(jar.exists()){
getLog().info("The file exists! " + jar.getAbsolutePath());
} else {
getLog().info("The file does not exist: " + jar.getAbsolutePath());
}
}
}
И вот мой pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mysql-jdbc-compliance-maven-plugin</groupId>
<artifactId>mysql-jdbc-compliance-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
Примечание: Мне пришлось отдельно добавлять зависимость аннотаций, поскольку основной плагин api не содержал эти классы. когда я запускаю mvn install в моем проекте, вывод выглядит следующим образом:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.867s
[INFO] Finished at: Wed Sep 25 17:45:55 EST 2013
[INFO] Final Memory: 8M/244M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-plugin-plugin:2.9:descriptor (default-descriptor) on project mysql-jdbc-compliance-maven-plugin: Error extracting plugin descriptor: 'No mojo definitions were found for plugin: mysql-jdbc-compliance-maven-plugin:mysql-jdbc-compliance-maven-plugin.' -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
Ответы
Ответ 1
Прочитав Jira Issue, который опубликовал Gyro, я добавил следующие строки в мой pom, и все было хорошо скомпилировано.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.2</version>
<configuration>
<goalPrefix>mysql-jdbc-compliance</goalPrefix>
</configuration>
<executions>
<execution>
<id>default-descriptor</id>
<goals>
<goal>descriptor</goal>
</goals>
<phase>process-classes</phase>
</execution>
<execution>
<id>help-descriptor</id>
<goals>
<goal>helpmojo</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
Ответ 2
Возможно, это связано с нерешенной проблемой в Maven: https://issues.apache.org/jira/browse/MNG-5346
Для моих проектов плагинов я мог бы обойти, добавив явное выполнение maven-plugin-plugin:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.2</version>
<configuration>
<!-- see http://jira.codehaus.org/browse/MNG-5346 -->
<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
</configuration>
<executions>
<execution>
<id>mojo-descriptor</id>
<goals>
<goal>descriptor</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Но посмотрите комментарии в вопросе JIRA для более сложных решений!
Ответ 3
Как упоминалось в предыдущем ответе это была ошибка, и теперь она исправлена.
Вам просто нужно сказать maven, что он должен использовать более новую версию maven-plugin-plugin
.
Вот как выглядит мой pom файл:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ...other maven config... -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.3</version>
</plugin>
</plugins>
</build>
</project>
Ответ 4
Просто увеличивайте версию плагина maven до 3.3 или 3.4
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.3</version>
</plugin>
</plugins>
</build>
не будет исправлять какую-либо проблему (как утверждают некоторые).
Вы должны добавить минимум default-descriptor
выполнение с правильной фазой.
Таким образом, минимальная конфигурация информации о сборке выглядит следующим образом:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<id>default-descriptor</id>
<phase>process-classes</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
независимо от версии maven-plugin-plugin
. (это может быть 3,1, 3,2, 3,3 3,4 (не проверять остальные)).
даст:
...
[INFO] --- maven-plugin-plugin:3.2:descriptor (default-descriptor) @ example-maven-plugin ---
[WARNING] Using platform encoding (UTF-8 actually) to read mojo metadata, i.e. build is platform dependent!
[INFO] Applying mojo extractor for language: java-annotations
[INFO] Mojo extractor for language: java-annotations found 1 mojo descriptors.
[INFO] Applying mojo extractor for language: java
[INFO] Mojo extractor for language: java found 0 mojo descriptors.
[INFO] Applying mojo extractor for language: bsh
[INFO] Mojo extractor for language: bsh found 0 mojo descriptors.
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Другой вариант, если вы не хотите, чтобы в вашем помпе были встроенные тэги, вы можете использовать javadocs на своем Mojo. Например:
/**
* @goal run123
*/
@Mojo(name = "run123")
public class MyMojo extends AbstractMojo {
}
даст:
...
[INFO] --- maven-plugin-plugin:3.2:descriptor (default-descriptor) @ example-maven-plugin ---
[WARNING] Using platform encoding (UTF-8 actually) to read mojo metadata, i.e. build is platform dependent!
[INFO] Applying mojo extractor for language: java-annotations
[INFO] Mojo extractor for language: java-annotations found 0 mojo descriptors.
[INFO] Applying mojo extractor for language: java
[INFO] Mojo extractor for language: java found 1 mojo descriptors.
[INFO] Applying mojo extractor for language: bsh
[INFO] Mojo extractor for language: bsh found 0 mojo descriptors.
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Пожалуйста, обратитесь к этому руководству для получения дополнительной информации
http://maven.apache.org/plugin-tools/maven-plugin-plugin/examples/using-annotations.html
Ответ 5
Хорошие ответы выше - я хотел бы дополнить их, добавив ресурс, чтобы найти последнюю версию: https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-plugin-plugin
2 апреля 2019 г. - я столкнулся с той же ошибкой, описанной выше, и решил ее с помощью 3.6.0.
Ответ 6
Изначально я думал, что гировый ответ исправил ошибку. Но позже при выполнении цели он потерпел неудачу.
mvn sample.plugin: hello-maven-plugin: 1.0-SNAPSHOT: sayhi
производится
[ERROR] Не удалось найти цель "sayhi" в плагине sample.plugin: hello-maven-plugin: 1.0-SNAPSHOT среди доступных целей → [Справка 1]
Оказывается, что
skipErrorNoDescriptorsFound
только подавляет ошибку. т.е. он не разрешил основную проблему. Я удалил это исправление.
После этого решение было простым (и причиной была чисто моя ошибка). Когда я создал GreetingMojo.java, я поместил его в следующий каталог
.../Разработка/мой-Maven-плагин/SRC/образец/плагин/GreetingMojo.java
Это должно быть под
.../Разработка/мой-Maven-плагин/SRC/главная/Java/образец/плагин/GreetingMojo.java