如何在 jshell 中为 spring 项目设置类路径

how to set classpath for spring project in jshell

我正在学习使用 spring 框架,我似乎找不到类似于 Django shell_plus 的工具。我想进入一个 java repl,我可以在其中访问我所有的 类、依赖项等。我用谷歌搜索并找到了 j-shell 和 spring-shell 但是 spring-shell 似乎不能满足我的需求,因为我需要能够实例化和玩我的 类,所以我去了j-shell。我唯一的问题是我不知道如何让 j-shell 知道我的 类 在哪里。我试过了

$ jshell --classpath "~/Desktop/path/to/project/"

我的项目目录是:

Project
 |
 +-- build.gradle
 |
 +-- build
 |     | 
 |     +-- libs and etc...
 +-- src
 |  |  
 |  +-- main
 |        |
 |        +-- java
 |              |
 |              com
 |               |
 |               +-- MyClass.java
 |               |
 |               +-- MyOtherClass.java
 |
 +-- settings.gradle
 +-- gradlew
 +-- default.nix

但是在 j-shell 中时,我无法访问 spring 框架或我的 类。如果这很重要,我在 nixos 上使用 emacs,而 nix 用于开发环境依赖性。感谢任何形式的帮助,谢谢。

我还尝试将类路径设置为位于 ~/home/.gradle/

中的罐子

我希望在 jshell repl 中访问 spring 框架 类 和我自己编写的框架。

有几种方法可以设置 jshell 会话的 class 路径。

  1. 启动时,输入 REPL 之前:

    $jshell --class-path <your_classpath>
    
  2. 在您已经进入 运行 REPL 会话之后:

    jshell>/env -class-path <your_classpath>
    

注意到 --class-path-class-path 之间的区别了吗?这不是错字。

  1. old-fashioned方式。在启动 jshell 之前设置一个 $CLASSPATH 环境变量:

    $export CLASSPATH=<your_classpath>
    $jshell
    

实际上还有第四种方法可以使 class 路径在 jshell 会话之间保持不变,因此您不必每次都设置它。它涉及创建一个 .jsh 启动文件,并设置和保存它。在 jshell 会话中,请参阅 /help 以了解更多信息。

我制作了一个 Gradle 插件到 运行 一个 jshell 控制台,在类路径中包含你项目的所有库: jshell-plugin ,一旦在你的构建设置中配置, 你只需要 运行:

$ gradle --console plain jshell

README 说明还有一个特殊的部分,用于在 Spring 引导项目中设置它并能够访问业务对象(Spring 上下文中的 bean:#spring-boot-applications:

jshell> var myUserService = ctx.App.getBean(MyUserService.class)

jshell> ctx.App.ppjson(myUserService.getByUsername("admin"))
{
  "name" : "Jhon",
  "lastName" : "Due",
  "username" : "admin",
  "age" : null
}

如果你没有使用 Gradle 并且你有一个旧的 Spring Boot 1.x 项目,你可以使用我制作的另一个项目,它不适用于现代 Spring 启动应用程序,但至少你不需要 Gradle 或来自 JDK9+ 发行版的 jshell 来使用你的代码和 spring 的 bean:spring-ctx-groovy