当前位置: 首页 > news >正文

JDK9: 集成 Jshell 和 Maven 项目.

为什么要用jshell

在IDE中创建一个项目来研究和学习框架太重量级了, 我需要一个轻量的解决方案. 调用一个方法, 它可以马上在终端中打印返回值的内容.

Jshell 是一个(REPL)交互式解释器, 一般作为学习如何使用类的练习场, 方法. 可以立即看到输出结果, 而不需要创建一个重量级的Java项目来学习如何调用类的方法.

因为我有洁癖, 我喜欢保持工程目录干净整洁, 我不喜欢在我正式的项目中去练习如何使用框架的代码.

JShell 是JDK9的一个新功能.

clipboard.png

我们如何把它和Maven结合起来了.

原理很简单, 那就是CLASSPATH.

jshell 有一个 --class-path 参数可以指定 jar 包的位置, 因此, 我们需要知道Maven项目中所有依赖<dependency>的CLASSPATH.

➜  / 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      输出非标准选项的帮助并退出

如何知道Maven项目中的CLASSPATH呢?

这样玩!

mvn dependency:build-classpath -DincludeTypes=jar -Dmdep.outputFile=classpath.txt

CLASSPATH 就输出到 classpath.txt 文件中了.

然后通过这个文件来向jshell说明CLASSPATH. 这样我们就可以把jshell和maven项目集成到一起了.

下面是一个完整的脚本. 一般放在Maven项目的根目录下:

#!/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 "$@"

保存到Maven项目的根目录, 名称为 jshell.sh

最后

sh> ./jshell.sh

来玩一个 SpringBoot 的 UriComponentsBuilder的例子

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

相关文章:

  • PE文件结构深入详解
  • 【HTTP】Speed and Mobility: An Approach for HTTP 2.0 to Make Mobile Apps and the Web Faster
  • 蛰伏多年的 HTML5 创业者,终于被送上了风口
  • android开发(34) 自定义 listView的分割线( 使用xml drawable画多条线)
  • elasticsearch常用操作命令
  • 【实习记】2014-09-04浏览代码查middle资料+总结我折腾过的源码浏览器
  • 查找字符串中出现最多的字符
  • xshell 4 中文乱码问题解决
  • Html的空格显示
  • Java基础-Date类常用方法介绍
  • 910
  • 区块链研习 | DAG网络:Blockless无区块概念将解决区块链交易性能问题
  • jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)
  • 干货 | 手把手教你用python实现新浪微博模拟登陆,超详细
  • 百度编辑器ueditor 在vs2008中的使用方法
  • Android组件 - 收藏集 - 掘金
  • git 常用命令
  • k个最大的数及变种小结
  • MaxCompute访问TableStore(OTS) 数据
  • SpingCloudBus整合RabbitMQ
  • Vue.js源码(2):初探List Rendering
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 好的网址,关于.net 4.0 ,vs 2010
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 小程序测试方案初探
  • 在Unity中实现一个简单的消息管理器
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # 透过事物看本质的能力怎么培养?
  • #pragma预处理命令
  • #在 README.md 中生成项目目录结构
  • $refs 、$nextTic、动态组件、name的使用
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (一)为什么要选择C++
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (原創) 未来三学期想要修的课 (日記)
  • (转)linux下的时间函数使用
  • (转)母版页和相对路径
  • .NET Core 2.1路线图
  • .NET 发展历程
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .Net下的签名与混淆
  • .NET运行机制
  • @Controller和@RestController的区别?
  • @property括号内属性讲解
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [] 与 [[]], -gt 与 > 的比较
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [Angular] 笔记 18:Angular Router