2010-07-01 51 views
2

我希望能夠在執行過程中發現插件的版本; 0.0.1-SNAPSHOT,0.0.1,1.0-SNAPSHOT等。Maven插件在執行期間如何發現它自己的版本?

可以這樣做嗎? AbstractMojo類並沒有給你提供關於插件本身的更多信息。

編輯 - 我正在使用下面的代碼作爲解決方法。它假定可以從使用插件本身的資源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; 
} 

回答

0

首先,添加以下依賴於你的插件的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; 
     } 
    } 
} 
+0

我不認爲這是正確的。如果插件是針對POM運行的,那麼將返回POM的版本,而不是插件的版本。 – 2010-07-02 09:21:37

+0

嗨保羅,是的,你是對的,它給了項目的版本,而不是插件。我相應地更新了代碼。這不是一個非常優雅的解決方案,但似乎工作。也許別人知道一個更乾淨的方式來做到這一點。 – 2010-07-02 21:08:52

1

我不認爲你的清單文件的「解決方法」是一個壞主意。由於它包裝在插件的.jar中,因此您應該始終可以訪問它。

對於這個職位是一個答案,這裏是另一個想法:讓你的Maven插件的構建過程中爲你做骯髒的工作:有一個佔位符,在你的插件來源:

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

使用ant-插件或其他東西在編譯前用當前版本替換佔位符。

相關問題