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 PRINTINGJShellを介したコマンドライン・ツールへのアクセス
事前定義済のスクリプトTOOLINGは、jshellツール内で、javac、javadoc、javapなど、JDKのコマンドライン・ツールに直接アクセスできます。次のコマンドを実行して、jshellツールの起動時にTOOLINGスクリプトをロードします: 
                  
jshell TOOLINGまたは、次のコマンドを使用して、JShellセッション内でロードします:
jshell> /open TOOLINGTOOLINGスクリプトをロードしたら、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 22
よく知られているJDKツールの場合、TOOLINGスクリプトは、javac(String... args) { run("javac", args); }などの便利なメソッドを定義します。これにより、前の例の最後のコールが次のように短縮されます:
                  
jshell> javac("--version")
javac 22
また、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