Spring Boot Native:native-image-svm 没有有效的依赖项

And*_*ani 5 spring-boot graalvm graalvm-native-image

我刚刚使用 Maven 将几个项目升级到 Java 19、Spring Boot 3.0.2、Kotlin 1.8.0,我希望 Spring Boot 生成本机映像。

<java.version>19</java.version>
<kotlin.version>1.8.0</kotlin.version>
Run Code Online (Sandbox Code Playgroud)

配置的相关部分spring-boot-maven-plugin是:

        <configuration>
          <image>
            <env>
              <BP_JVM_VERSION>19.*</BP_JVM_VERSION>
              <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
              <BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:+HeapDumpOnOutOfMemoryError -XX:MaxDirectMemorySize=64M</BPE_APPEND_JAVA_TOOL_OPTIONS>
              <BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
            </env>
          </image>
        </configuration>
Run Code Online (Sandbox Code Playgroud)

但是,当我使用以下命令构建其中一个项目时

mvn -Pnative spring-boot:build-image
Run Code Online (Sandbox Code Playgroud)

然后构建失败并显示以下错误消息:

[INFO]     [creator]     Paketo Buildpack for BellSoft Liberica 9.10.2
[INFO]     [creator]       unable to find dependency
[INFO]     [creator]       no valid dependencies for native-image-svm, 19.*, and io.paketo.stacks.tiny in [(jdk, 8.0.362, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *]) (jre, 8.0.362, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *]) (jdk, 11.0.18, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *]) (jre, 11.0.18, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *]) (native-image-svm, 11.0.17, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *]) (jdk, 17.0.6, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *]) (jre, 17.0.6, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *]) (native-image-svm, 17.0.5, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *]) (jdk, 19.0.2, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *]) (jre, 19.0.2, [io.buildpacks.stacks.bionic io.paketo.stacks.tiny *])]
[INFO]     [creator]     ERROR: failed to build: exit status 1
Run Code Online (Sandbox Code Playgroud)

少了什么东西?

更新:当我使用 Kotlin 1.7.21 降级到 Java 17 时,构建成功,显然 Liberica Native Image Kit for Java 19 尚不支持。https: //bell-sw.com/pages/downloads/native-图像套件/#/nik-22-19

dan*_*1st 4

让我为您提供降级 Java 版本的替代方案(例如,如果您想使用虚拟线程)。

您可能会成功使用 GraalVM 而不是 Liberica NIK。您可以按照Spring Boot 文档部分中的pom.xml描述进行配置:Use an alternative native image toolkit

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <image>
            <buildpacks>
                <buildpack>gcr.io/paketo-buildpacks/graalvm</buildpack>
                <buildpack>gcr.io/paketo-buildpacks/java-native-image</buildpack>
            </buildpacks>
        </image>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

由于GraalVM Buildpack 支持 Java 19,因此您应该能够使用它:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <image>
            <buildpacks>
                <buildpack>gcr.io/paketo-buildpacks/graalvm</buildpack>
                <buildpack>gcr.io/paketo-buildpacks/java-native-image</buildpack>
            </buildpacks>
            <env>
                <BP_JVM_VERSION>19.0.1</BP_JVM_VERSION>
            </env>
        </image>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

作为替代方案,可以不使用构建包来创建本机映像,而是使用本机构建工具入门创建本机mvn -Pnative package可执行文件

然后,您可以创建自己的 docker 映像(例如使用Dockerfile或类似的映像)并将其包含在内。