该版本仍在开发中,尚未被视为稳定。最新稳定版本请使用Spring Shell 3.4.1spring-doc.cadn.net.cn

架构

本节将介绍如何构建 Spring Shell 应用程序。spring-doc.cadn.net.cn

首先

  1. 弹壳起始剂spring-doc.cadn.net.cn

名称 描述

弹壳起动器spring-doc.cadn.net.cn

基础Spring Shell模块spring-doc.cadn.net.cn

春壳起始者-jansispring-doc.cadn.net.cn

与JLine jansi providerspring-doc.cadn.net.cn

弹壳起始器 JNIspring-doc.cadn.net.cn

使用 JLine JNI 提供商spring-doc.cadn.net.cn

弹壳起子 JNAspring-doc.cadn.net.cn

与JLine联合会提供者合作spring-doc.cadn.net.cn

Spring-壳-起动器-ffmspring-doc.cadn.net.cn

使用 JLine ffm provider(需要 JDK22+)spring-doc.cadn.net.cn

Spring Shell起始测试spring-doc.cadn.net.cn

Spring Shell测试支持spring-doc.cadn.net.cn

终端提供商

与程序正在运行的底层终端交互传统上是一个相对复杂的过程,虽然看起来像是其实没发生太多事情,因为全都是文本。spring-doc.cadn.net.cn

还记得那些老式手动打字机或矩阵打印机吗?打印一个字符后,光标需要移动;如果打印位置不同,简而言之,这就是当前终端模拟器的工作原理。spring-doc.cadn.net.cn

为了更好地访问和理解现有终端仿真器环境,JLine 可以通过其共享库使用本地代码。JLine 检测有哪些提供者存在,然后选择使用哪一个。传统上有 3 个提供者,詹西,JNIJNA哪 它们应提供相同的功能。spring-doc.cadn.net.cn

我们的发酵剂可以用来专门采摘这些JLine 提供商。spring-doc.cadn.net.cn

FFM

JDK22一个外部函数和内存API从预览版中发布出来据说是替代JNI提供更好的更安全的原生 API。spring-doc.cadn.net.cn

起点3.4.x我们增加了对编译Spring Shell的支持应用程序JLine FFM终端提供者。这显然意味着该应用程序需要运行JDK22+. 有一个新的 JDK中间版本每 6个月发布一次,长期支持(LTS)版本每两年一次。在已有 LTS 版本之前,Spring Shell 可以与 Spring Framework 对齐,我们将使用最新的 JDK 版本。 明显地 这意味着你可能需要在一个不方便的时间内升级你的JDK如果你选择使用,时间FFM. 我们也被绑定在JDK版本JLine它本身用于编译其FFM部件。spring-doc.cadn.net.cn

FFM本身会导致jvm在某些部分出现时打印警告 使用。 这些警告显然对终端应用来说很烦人,因为它们可能会干扰并造成一些混乱。在未来的 JDK 版本中,这些警告也会被添加到较旧的 JNI 模块中,在某个阶段,这些警告将被改为硬性错误。用户将被要求手动启用这些原生“不安全”部件。spring-doc.cadn.net.cn

命令行中的JVM选项是:spring-doc.cadn.net.cn

--enable-native-access=ALL-UNNAMED

如果你有jar文件,可以在它的元步兵/显化。双人.spring-doc.cadn.net.cn

Enable-Native-Access: ALL-UNNAMED

这些可以在构建过程中添加,比如使用 gradle:spring-doc.cadn.net.cn

tasks.named("bootJar") {
    manifest {
        attributes 'Enable-Native-Access': 'ALL-UNNAMED'
    }
}
启用 JDK 原生部件时,JLine 是主动的,并且已经有检查,如果原生访问未被启用,会抛出错误。

本地支持

Spring Shell 应用编译成 GraalVM 二进制文件的支持主要来自 Spring FrameworkSpring Boot,其中功能称为AOT。提前准备的意思是应用上下文已经准备好在编译过程中,准备用于 GraalVM 生成。spring-doc.cadn.net.cn

基于AOT的框架构建Spring Shell的自己的GraalVM配置,提供提示,应该存在于二进制文件中。通常问题来自第三方库,这些库尚未包含GraalVM相关的配置,或者那些配置不完整。spring-doc.cadn.net.cn

通常需要使用 GraalVM 可访问元数据仓库,该为第三方库提供了一些缺失的提示。另外,你需要安装 GraalVMJAVA_HOME指向那个。

对于 gradle,添加 graalvm 的原生插件并配置元数据仓库。spring-doc.cadn.net.cn

plugins {
	id 'org.graalvm.buildtools.native' version '0.9.16'
}

graalvmNative {
	metadataRepository {
        enabled = true
	}
}

当 gradle 构建运行时./gradlew nativeCompile你应该买二进制 下build/native/nativeCompile目录。spring-doc.cadn.net.cn

梅文Spring靴启动父作为家长,你会得到本地配置文件,可以用来进行本地编译。你需要配置元数据仓库:spring-doc.cadn.net.cn

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.graalvm.buildtools</groupId>
                <artifactId>native-maven-plugin</artifactId>
                <configuration>
                    <metadataRepository>
                        <enabled>true</enabled>
                    </metadataRepository>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
如果你依赖Spring靴启动父它能做到原生 Maven 插件该版本保持最新。

当Maven构建运行时./mvnw native:compile -Pnative你应该买二进制 下目标目录。spring-doc.cadn.net.cn

如果一切顺利,这个二进制文件可以直接运行,而不是通过 JVM 执行启动应用 jar。spring-doc.cadn.net.cn