在我们的项目中,我们创建了一个“skinny” jar,它只包含我们自己的应用程序代码,我们使用 maven shade 插件为我们运行应用程序所需的依赖项创建 JAR。Maven shade 用于将多个依赖项打包到同一个 jar 中。例如,所有的 jetty 依赖都打包成一个更大的jetty-full.jar
.
现在我们面临一个org.graalvm.js
依赖问题。它取决于truffle-api
哪个本身是一个多版本 jar,并且包含用于 java 11 下的类META-INF/versions/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>
生成的META-INF
jar 仅包含以下文件夹和文件:
- 升级
- 服务
- 本机图像
- 行家
- MANIFEST.MF(文件)
versions
文件夹丢失。
我现在使用copy-dependency
插件来复制单个文件,并在那里META-INF
包含versions/11
所需的 Java 11 类的文件夹。
我是否遗漏了什么或者为什么被META-INF/versions
排除在阴影罐中?