CLOVER🍀

That was when it all began.

Quarkusプロジェクト作成時に、Extension Codestartを含めないようにする

これは、なにをしたくて書いたもの?

Quarkusには、Extension Codestartというコード生成システムがあります。

Quarkus - Extension codestart

QuakusのExtension Codestartの配置場所について - CLOVER🍀

これはこれで便利なのですが、Javaソースコードは特に出力しなくても良いかなという時がまあまああり、その度に削除していたのですが。
そもそも出力しない方法があったので、メモしておきました。

環境

今回の環境は、こちら。

$ java --version
openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.2+8-Ubuntu-120.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 17.0.2, vendor: Private Build, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-104-generic", arch: "amd64", family: "unix"

ふつうにプロジェクトを作成してみる

まずは、ふつうにプロジェクトを作成してみます。Extensionは、なんとなくRESTEasy Reactiveにしておきました。

$ mvn io.quarkus.platform:quarkus-maven-plugin:2.7.5.Final:create \
    -DprojectGroupId=org.littlewings \
    -DprojectArtifactId=quarkus-example \
    -DprojectVersion=0.0.1-SNAPSHOT \
    -Dextensions="resteasy-reactive"

Extensionの選択と、Extension Codestartの適用の様子。

[INFO] Looking for the newly published extensions in registry.quarkus.io
[INFO] -----------
[INFO] selected extensions:
- io.quarkus:quarkus-resteasy-reactive

[INFO]
applying codestarts...
[INFO] 📚  java
🔨  maven
📦  quarkus
📝  config-properties
🔧  dockerfiles
🔧  maven-wrapper
🚀  resteasy-reactive-codestart

作成されたディレクトリおよびファイル。

$ tree quarkus-example
quarkus-example
├── README.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── docker
    │   │   ├── Dockerfile.jvm
    │   │   ├── Dockerfile.legacy-jar
    │   │   ├── Dockerfile.native
    │   │   └── Dockerfile.native-micro
    │   ├── java
    │   │   └── org
    │   │       └── littlewings
    │   │           └── ReactiveGreetingResource.java
    │   └── resources
    │       ├── META-INF
    │       │   └── resources
    │       │       └── index.html
    │       └── application.properties
    └── test
        └── java
            └── org
                └── littlewings
                    ├── NativeReactiveGreetingResourceIT.java
                    └── ReactiveGreetingResourceTest.java

13 directories, 13 files

このうち、Javaファイルは出力されなくてもいいかな、というのが今回の話です。

いったん、プロジェクトを削除。

$ rm -rf quarkus-example

Extension Codestartの内容を

QuarkusのApache Mavenに関するドキュメントには特に記載がないのですが、Extension Codestartの適用有無はnoCodeという
パラメーターで制御できるようです。

Quarkus - Building applications with Maven

試してみます。

mvn io.quarkus.platform:quarkus-maven-plugin:2.7.5.Final:create \
    -DprojectGroupId=org.littlewings \
    -DprojectArtifactId=quarkus-example \
    -DprojectVersion=0.0.1-SNAPSHOT \
    -Dextensions="resteasy-reactive" \
    -DnoCode

Extension Codestartから、🚀resteasy-reactive-codestartがなくなっています。

[INFO] selected extensions:
- io.quarkus:quarkus-resteasy-reactive

[INFO]
applying codestarts...
[INFO] 📚  java
🔨  maven
📦  quarkus
📝  config-properties
🔧  dockerfiles
🔧  maven-wrapper

結果。

$ tree quarkus-example
quarkus-example
├── README.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    └── main
        ├── docker
        │   ├── Dockerfile.jvm
        │   ├── Dockerfile.legacy-jar
        │   ├── Dockerfile.native
        │   └── Dockerfile.native-micro
        ├── java
        └── resources
            └── application.properties

5 directories, 9 files

Javaファイルと、index.htmlがなくなりました。まあ、index.htmlはいいかなと…。

とりあえず、目的は達成できました。

中身を

もう少し中身を見てみましょう。

プロジェクト作成時に指定できるパラメーターは、ソースコードを見た方がハッキリしますね。

https://github.com/quarkusio/quarkus/blob/2.7.5.Final/devtools/maven/src/main/java/io/quarkus/maven/CreateProjectMojo.java

ところで、以下の並びから「Extension Codestart」が除外されたというのは、どうやって確認しましょうか。

[INFO]
applying codestarts...
[INFO] 📚  java
🔨  maven
📦  quarkus
📝  config-properties
🔧  dockerfiles
🔧  maven-wrapper
🚀  resteasy-reactive-codestart

この絵文字の意味を追ったら良さそうだなと思って、ソースコードを見たらこんな定義がありました。

    LANGUAGE(true, 1, MessageIcons.toEmoji("U+1F4DA")),
    BUILDTOOL(true, 2, MessageIcons.toEmoji("U+1F528")),
    PROJECT(true, 3, MessageIcons.toEmoji("U+1F4E6")),
    CONFIG(true, 4, MessageIcons.toEmoji("U+1F4DD")),
    TOOLING(false, 5, MessageIcons.toEmoji("U+1F527")),
    CODE(false, 6, MessageIcons.toEmoji("U+1F680")),

https://github.com/quarkusio/quarkus/blob/2.7.5.Final/independent-projects/tools/codestarts/src/main/java/io/quarkus/devtools/codestarts/CodestartType.java#L7-L12

というわけで、🚀がExtension Codestartですね。

他には、Dockerfile、Maven Wrapperの出力有無をコントロールできそうではありますが、Apache Mavenによるプロジェクト作成では
Extension Codestartのみが扱えるようです。

https://github.com/quarkusio/quarkus/blob/2.7.5.Final/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/codestarts/quarkus/QuarkusCodestartProjectInputBuilder.java#L105-L138

まあ、困りませんが…。

デフォルトでは、Dockerfile、Maven Wrapper、Extension Codestartが出力されるように含まれていて、こちらに定義があります。

    public enum AppContent implements DataKey {
        BUILD_TOOL_WRAPPER,
        DOCKERFILES,
        CODE,
    }

https://github.com/quarkusio/quarkus/blob/2.7.5.Final/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/codestarts/quarkus/QuarkusCodestartCatalog.java#L43-L47

    private static final List<AppContent> FULL_CONTENT = Arrays.asList(AppContent.values());

https://github.com/quarkusio/quarkus/blob/2.7.5.Final/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/codestarts/quarkus/QuarkusCodestartProjectInputBuilder.java#L22

今回は、こんなところで。