|
该版本仍在开发中,尚未被视为稳定。最新稳定版本请使用Spring Shell 3.4.1! |
架构
本节将介绍如何构建 Spring Shell 应用程序。
首先
-
弹壳起始剂
| 名称 | 描述 |
|---|---|
弹壳起动器 |
基础Spring Shell模块 |
春壳起始者-jansi |
与JLine jansi provider |
弹壳起始器 JNI |
使用 JLine JNI 提供商 |
弹壳起子 JNA |
与JLine联合会提供者合作 |
Spring-壳-起动器-ffm |
使用 JLine ffm provider(需要 JDK22+) |
Spring Shell起始测试 |
Spring Shell测试支持 |
终端提供商
与程序正在运行的底层终端交互传统上是一个相对复杂的过程,虽然看起来像是其实没发生太多事情,因为全都是文本。
还记得那些老式手动打字机或矩阵打印机吗?打印一个字符后,光标需要移动;如果打印位置不同,简而言之,这就是当前终端模拟器的工作原理。
为了更好地访问和理解现有终端仿真器环境,JLine 可以通过其共享库使用本地代码。JLine 检测有哪些提供者存在,然后选择使用哪一个。传统上有 3 个提供者,詹西,JNI和JNA哪 它们应提供相同的功能。
我们的发酵剂可以用来专门采摘这些JLine 提供商。
FFM
跟JDK22一个外部函数和内存API从预览版中发布出来据说是替代JNI提供更好的更安全的原生 API。
起点3.4.x我们增加了对编译Spring Shell的支持应用程序JLine FFM终端提供者。这显然意味着该应用程序需要运行JDK22+. 有一个新的 JDK中间版本每 6个月发布一次,长期支持(LTS)版本每两年一次。在已有 LTS 版本之前,Spring Shell 可以与 Spring Framework 对齐,我们将使用最新的 JDK 版本。 明显地 这意味着你可能需要在一个不方便的时间内升级你的JDK如果你选择使用,时间FFM. 我们也被绑定在JDK版本JLine它本身用于编译其FFM部件。
FFM本身会导致jvm在某些部分出现时打印警告 使用。 这些警告显然对终端应用来说很烦人,因为它们可能会干扰并造成一些混乱。在未来的 JDK 版本中,这些警告也会被添加到较旧的 JNI 模块中,在某个阶段,这些警告将被改为硬性错误。用户将被要求手动启用这些原生“不安全”部件。
命令行中的JVM选项是:
--enable-native-access=ALL-UNNAMED
如果你有jar文件,可以在它的元步兵/显化。双人.
Enable-Native-Access: ALL-UNNAMED
这些可以在构建过程中添加,比如使用 gradle:
tasks.named("bootJar") {
manifest {
attributes 'Enable-Native-Access': 'ALL-UNNAMED'
}
}
| 启用 JDK 原生部件时,JLine 是主动的,并且已经有检查,如果原生访问未被启用,会抛出错误。 |
本地支持
将 Spring Shell 应用编译成 GraalVM 二进制文件的支持主要来自 Spring Framework 和 Spring Boot,其中功能称为AOT。提前准备的意思是应用上下文已经准备好在编译过程中,准备用于 GraalVM 生成。
基于AOT的框架构建Spring Shell的自己的GraalVM配置,提供提示,应该存在于二进制文件中。通常问题来自第三方库,这些库尚未包含GraalVM相关的配置,或者那些配置不完整。
通常需要使用 GraalVM 可访问元数据仓库,该为第三方库提供了一些缺失的提示。另外,你需要安装 GraalVM 和JAVA_HOME指向那个。 |
对于 gradle,添加 graalvm 的原生插件并配置元数据仓库。
plugins {
id 'org.graalvm.buildtools.native' version '0.9.16'
}
graalvmNative {
metadataRepository {
enabled = true
}
}
当 gradle 构建运行时./gradlew nativeCompile你应该买二进制 下build/native/nativeCompile目录。
为梅文用Spring靴启动父作为家长,你会得到本地配置文件,可以用来进行本地编译。你需要配置元数据仓库:
<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你应该买二进制 下目标目录。
如果一切顺利,这个二进制文件可以直接运行,而不是通过 JVM 执行启动应用 jar。