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

Ral*_*alf 5 java maven

我不知道如何获取Maven-shade-plugin来将POM文件中的应用程序版本包含到Manifest文件中。我发现了一些有关maven-jar-plugin的示例,其中包括

<archive>                   
    <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
    </manifest>
</archive>
Run Code Online (Sandbox Code Playgroud)

在“插件配置”部分(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可以做到这一点,但我在文档中找不到任何内容。

有谁知道如何做到这一点?

谢谢!

千木郷*_*千木郷 7

正如官方说明页面中关于将条目添加到清单文件中所述,也可以支持实现和规范的版本和标题,因为它们是清单文件的条目。

但是Maven Shade Plugin 不支持Apache Maven Archiver,所以<archive>element 在这里不起作用。您必须使用ManifestResourceTransformerMaven Shade Plugin 提供的:

<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.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>
Run Code Online (Sandbox Code Playgroud)

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

然而,简单地替换到 maven shade 会带来副作用,因为它不包括<archive>插件默认的附加资源文件,这会使具有属性资源的项目无法正常工作,例如 spring 项目。因此,在大多数情况下,需要手动维护依赖项以及 maven shade,如下面的频繁使用示例:

<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>
Run Code Online (Sandbox Code Playgroud)