Mavenで作ったJavaプロジェクトのmainメソッドのあるクラスを実行するにはmvn exec:javaコマンドを使ったりmvn spring-boot:runを使ったり、
あるいは実行可能jarファイルを作成してjava -jarで実行することが多かったですが、直接javaコマンドでも実行できることがわかったのでメモ。
mvn compileの後、
java -cp target/classes:$(mvn dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout) com.example.changeme.Main
com.example.changeme.Mainの部分を置換してください。
mvn dependency:build-classpath -q -Dmdep.outputFile=/dev/stdoutコマンドで参照しているjarのパスをまとめて出力できるのがポイントですね。
Spring Bootのサンプルで試してみます。
curl -s https://start.spring.io/starter.tgz \
-d artifactId=demo \
-d name=demo \
-d baseDir=demo \
-d packageName=com.example \
-d type=maven-project \
-d applicationName=DemoApplication | tar -xzvf -
cd demo
./mvnw compile
java -cp target/classes:$(./mvnw dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout) com.example.DemoApplication
ちゃんとSpring Bootアプリケーションが起動します。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.5.4)
2025-07-29T10:34:00.953+09:00 INFO 94084 --- [demo] [ main] com.example.DemoApplication : Starting DemoApplication using Java 21 with PID 94084 (/private/tmp/demo/target/classes started by tmaki in /private/tmp/demo)
2025-07-29T10:34:00.954+09:00 INFO 94084 --- [demo] [ main] com.example.DemoApplication : No active profile set, falling back to 1 default profile: "default"
2025-07-29T10:34:01.137+09:00 INFO 94084 --- [demo] [ main] com.example.DemoApplication : Started DemoApplication in 0.347 seconds (process running for 0.499)
何度も実行する場合は、build-classpathの情報を事前に保存しておいて、
./mvnw dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout > build-classpath.txt
実行時に参照すると起動が速くなります。
java -cp target/classes:$(cat build-classpath.txt) com.example.DemoApplication
pom.xmlに変更があればbuild-classpath.txtの更新を忘れずに。