此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Shell 3.3.3spring-doc.cn

架构

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

首先

  1. Spring Shell 起动器spring-doc.cn

名字 描述

spring-shell-starter (Spring ShellStarters)spring-doc.cn

基本 Spring Shell 模块spring-doc.cn

spring-shell-starter-jansispring-doc.cn

使用 JLine jansi 提供程序spring-doc.cn

spring-shell-starter-jnispring-doc.cn

使用 JLine jni 提供程序spring-doc.cn

spring-shell-starter-jnaspring-doc.cn

使用 JLine jna 提供程序spring-doc.cn

spring-shell-starter-ffmspring-doc.cn

使用 JLine ffm 提供程序(需要 JDK22+)spring-doc.cn

spring-shell-starter-testspring-doc.cn

Spring Shell 测试支持spring-doc.cn

终端提供商

与运行程序的底层终端交互具有 传统上是相对复杂的过程,而它可能看起来像 没有发生太多事情,因为都只是文本。spring-doc.cn

还记得那些老式的手动打字机或矩阵打印机吗? 在光标所在的位置打印一个字符,然后需要移动该字符 如果在其他位置打印。简而言之,这就是当前的 终端仿真器工作。spring-doc.cn

为了更好地访问和了解现有的终端仿真器环境 JLine 可以通过自己的共享库使用本机代码。JLine 检测 存在哪些提供商,然后选择使用哪个提供商。 传统上,有 3 个提供商、 和 应该都提供相同的功能。jansijnijnaspring-doc.cn

我们的Starters可以专门用于挑选其中一些 JLine 供应商。spring-doc.cn

实况调查员

使用外部函数和内存 API 从预览版中出来 这应该是提供更好的替代品 以及更安全的原生 API。JDK22JNIspring-doc.cn

从 我们添加了对编译 Spring Shell 的支持 应用程序。这显然意味着 该应用程序需要与 一起运行。有一个新的 JDK 每 6 个月发布一次中间版本和长期支持 (LTS) 版本 每 2 年一次。在有现有的 LTS 版本之前,Spring Shell 可以 与 Spring Framework 保持一致,我们将使用最新的 JDK 版本。明显地 这意味着您可能需要在不方便的情况下升级您的 JDK time (如果您选择使用 .我们还绑定到 JDK 版本本身用于编译其部分。3.4.xJLineffmJDK22+ffmJLineffmspring-doc.cn

FFM 本身将导致 jvm 在它的某些部分出现时打印警告 使用。这些警告显然对终端应用程序很烦人 因为它可能会干扰并造成一点混乱。在未来的 JDK 中 版本中,这些警告也会为较旧的 JNI 模块和 在某些时候,这些警告将更改为硬错误。用户将 需要手动启用这些原生 “unsafe” 部分。spring-doc.cn

JVM 选项为:spring-doc.cn

--enable-native-access=ALL-UNNAMED

如果您有 jar 文件,则可以在其 .META-INF/MANIFEST.MFspring-doc.cn

Enable-Native-Access: ALL-UNNAMED

可以在构建期间添加,例如,如果使用 gradle:spring-doc.cn

tasks.named("bootJar") {
    manifest {
        attributes 'Enable-Native-Access': 'ALL-UNNAMED'
    }
}
在 JDK 中启用本机部件时,JLine 一直是 proactive 并且已经对此进行了检查,并且如果 未启用 Native Access。

本机支持

支持将 Spring Shell 应用程序编译为 GraalVM 二进制文件 主要来自 Spring FrameworkSpring Boot,其中 feature 为 称为 AOT。Ahead of Time 表示已准备好应用程序上下文 在编译期间为 GraalVM 生成做好准备。spring-doc.cn

从框架构建 AOT 功能 Spring Shell 有其 自己的 GraalVM 配置提供提示 一个二进制文件。通常问题来自第三方库,而 3rd 方库没有 但包含 GraalVM 相关配置或这些配置 是不完整的。spring-doc.cn

需要使用 GraalVM Reachability Metadata Repository,它 为第三方库提供了一些缺失的提示。此外,您还需要安装 GraalVM 并指向它。JAVA_HOME

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

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

graalvmNative {
	metadataRepository {
        enabled = true
	}
}

运行 gradle build 时,您应该获取二进制文件 在 directory 下。./gradlew nativeCompilebuild/native/nativeCompilespring-doc.cn

用作父级,您将获得可用于进行编译的配置文件。您需要配置元数据存储库mavenspring-boot-starter-parentnativespring-doc.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-boot-starter-parentnative-maven-plugin

运行 maven build 时,您应该获取二进制文件 在 directory 下。./mvnw native:compile -Pnativetargetspring-doc.cn

如果一切顺利,此二进制文件可以按原样运行,而不是执行 通过 JVM 引导应用程序 jar。spring-doc.cn