maven-shade-plugin将应用程序版本添加到清单

时间:2017-08-22 08:08:52

标签: java maven

我无法弄清楚如何让maven-shade-plugin将POM文件中的应用程序版本包含到Manifest文件中。 我找到了一些maven-jar-plugin的例子,其中包括

<archive>                   
    <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
    </manifest>
</archive>

在plugis配置部分(http://blog.soebes.de/blog/2014/01/02/version-information-into-your-appas-with-maven/)内。我尝试使用maven-shade-plugin,但它不起作用。我还试图找到一些信息,如果org.apache.maven.plugins.shade.resource.ManifestResourceTransformer可以做到这一点,但我在文档中找不到任何东西。

有人知道怎么做吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

正如official instruction page中有关在清单文件中添加条目的描述,也可以支持版本和实施标题以及规范,因为它们是清单文件的条目。

但Maven Shade插件不支持Apache Maven Archiver,因此<archive>元素在此处不起作用。您必须使用Maven Shade插件提供的ManifestResourceTransformer

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.4.3</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.handlers</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.schemas</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.tooling</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <manifestEntries>
                            <Main-Class>${project.build.mainClass}</Main-Class>
                            <Specification-Title>${project.artifactId}</Specification-Title>
                            <Specification-Version>${project.version}</Specification-Version>
                            <Implementation-Title>${project.artifactId}</Implementation-Title>
                            <Implementation-Version>${project.version}</Implementation-Version>
                            <Implementation-Vendor-Id>${project.groupId}</Implementation-Vendor-Id>
                        </manifestEntries>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

这个配置也用在我的项目中,我可以通过java中的Application.class.getPackage().getImplementationVersion()直接检索版本号。