【问题标题】:Maven Shade does not include "META-INF/versions" of multi-release dependencyMaven Shade 不包含多版本依赖的“META-INF/versions”
【发布时间】: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


【解决方案1】:

这好像是duplicate,看来你可以设置Multi-Release

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.2.1</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>foo.bar.Generate</Main-Class>
              <Multi-Release>true</Multi-Release>
            </manifestEntries>
          </transformer>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>

虽然it is not documented

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2016-12-14
    • 2017-05-22
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多