はじめに
こんにちは、絶賛Java修行中の@fsd-shoyaです。
.javaファイルをすべてコンパイルして実行する。というコマンドを毎度叩くのに嫌気が差したので、再利用可能なワンライナーを書いてみました。
実行環境
$ echo $SHELL
/bin/bash
$ java --version
openjdk 21.0.1 2023-10-17
OpenJDK Runtime Environment (build 21.0.1+12-Ubuntu-222.04)
OpenJDK 64-Bit Server VM (build 21.0.1+12-Ubuntu-222.04, mixed mode, sharing)
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.3 LTS"
WSL2を使用しています
今回使用するコード
構成
本記事では複数ファイルをコンパイルして実行するため、2つのファイルを作成しています。
app/
├── Main.java
└── sub
└── Sub.java
コード
package app;
import app.sub.Sub;
public class Main{
public static void main(String[] args){
Sub.helloworld();
}
}
package app.sub;
public class Sub{
public static void helloworld(){
System.out.println("Hello, world");
}
}
Before
まずは今まで私が打っていたコードを見てみましょう。
javac app/Main.java app/sub/Sub.java
java app.Main
上記では、javacの引数にファイルを1つずつ追加しています。
今回扱うjavaファイルは2つだけなので大変ではありませんが、今後ファイルが増えていくことを考えると、より短く、汎用性のあるコマンドで実行出来るのが望ましいです。
改善してみる
それでは改善してみましょう。
まずはカレントディレクトリ以下のすべてのjavaファイルを取得します。
find ./ | grep java
次に、上記コマンドの返り値をjavacの引数にします。
find ./ | grep java | xargs javac
最後に、javaを実行すると完成です。
find ./ | grep java | xargs javac && java app.Main
正しく実行されると、Hello, world
と出力されるはずです。
After
出来上がったものがこちらになります。
find ./ | grep java | xargs javac && java app.Main
どんなにjavaファイルが増えてもこの1行で実行出来るようになりました。
だいぶスッキリしましたね。
おまけ
無事1行に収まりましたが、毎度入力するのも大変です。
そこで、シェルスクリプトにすることでより簡単に実行してみましょう!
appディレクトリのある場所でrunファイルを作成します。
vi run
#!/bin/bash
find ./ | grep java | xargs javac && java app.Main
runファイルの実行権限を付与して実行します。
chmod +x run
./run
正しく実行されると、先程と同様Hello, world
と出力されます。
さいごに
いかがでしたでしょうか?
コンパイルして実行の2ステップを1行で済ますことが出来ました。
Javaのみでなく、C言語などのコンパイル言語でも本記事を応用することで、コンパイルして実行することが出来るようになるかと思います。