7 スクリプト
JShellスクリプトは、ファイル内にある一連のスニペットおよびJShellコマンド、1つのスニペットまたは行単位のコマンドです。
スクリプトはローカル・ファイルまたは次の事前定義済スクリプトのいずれかにできます。
スクリプト名 | スクリプトの内容 |
---|---|
DEFAULT |
共通で必要なインポート宣言が含まれています。このスクリプトは、他の起動スクリプトが提供されない場合に使用します。 |
JAVASE |
|
PRINTING |
JShellメソッドを定義し、PrintStreamのprint、printlnおよびprintfメソッドにリダイレクトされます。 |
TOOLING |
コマンドライン・インタフェースを使用して、 |
起動スクリプト
起動スクリプトには、JShellセッションが起動されたときにロードされるスニペットおよびコマンドが含まれています。デフォルトの起動スクリプトには、共通のインポート文が含まれています。必要に応じて、カスタム・スクリプトを作成できます。
起動スクリプトは、jshell
ツールがリセットされるたびにロードされます。リセットは、初期起動時に/reset
、/reload
および/env
コマンドで発生します。スクリプトを設定しない場合、デフォルトの起動スクリプトのDEFAULT
が使用されます。このデフォルト・スクリプトでは、共通して必要となるインポート宣言を定義しています。
ノート:
Java言語では、java.langパッケージが自動的にインポートされることを定義しているため、このパッケージを明示的にインポートする必要はありません。起動スクリプトを設定するには、/set start
コマンドを使用します。
jshell> /set start mystartup.jsh
jshell> /reset
| Resetting state.
すべての/set
コマンドと同様に、-retain
オプションを使用しないかぎり、設定の期間は現在のセッションです。通常、起動スクリプトの設定をテストする場合には、-retain
オプションは使用しません。希望する設定が見つかった場合、-retain
オプションを使用して、これを保持します。
jshell> /set start -retain
次回jshell
ツールを起動する際に、この起動スクリプトがロードされます。
起動スクリプトは、状態がリセットされた場合にのみ、現在のセッションにロードされることに注意してください。スクリプトの内容は格納されますが、スクリプトへの参照は格納されません。スクリプトは、/set start
コマンドが実行されたときにのみ読み込まれます。ただし、事前定義済スクリプトは参照によってロードされ、更新できるのは新しいリリースのJDKからです。
起動スクリプトは、--startup
コマンドラインのフラグで指定することもできます。
% jshell --startup mystartup.jsh
試用の場合、System.out.
接頭辞を必要としないメソッドを出力する場合に役立ちます。事前定義済のPRINTING
スクリプトを使用して、print、printlnおよびprintfメソッドにアクセスします。/set start
を使用すると複数の起動スクリプトを指定できます。次の例は、デフォルトのインポートおよび出力の両方の定義をロードする起動スクリプトを設定しています。
jshell> /set start -retain DEFAULT PRINTING
jshell> /exit
| Goodbye
% jshell
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell> println("Hello World!")
Hello World!
-retain
フラグを使用して、jshell
ツールの今後のセッションの起動スクリプトとしてこれらの事前定義済スクリプトを設定します。引数を指定しないで/set start
を使用すると、これらの起動スクリプトで定義された内容の詳細が表示されます。
コマンドラインで複数の起動スクリプトを設定するには、各スクリプトの--startup
フラグを使用します。
% jshell --startup DEFAULT --startup PRINTING
スクリプトの作成およびロード
スクリプトを使用して、セッション時に使用可能なインポート文およびコードでJShellセッションを設定します。
スクリプトの作成
エディタでスクリプトを外部で作成するか、JShellで入力した項目から生成することもできます。次のコマンドのいずれかを使用して、JShellセッションのエントリからスクリプトを作成します。
jshell> /save mysnippets.jsh
jshell> /save -history myhistory.jsh
jshell> /save -start mystartup.jsh
例に示された最初のコマンドは、現在のアクティブなスニペットをmysnippets.jsh
に保存します。示されている2番目のコマンドは、すべてのスニペットおよびコマンドの履歴を有効なものも無効なものもmyhistory.jsh
に保存します。示されている最後のコマンドは、現在の起動スクリプト設定の内容をmystartup.jsh
に保存します。指定されたファイル名は、有効なファイル・パスおよび名前にします。
スクリプトのロード
JShellセッションが起動されると、スクリプトはコマンドラインからロードできます。
% jshell mysnippets.jsh
/open
コマンドを使用すると、JShellセッション内でスクリプトをロードすることもできます。
jshell> /open PRINTING
JShellを介したコマンドライン・ツールへのアクセス
事前定義済のスクリプトTOOLING
は、jshell
ツール内で、javac
、javadoc
、javap
など、JDKのコマンドライン・ツールに直接アクセスできます。次のコマンドを実行して、jshell
ツールの起動時にTOOLING
スクリプトをロードします:
jshell TOOLING
または、次のコマンドを使用して、JShellセッション内でロードします:
jshell> /open TOOLING
TOOLING
スクリプトをロードしたら、run(String, String...)メソッドに名前および引数の配列を渡すことで、java.util.spi.ToolProviderインタフェースを実装した監視可能なツール・サービスを実行できます。tools()をコールして、実行可能なすべてのツールの名前のソート済リストを出力します。次に例を示します。
jshell> /open TOOLING
jshell> tools()
jar
javac
javadoc
javap
jdeps
jlink
jmod
jpackage
jshell> run("javac","--version")
javac 21
よく知られているJDKツールの場合、TOOLING
スクリプトは、javac(String... args) { run("javac", args); }
などの便利なメソッドを定義します。これにより、前の例の最後のコールが次のように短縮されます:
jshell> javac("--version")
javac 21
また、TOOLING
スクリプトは、class
リテラルを取るjavap
メソッドを定義します。このメソッドを使用すると、JShellセッションを終了せずに、既存または新しく作成されたタイプの概要を逆アセンブルおよび出力できます。次に例を示します。
jshell> interface Empty {}
| created interface Empty
jshell> javap(Empty.class)
Classfile /C:/tmp/TOOLING-13600306095244067647.class
Last modified Oct 4, 2023; size 191 bytes
SHA-256 checksum 1e53e9d7d4549a00361937701d3b0a613b520a68854310796db7879efc08d195
Compiled from "$JShell$22.java"
public interface REPL.$JShell$22$Empty
minor version: 0
major version: 65
flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
this_class: #1 // REPL/$JShell$22$Empty
super_class: #3 // java/lang/Object
interfaces: 0, fields: 0, methods: 0, attributes: 3
Constant pool:
#1 = Class #2 // REPL/$JShell$22$Empty
#2 = Utf8 REPL/$JShell$22$Empty
#3 = Class #4 // java/lang/Object
#4 = Utf8 java/lang/Object
#5 = Utf8 SourceFile
#6 = Utf8 $JShell$22.java
#7 = Utf8 NestHost
#8 = Class #9 // REPL/$JShell$22
#9 = Utf8 REPL/$JShell$22
#10 = Utf8 InnerClasses
#11 = Utf8 Empty
{
}
SourceFile: "$JShell$22.java"
NestHost: class REPL/$JShell$22
InnerClasses:
public static #11= #1 of #8; // Empty=class REPL/$JShell$22$Empty of class REPL/$JShell$22
次のJShellスクリプトは、Greetings!
を出力するcom.greetings
という名前のモジュールを作成します。モジュールcom.greetings
を含むモジュラJARを作成し、そのモジュール宣言を出力します。その後、スクリプトは、モジュールcom.greetings
を含むjlink
ツールを使用してランタイム・イメージを作成します。
この例は、Project Jigsaw: モジュール・システム・クイックスタート・ガイドで説明されている例に基づいています。
/open PRINTING
print(
"""
-----------------------------------------------
Project Jigsaw: Module System Quick-Start Guide
-----------------------------------------------
""")
/* Create a module named com.greetings that prints "Greetings!". */
Files.createDirectories(Path.of("src/com.greetings/com/greetings"))
/* Create a module declaration named module-info.java */
Files.writeString(Path.of("src/com.greetings/module-info.java"),
"""
module com.greetings {}
""")
/* Create the main class */
Files.writeString(Path.of("src/com.greetings/com/greetings/Main.java"),
"""
package com.greetings;
public class Main {
public static void main(String[] args) {
System.out.println("Greetings!");
}
}
""")
/open TOOLING
/* Compile the source code to the directory to the directory mods/com.greetings */
javac("-d", "mods", "--module", "com.greetings", "--module-source-path", "src")
/* Create a modular JAR that contains the module greetings.com. */
jar("--create", "--file=mlib/com.greetings.jar", "--main-class=com.greetings.Main", "-C", "mods/com.greetings", ".")
/* Print the module declaration of the modular JAR com.greetings */
jar("--describe-module", "--file=mlib/com.greetings.jar")
/* Create a runtime image in the folder greetingsruntime that contains the module com.greetings. /*
jlink("--module-path", "mlib", "--add-modules", "com.greetings", "--output", "greetingsruntime", "--launcher", "greet=com.greetings")
/* You can run com.greetings.Main with this runtime as follows:
*
* greetingsruntime/bin/java --module com.greetings
*/
/exit