2020年8月17日 | Leave a comment https://blog.csdn.net/weixin_34072637/article/details/88835946 摘要: mvn dependency:build-classpath -DincludeTypes=jar -Dmdep.outputFile=classpath.txt jshell –class-path cat classpath.txt:target/classes “$@“ 原文: 为什么要用jshell 在IDE中创建一个项目来研究和学习框架太重量级了, 我需要一个轻量的解决方案. 调用一个方法, 它可以马上在终端中打印返回值的内容. Jshell 是一个(REPL)交互式解释器, 一般作为学习如何使用类的练习场, 方法. 可以立即看到输出结果, 而不需要创建一个重量级的Java项目来学习如何调用类的方法. 因为我有洁癖, 我喜欢保持工程目录干净整洁, 我不喜欢在我正式的项目中去练习如何使用框架的代码. JShell 是JDK9的一个新功能. 我们如何把它和Maven结合起来了. 原理很简单, 那就是CLASSPATH. jshell 有一个 --class-path 参数可以指定 jar 包的位置, 因此, 我们需要知道Maven项目中所有依赖<dependency>的CLASSPATH. 1 ➜ / jshell -h 用法: jshell <选项> <加载文件> 其中, 可能的选项包括: –class-path <路径> 指定查找用户类文件的位置 –module-path <路径> 指定查找应用程序模块的位置 –add-modules <模块>(,<模块>)* 指定要解析的模块; 如果 <模块> 为 ALL-MODULE-PATH, 则为模块路径中的所有模块 –startup <文件> 对启动定义执行单次替换 –no-startup 不运行启动定义 –feedback <模式> 指定初始反馈模式。该模式可以是 预定义的 (silent, concise, normal 或 verbose), 也可是以前用户定义的 -q 无提示反馈。等同于: –feedback concise -s 真正无提示反馈。等同于: –feedback silent -v 详细反馈。等同于: –feedback verbose -J<标记> 直接将 <标记> 传递到运行时系统。 为每个运行时标记或标记参数使用一个 -J -R<标记> 将 <标记> 传递到远程运行时系统。 为每个远程标记或标记参数使用一个 -R -C<标记> 将 <标记> 传递到编译器。 为每个编译器标记或标记参数使用一个 -C –version 输出版本信息并退出 –show-version 输出版本信息并继续 –help 输出标准选项的此提要并退出 –help-extra, -X 输出非标准选项的帮助并退出 1 如何知道Maven项目中的CLASSPATH呢? 这样玩! mvn <span class="hljs-attr">dependency:</span>build-classpath -DincludeTypes=jar -Dmdep.outputFile=classpath.txt 1 mvn <span class="hljs-attr">dependency:</span>build-classpath -DincludeTypes=jar -Dmdep.outputFile=classpath.txt CLASSPATH 就输出到 classpath.txt 文件中了. 然后通过这个文件来向jshell说明CLASSPATH. 这样我们就可以把jshell和maven项目集成到一起了. 下面是一个完整的脚本. 一般放在Maven项目的根目录下: 1 #!/bin/bash if [ ! -d “target” ]; then echo “Please run it under a module directory. And make sure it’s not parent module directory. And make a maven install first” exit fi mvn dependency:build-classpath -DincludeTypes=jar -Dmdep.outputFile=classpath.txt jshell –class-path cat classpath.txt:target/classes “$@“ 1 保存到Maven项目的根目录, 名称为 jshell.sh 最后 sh> ./jshell.sh 来玩一个 SpringBoot 的 UriComponentsBuilder的例子 1 jshell> import org.springframework.web.util.* jshell> UriComponentsBuilder b = UriComponentsBuilder.newInstance() b ==> org.springframework.web.util.UriComponentsBuilder@544a2ea6 jshell> b.scheme(“https”) $6 ==> org.springframework.web.util.UriComponentsBuilder@544a2ea6 jshell> b.host(“segmentfault.com”) $7 ==> org.springframework.web.util.UriComponentsBuilder@544a2ea6 jshell> b.build() $8 ==> https://segmentfault.com jshell> b.pathSegment(“u”) $9 ==> org.springframework.web.util.UriComponentsBuilder@544a2ea6 jshell> b.build() $10 ==> https://segmentfault.com/u jshell> b.pathSegment(“developerworks”) $11 ==> org.springframework.web.util.UriComponentsBuilder@544a2ea6 jshell> b.build() $12 ==> https://segmentfault.com/u/developerworks jshell> b.queryParam(“hello”, “developerworks”) $13 ==> org.springframework.web.util.UriComponentsBuilder@544a2ea6 jshell> b.build() $14 ==> https://segmentfault.com/u/developerworks?hello=developerworks 1