大変お世話になっております。
反逆する武士
uematu tubasaです。
初回投稿日時:2023年7月17日(令和5年7月17日)
ITエンジニアとして働く人間でございますが、疲労困憊です。
マジで疲れて、睡眠不足です。
しかしながら、しっかりとJavaの勉強をしたいと思います。
Javaコマンドの基本的な問題
【問題】以下の2つのコードのクラスファイルを生成するためのコマンドを記述しなさい。
package b;
public class B{
}
package a;
import b.B;
public class A{
public static void main(String[] args){
B b = new B();
}
}
【回答】
javac a/A.java
java a/A
【解説】
JavaSE11からソースファイルモードが追加され、javaコマンドで.javaファイルを直接実行することができるようになりました。
この設問においては、AクラスのソースコードでBクラスを利用していることに着目します。
Aをコンパイルすることで、Aクラスが依存するBクラスも自動的にコンパイルされ、AとB両方のクラスファイルが生成されます。
したがって、aというパッケージのAクラスをjavacコマンドで生成することで、Bクラスも生成します。
その後、aというパッケージのAクラスを実行します。
この問題の重要な点は、クラスファイルを生成するためのコマンドを記述するようにとの指示にあります。
java a/A.javaとなると、実行するためのコマンドとしては有効ですが、クラスファイルを生成するわけではありません。
クラスやモジュールの依存関係を調べるためのコマンド
【問題】
クラスやモジュールの依存関係を調べるために使用するコマンドとして、正しいものを以下の選択肢から2つ選びなさい。
A. jmod describe
B. jdeps --list-deps
C. java hello.java
D. jar --show-module-resolution
E. java --show-module-resolution
【回答】B,E
【解説】
クラスの依存関係を調べるには、jdepsコマンドを使用します。
また、モジュールの依存関係を調べるためには、javaコマンドの--show-module-resolutionオプションを使用します。
したがって、選択肢BとEが正解となります。
ちなみに、選択肢Aのjmodコマンドはモジュールを作成するコマンドです。
また、選択肢Cはjavaコマンドのソースファイルモードによる実行です。
選択肢Dは複数のクラスをまとめてJarファイルを尽くすjarコマンドですが、このようなオプションは存在しません。
javacコマンドとjavaコマンドの出力先とクラスパスの関係性に関する問題
javacコマンドでは、-dオプションを使って、出力先を指定しない限り、ソースファイルと同じ場所にクラスファイルが出力されます。
javaコマンドでは、引数に完全修飾クラス名を指定します。
完全修飾クラス名をとディレクトリ構造はマッピングされているため、カレントディレクトリから見て完全修飾クラス名にマッピングされるディレクトリ構造が一致していないとクラスファイルを実行することはできません。
また、カレントディレクトリ以外にあるクラスファイルを実行するときは、javaコマンドに-cpオプションを付けて、クラスパスを指定します。
【問題】以下のプログラムをコンパイルし、実行するためのコマンドを以下の選択肢から選びなさい。
package ex15;
public class Sample {
private final String name;
public Sample(String name){
this.name = name;
}
}
package ex15;
import java.util.logger.Logger;
public class Main{
static final Logger logger = Logger.getAnonymousLogger();
public static void main(String[] args){
var d = new Sample("sample");
logger.info(d.toString());
}
}
A. javac ex15/Sample.java ex15/Main.java
java -cp build ex15.Main
B. javac -d build ex15/Sample.java ex15/Main.java
java -cp build ex15.Main
C. javac -d build ex15/Sample.java ex15/Main.java
java ex15.Main
D. javac -d build ex15/Sample.java ex15/Main.java
java build.ex15.Main
【回答】B
【解説】
選択肢Aは-dオプションなしでコンパイルしているため、ソースファイルと同じ場所にクラスファイルが出力されます。
しかし、Javaコマンドではbuildディレクトリをクラスパスに指定しているため、クラスファイルを見つけることができません。
選択肢Bは、-dオプションでbuild ディレクトリへのクラスファイル出力を指定した上で、javaコマンドのクラスパスにbuildディレクトリを指定しているので、このコマンドは実行できます。
※buildがディレクトリと気づくべきでした。
選択肢CはJavaコマンドでディレクトリを指定しておらず、選択肢DではJavaコマンドの完全修飾クラス名が間違っているため、コマンド失敗します。
以上です。