在 JShell 中,如何从 Maven 项目导入类路径

In JShell, how to import classpath from a Maven project

我有一个正在开发的本地Maven 项目。我如何使用项目 class 路径和所有依赖项启动 jshell,以便我可以在 JShell 中测试项目或依赖项 classes。

参见In Maven, how to output the classpath being used?

根据:

jshell --help

运行 JShell 与:

jshell --class-path <path>

我写了一个简单的 shell 脚本放在执行搜索路径中:

Shell 脚本文件: mshell (for *inux)

mvn dependency:build-classpath -DincludeTypes=jar -Dmdep.outputFile=.cp.txt
jshell --class-path `cat .cp.txt`:target/classes

Shell 脚本文件: mshell (for Windows cmd.exe)

mvn dependency:build-classpath -DincludeTypes=jar -Dmdep.outputFile=.cp.txt
for /F %i in (.cp.txt) do jshell --class-path "%i;target/classes"

然后在maven项目目录下(对于多模块项目,一定要在模块目录下而不是父目录下),运行:

$ cd $MAVEN_PROJECT_HOME   #make sure module folder for multi-module project
$ mshell

gist link

感谢 Jay 指出 -DincludeTypes=jar maven 选项。

您可以使用 jshell-maven-plugin:

mvn com.github.johnpoth:jshell-maven-plugin:1.3:run

这将使用您项目的运行时路径启动 JShell 会话。如果您想包含测试依赖项,只需将 -DtestClasspath 添加到命令中即可。

注意: 插件希望项目已经构建。如果不是,请在插件之前调用适当的 Maven 构建阶段,例如:

mvn [install|compile|test-compile] com.github.johnpoth:jshell-maven-plugin:1.3:run

源代码:https://github.com/johnpoth/jshell-maven-plugin;欢迎贡献 :) 完全免责声明:我写了插件。

尽情享受吧!

改为使用 Groovy shell (groovysh) 并执行 groovy.grape.Grape.grab([group:"<maven group>", artifact:"<maven artifact ID>", version:"<version>"]) - 这将为您提供在类路径中具有必要 Maven 依赖项的 REPL。

不确定 jshell 是否比 Groovy shell 有任何值得 Maven 依赖项痛苦的优点。

由于 JDK bug 8177650,此处使用 --class-path 选项或从 maven 启动的解决方案将破坏包自动完成。这是与包自动完成一起使用的 bash one-liner:

CLASSPATH=`mvn dependency:build-classpath -DincludeTypes=jar -Dmdep.outputFile=/dev/stderr 2>&1 >/dev/null`:target/classes jshell