用法

介绍

Maven JLink 插件用于使用JDK 9创建模块化运行时映像。

要链接到模块化运行时映像的预期工件是jmodjar文件。可以使用Maven JMod 插件创建 JMod 文件,使用Maven JAR 插件可以创建jar文件。

Maven JLink 插件的配置

要使用 Maven JLink 插件,您必须将其配置为 an extensions,这意味着您的 pom 文件中的配置必须如下所示:

<project>
  [...]
  <build>
    [...]
    <plugins>
      [...]
      <plugin>
        <artifactId>maven-jlink-plugin</artifactId>
        <version>3.1.0</version>
        <extensions>true</extensions>
        <configuration>
          <!-- configuration elements goes here -->
        </configuration>
      </plugin>
   [...]
</project>

配置元素包含插件的配置,就像任何其他 Maven 插件一样。可以为此插件配置的不同元素可以由目标文档识别。

要求

根据插件的基础,需要安装 JDK 9。这意味着您要么通过JAVA_HOME配置它,这意味着使用 JDK 9 或通过Toolchains运行整个 Maven 构建。

如何配置与工具链相关的 Maven 可以在工具链文档中阅读。

Maven JLink 插件的使用

您可以像使用 maven-jar-plugin、maven-war-plugin、maven-assembly-plugin 或任何其他生成工件的插件一样使用 maven-jlink-plugin。为工件生成创建一个单独的模块并指定 <packaging>jlink</packaging> .

使用此插件的另一种方法是将其添加到现有项目中。在这种情况下,您希望在package阶段中添加显式执行。

假设您有一个多模块结构,其中包含两个模块mod-1mod-2,您希望将它们放入生成的运行时映像中。

多模块的父级看起来像这样:

<project ...>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.corporate.maven</groupId>
    <artifactId>maven-parent</artifactId>
    <version>2.3.1</version>
  </parent>
  <groupId>com.corporate.project</groupId>
  <artifactId>parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
   [...]
  <modules>
    <module>mod-1</module>
    <module>mod-2</module>
  </modules>  
   [...]
</project>

这样一个项目的目录结构如下所示:

.
├── mod-1
│   └── src
└── mod-2
    └── src

mod-1模块看起来像这样:

<project ...>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.corporate.project</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>mod-1</artifactId>
   [...]
</project>

mod-2模块看起来像这样:

<project ...>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.corporate.project</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>mod-2</artifactId>
   [...]
</project>

如果您想创建模块的 Java 运行时映像,则必须创建一个单独的模块mod-jlink,其中包含创建运行时映像的配置,如下所示:

<project ...>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.corporate.project</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <packaging>jlink</packaging>
  <artifactId>mod-jlink</artifactId>
   [...]
</project>

目录结构现在如下所示:

.
├── mod-1
│   └── src
├── mod-2
│   └── src
└── mod-jlink
    └── src

在执行此操作之前,您必须将配置添加到父级,如Maven JLink 插件的配置中所示。

现在您需要定义哪些模块应该链接到生成的 Java 运行时映像中,这可以通过将模块定义为mod-jlink模块的依赖项来完成,如下所示:

<project ...>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.corporate.project</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <packaging>jlink</packaging>
  <artifactId>mod-jlink</artifactId>
 <dependencies>
    <dependency>
      <groupId>com.corporate.project</groupId>
      <artifactId>mod-1</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>com.corporate.project</groupId>
      <artifactId>mod-2</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>  
   [...]
</project>

添加适当的配置后,您可以通过从多模块项目的根目录调用来简单地创建 Java 运行时映像,如下所示:

mvn clean package

有一些类似这样的输出行:

[INFO]
[INFO] --- maven-jlink-plugin:3.1.0:jlink (default-jlink) @ mod-jlink ---
[INFO] Toolchain in maven-jlink-plugin: jlink [ /.../jdk1.9.0_ea+181.jdk/Contents/Home/bin/jlink ]
[INFO] The following dependencies will be linked into the runtime image:
[INFO]  -> module: com.soebes.nine.one.jar ( /.../mod-1/target/mod-1-1.0-SNAPSHOT.jar )
[INFO]  -> module: com.soebes.nine.two.jar ( /.../mod-2/target/mod-2-1.0-SNAPSHOT.jar )
[INFO] Building zip: /.../mod-jlink/target/mod-jlink-1.0-SNAPSHOT.zip
[INFO]

如果您想将生成的 Java 运行时映像文件安装到本地缓存中,您可以使用以下方法实现此目的:

mvn clean install

或者,如果您想将生成的工件部署到必须使用的远程存储库:

mvn clean deploy

目前,生成的 Java 运行时映像被打包到一个zip存档中,该存档用于将jlink创建的整个结构传输到存储库。

生成的Java 运行时映像目录结构如下所示:

jlink/
├── bin
├── conf
├── include
├── legal
├── lib
└── release