我正在发现 JShell,并且发现默认添加的导入:
jshell> /imports
| import java.io.*
| import java.math.*
| import java.net.*
| import java.nio.file.*
| import java.util.*
| import java.util.concurrent.*
| import java.util.function.*
| import java.util.prefs.*
| import java.util.regex.*
| import java.util.stream.*
完成此操作后,我使用以下命令添加了自己的导入:
import java.lang.Math
有没有办法在不终止活动会话/重新启动的情况下删除后者导入?
我尝试发出
/edit
命令,删除导入,单击“接受”并单击“退出”,但这并没有成功。
如评论中所述,
/reset
删除导入,但它也删除先前在会话中输入的任何其他内容。有没有一种特定的方法可以仅删除导入语句?
经过一番搜索,我设法找到了解决方案。它是
/list
(了解要删除哪一行)和 /drop
的组合。
/drop [name[ name...]|id[ id...]]
删除一个片段,使其处于非活动状态。提供姓名或 ID 导入、类、方法或变量的。对于多个片段, 用空格分隔名称和 ID。使用
/list
命令查看 代码片段的 ID。
jshell> import java.lang.Math
jshell> /list
1 : import java.lang.Math;
jshell> /drop 1
jshell> /imports
| import java.io.*
| import java.math.*
| import java.net.*
| import java.nio.file.*
| import java.util.*
| import java.util.concurrent.*
| import java.util.function.*
| import java.util.prefs.*
| import java.util.regex.*
| import java.util.stream.*
$ jshell JAVASE
这会自动导入大约 200 个 Java SE 包。但存在重复的类名:List<Duration>
不明确(
java.awt.List
和
javax.xml.datatype.Duration
)。
jshell> List<Duration> list;
| Error:
| reference to List is ambiguous
| both class java.awt.List in java.awt and interface java.util.List in java.util match
| List<Duration> list;
| ^--^
| Error:
| reference to Duration is ambiguous
| both class javax.xml.datatype.Duration in javax.xml.datatype and class java.time.Duration in java.time match
| List<Duration> list;
| ^------^
这可以通过启动脚本来解决:
echo "/imports" | jshell JAVASE - | awk '{printf("%s %s;\n", $1, $2)}' > jshell-imports-tmp
remove_imports=(".awt." " org." " javax.")
printf '%s\n' "${remove_imports[@]}" | grep -Fvf - jshell-imports-tmp > jshell-imports
echo "/set start -retain jshell-imports" | jshell -
rm jshell-import*
检查它是否有效
jshell> List<Duration> list;
list ==> null