Как плагин Maven может обнаружить свою собственную версию во время выполнения? - PullRequest
2 голосов
/ 01 июля 2010

Я бы хотел узнать версию моего плагина во время его работы; 0.0.1-SNAPSHOT, 0.0.1, 1.0-SNAPSHOT и т. Д.

Можно ли это сделать? Класс AbstractMojo на самом деле не дает много информации о самом плагине.

РЕДАКТИРОВАТЬ - я использую следующий код в качестве обходного пути. Предполагается, что MANIFEST для плагина может быть загружен с URL-адреса ресурса, созданного с использованием URL-адреса ресурса самого плагина. Это нехорошо, но, похоже, работает для MANIFEST, расположенного в загрузчике файлов или jar-классов:

String getPluginVersion() throws IOException {
    Manifest mf = loadManifest(getClass().getClassLoader(), getClass());
    return mf.getMainAttributes().getValue("Implementation-Version");
}

Manifest loadManifest(final ClassLoader cl, final Class c) throws IOException {
    String resourceName = "/" + c.getName().replaceAll("\\.", "/") + ".class";
    URL classResource = cl.getResource(resourceName);
    String path = classResource.toString();

    int idx = path.indexOf(resourceName);
    if (idx < 0) {
        return null;
    }

    String urlStr = classResource.toString().substring(0, idx) + "/META-INF/MANIFEST.MF";

    URL url = new URL(urlStr);

    InputStream in = null;
    Manifest mf = null;
    try {
        in = url.openStream();
        mf = new Manifest(in);
    } finally {
        if (null != in) {
            in.close();
        }
        in = null;
    }

    return mf;
}

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Я не думаю, что ваш "обход" с файлом манифеста - плохая идея. Поскольку он упакован в .jar вашего плагина, у вас всегда должен быть к нему доступ.

Чтобы этот пост был ответом, вот еще одна идея: пусть maven сделает всю грязную работу за вас во время сборки вашего плагина: в вашем источнике плагина будет заполнитель:

private final String myVersion = "[CURRENT-VERSION]";

используйте ant-plugin или что-то еще, чтобы заменить этот заполнитель текущей версией перед компиляцией.

0 голосов
/ 02 июля 2010

Сначала добавьте следующую зависимость в POM вашего плагина:

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-project</artifactId>
  <version>2.0</version>
</dependency>

Затем вы можете просто сделать следующее:

public class MyMojo extends AbstractMojo {

private static final String GROUP_ID = "your-group-id";
private static final String ARTIFACT_ID = "your-artifact-id";

/**
 * @parameter default-value="${project}"
 */
MavenProject project;

public void execute() throws MojoExecutionException {
    Set pluginArtifacts = project.getPluginArtifacts();
    for (Iterator iterator = pluginArtifacts.iterator(); iterator.hasNext();) {
        Artifact artifact = (Artifact) iterator.next();
        String groupId = artifact.getGroupId();
        String artifactId = artifact.getArtifactId();
        if (groupId.equals(GROUP_ID) && artifactId.equals(ARTIFACT_ID)) {
            System.out.println(artifact.getVersion());
            break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...