有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java mavenshadeplugin将应用程序版本添加到清单

我不知道如何让maven shade插件将POM文件中的应用程序版本包含到清单文件中。 我找到了一些maven jar插件的例子,建议包括

<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插件中尝试了这个,但它不起作用。我还试图找到一些信息,如果该组织。阿帕奇。专家插件。阴凉处资源我可以这样做,但我在文档中找不到任何东西

有人知道怎么做吗

谢谢


共 (1) 个答案

  1. # 1 楼答案

    正如official instruction page中关于向清单文件中添加条目所述,也可以支持实现和规范的版本和标题,因为它们是清单文件的条目

    但是Apache Maven Archiver在Maven Shade插件中不受支持,因此<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.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>
    

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

    然而,简单地替换maven shade会带来副作用,因为它没有像<archive>插件在默认情况下那样包含额外的资源文件,这会使具有属性资源的项目无法工作,例如spring项目。因此,在大多数情况下,maintaining dependencies by hand将与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>