[英]When building an application jar with Maven Shade, is it safe to exclude all META-INF/versions directories/files?
我相信版本文件夹在那里支持多个 Java 版本。 我们总是为一个非常具体的版本(此时是 11)构建。 在创建我们的单个应用程序 jar 时排除这些目录/文件是否存在危险? 前任。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>${start-class}</mainClass>
<manifestEntries>
<Class-Path>./</Class-Path>
<Implementation-Version>${ourSoftware.revision}</Implementation-Version>
</manifestEntries>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
<exclude>META-INF/versions/**</exclude> <!-- IS THIS SAFE? -->
</excludes>
</filter>
</filters>
<finalName>${project.artifactId}App</finalName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
谢谢!
是的,这些版本文件夹用于支持 Multi-Release Jar 文件(参见JEPS 238 )。
如果您在MANIFEST.MF文件中将multi-release
属性明确设置为false ,这对我来说似乎是安全的。
下面是它的工作原理:
在不支持 MRJARs 的 JDK 中,只有根目录下的类和资源是可见的,两种包装是无法区分的。 在支持 MRJAR 的 JDK 中,与任何更高版本的 Java 平台版本对应的目录将被忽略; 它将首先在与当前运行的主要 Java 平台发布版本相对应的 Java 平台特定目录中搜索类和资源,然后搜索较低版本,最后搜索 JAR 根目录。 在 Java 9 JDK 上,就好像有一个特定于 JAR 的 class 路径首先包含版本 9 文件,然后是 JAR 根目录; 在 Java 8 JDK 上,这个 class 路径将只包含 JAR 根目录。 (参考: JEPS 238 )
这种基于版本的打包机制会选择性地忽略不相关的版本文件夹,即使里面有内容。 禁用该机制应该解决为忽略所有版本文件夹(如果它们存在)并且如果它们不存在则完全回退到 JEPS 238 之前存在的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.