【发布时间】:2022-07-18 00:50:37
【问题描述】:
在我们的项目中,我们创建了一个“skinny” jar,它只包含我们自己的应用程序代码,我们使用 maven shade 插件为我们运行应用程序所需的依赖项创建 JAR。 Maven shade 用于将多个依赖项打包到同一个 jar 中。例如,所有的 jetty 依赖都打包成一个更大的jetty-full.jar。
现在我们面临org.graalvm.js 依赖的问题。它依赖于truffle-api,它本身是一个多版本 jar,包括META-INF/versions/11 下的 java 11 类。当我们使用 Java 11 时,我们需要这些类,但由于某种原因,它们被 maven shade 插件排除在外。
以下是相关pom.xml的代码:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>project-dependencies</artifactId>
<groupId>org.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>graal-full</artifactId>
<properties>
<graalvm.version>21.3.0</graalvm.version>
</properties>
<dependencies>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js</artifactId>
<version>${graalvm.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js-scriptengine</artifactId>
<version>${graalvm.version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
</transformers>
</configuration>
</plugin>
</plugins>
</build>
</project>
生成的 jar 的META-INF 仅包含以下文件夹和文件:
- 升级
- 服务
- 原生图片
- 行家
- MANIFEST.MF(文件)
versions 文件夹丢失。
我现在使用copy-dependency 插件来复制单个文件,并且META-INF 包含具有所需Java 11 类的versions/11 文件夹。
我是否遗漏了什么或者为什么 META-INF/versions 被排除在阴影罐中?
【问题讨论】:
-
没有支持多版本 jar 的可用资源转换器...您可能需要自己编写...
-
那么资源转换器是这里的问题吗?有没有我可以使用的“原样复制”资源转换器?
标签: maven jar maven-shade-plugin multi-release-jar