此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 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 供应商。
实况调查员
跟JDK22
外部函数和内存 API 从预览版中推出
它应该是JNI
提供更好的
以及更安全的原生 API。
起价3.4.x
我们添加了对编译 Spring Shell 的支持
应用程序JLine
ffm
终端提供商。这显然意味着
该应用程序需要使用JDK22+
.有一个新的 JDK
每 6 个月发布一次中间版本和长期支持 (LTS) 版本
每 2 年一次。在有现有的 LTS 版本之前,Spring Shell 可以
与 Spring Framework 保持一致,我们将使用最新的 JDK 版本。明显地
这意味着您可能需要在不方便的情况下升级您的 JDK
time (如果您选择使用ffm
.我们还绑定到 JDK 版本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 使用./gradlew nativeCompile
你应该得到二进制
下build/native/nativeCompile
目录。
为maven
用spring-boot-starter-parent
作为 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 与./mvnw native:compile -Pnative
你应该得到二进制
下target
目录。
如果一切顺利,此二进制文件可以按原样运行,而不是执行 通过 JVM 引导应用程序 jar。