此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Shell 3.3.3! |
架构
本节介绍如何构建 Spring Shell 应用程序。
首先
-
Spring Shell 起动器
名字 | 描述 |
---|---|
spring-shell-starter (Spring ShellStarters) |
基本 Spring Shell 模块 |
spring-shell-starter-jansi |
使用 JLine jansi 提供程序 |
spring-shell-starter-jni |
使用 JLine jni 提供程序 |
spring-shell-starter-jna |
使用 JLine jna 提供程序 |
spring-shell-starter-ffm |
使用 JLine ffm 提供程序(需要 JDK22+) |
spring-shell-starter-test |
Spring Shell 测试支持 |
终端提供商
与运行程序的底层终端交互具有 传统上是相对复杂的过程,而它可能看起来像 没有发生太多事情,因为都只是文本。
还记得那些老式的手动打字机或矩阵打印机吗? 在光标所在的位置打印一个字符,然后需要移动该字符 如果在其他位置打印。简而言之,这就是当前的 终端仿真器工作。
为了更好地访问和了解现有的终端仿真器环境
JLine 可以通过自己的共享库使用本机代码。JLine 检测
存在哪些提供商,然后选择使用哪个提供商。
传统上,有 3 个提供商、 和
应该都提供相同的功能。jansi
jni
jna
我们的Starters可以专门用于挑选其中一些 JLine 供应商。
实况调查员
使用外部函数和内存 API 从预览版中出来
这应该是提供更好的替代品
以及更安全的原生 API。JDK22
JNI
从 我们添加了对编译 Spring Shell 的支持
应用程序。这显然意味着
该应用程序需要与 一起运行。有一个新的 JDK
每 6 个月发布一次中间版本和长期支持 (LTS) 版本
每 2 年一次。在有现有的 LTS 版本之前,Spring Shell 可以
与 Spring Framework 保持一致,我们将使用最新的 JDK 版本。明显地
这意味着您可能需要在不方便的情况下升级您的 JDK
time (如果您选择使用 .我们还绑定到 JDK 版本本身用于编译其部分。3.4.x
JLine
ffm
JDK22+
ffm
JLine
ffm
FFM 本身将导致 jvm 在它的某些部分出现时打印警告 使用。这些警告显然对终端应用程序很烦人 因为它可能会干扰并造成一点混乱。在未来的 JDK 中 版本中,这些警告也会为较旧的 JNI 模块和 在某些时候,这些警告将更改为硬错误。用户将 需要手动启用这些原生 “unsafe” 部分。
JVM 选项为:
--enable-native-access=ALL-UNNAMED
如果您有 jar 文件,则可以在其 .META-INF/MANIFEST.MF
Enable-Native-Access: ALL-UNNAMED
可以在构建期间添加,例如,如果使用 gradle:
tasks.named("bootJar") {
manifest {
attributes 'Enable-Native-Access': 'ALL-UNNAMED'
}
}
在 JDK 中启用本机部件时,JLine 一直是 proactive 并且已经对此进行了检查,并且如果 未启用 Native Access。 |
本机支持
支持将 Spring Shell 应用程序编译为 GraalVM 二进制文件 主要来自 Spring Framework 和 Spring Boot,其中 feature 为 称为 AOT。Ahead of Time 表示已准备好应用程序上下文 在编译期间为 GraalVM 生成做好准备。
从框架构建 AOT 功能 Spring Shell 有其 自己的 GraalVM 配置提供提示 一个二进制文件。通常问题来自第三方库,而 3rd 方库没有 但包含 GraalVM 相关配置或这些配置 是不完整的。
需要使用 GraalVM Reachability Metadata Repository,它
为第三方库提供了一些缺失的提示。此外,您还需要安装 GraalVM 并指向它。JAVA_HOME |
对于 gradle,请添加 graalvm 的原生插件并配置元数据存储库。
plugins {
id 'org.graalvm.buildtools.native' version '0.9.16'
}
graalvmNative {
metadataRepository {
enabled = true
}
}
运行 gradle build 时,您应该获取二进制文件
在 directory 下。./gradlew nativeCompile
build/native/nativeCompile
用作父级,您将获得可用于进行编译的配置文件。您需要配置元数据存储库maven
spring-boot-starter-parent
native
<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-parent native-maven-plugin |
运行 maven build 时,您应该获取二进制文件
在 directory 下。./mvnw native:compile -Pnative
target
如果一切顺利,此二进制文件可以按原样运行,而不是执行 通过 JVM 引导应用程序 jar。