Closed8

Quarkus Getting Started

たまぬぎたまぬぎ

Step 1 Install via Command Line Interface

以下のコマンドで quarkus のCLI をインストール

$ curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio

以前は mvn だった気がするが、いつの間にかCLIできた?

たまぬぎたまぬぎ
[jbang] Type in your choice (0 or 1) and hit enter. Times out after 10 seconds.
[jbang] [ERROR] Could not parse answer as a number. Aborting
[jbang] [ERROR] https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/2.6.1.Final/quarkus-cli-2.6.1.Final-runner.jar is not from a trusted source and user did not confirm trust thus aborting.
If you trust the url to be safe to run are here a few suggestions:
Limited trust:
     jbang trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/
Trust all subdomains:
    jbang trust add *.repo1.maven.org
Trust all sources (WARNING! disables url protection):
    jbang trust add *

で怒られた。

以下のコマンドで jbang trust add してあげる

$ curl -Ls https://sh.jbang.dev | bash -s - trust add "*.repo1.maven.org"
たまぬぎたまぬぎ

インストールできたかと思ったけど、 Unknown command: quarkus で怒られる。

jbang はインストール時に .bash_profile にPATHを設定するようにしてくれるが、fishを使っているので
PATHが通っていなかった

~/.bash_profile
export PATH="$HOME/.jbang/bin:$PATH"

config.fishに以下を追記してPATHを通してあげれば ok

~/.config/fish/config.fish
fish_add_path $HOME/.jbang/bin
たまぬぎたまぬぎ

Step 2. Create the Getting Started Application

quarkus create でプロジェクトを作成できるみたい

$ quarkus create --help
Create a new project.

Usage: quarkus create [-eh] [--verbose] [COMMAND]

Options:
  -e, --errors    Display error messages.
      --verbose   Verbose mode.
  -h, --help      Display this help message.

Commands:
  app        Create a Quarkus application project.
  cli        Create a Quarkus command-line project.
  extension  Create a Quarkus extension project

application 以外にもcli extension が作成できるのはよさそう。
quarkus create のみだと quarkus create app が実行されるみたい?

quarkus create app には色々指定できる

$ quarkus create app --help

Create a Quarkus application project.

Usage: quarkus create app [-Beh] [--dry-run] [--refresh] [--[no-]
                          registry-client] [--verbose] [--config=CONFIG]
                          [-o=OUTPUT-DIR] [-D=<String=String>]... [-x=EXTENSION
                          [,EXTENSION...]]... [-S=platformKey:streamId |
                          -P=groupId:artifactId:version] [--jbang | --maven |
                          --gradle | --gradle-kotlin-dsl] [--java | --kotlin |
                          --scala] [[--[no-]wrapper] [--[no-]code]
                          [--package-name=PACKAGE-NAME] [-c=<appConfig>]]
                          [[GROUP-ID:]ARTIFACT-ID[:VERSION]]

This command will create a Java project in a new ARTIFACT-ID directory

      [[GROUP-ID:]ARTIFACT-ID[:VERSION]]
                            Java project identifiers
                              default: org.acme:code-with-quarkus:1.0.0-SNAPSHOT
                              Examples:
                                 my-project
                                 my.group:my-project
                                 my.group:my-project:0.1

Options:
  -B, --batch-mode          Run in non-interactive (batch) mode.
      --dry-run             Show actions that would be taken.
  -e, --errors              Display error messages.
      --verbose             Verbose mode.
      --refresh             Refresh the local Quarkus extension registry cache
      --config=CONFIG       Configuration file
      --[no-]registry-client
                            Use the Quarkus extension catalog
  -h, --help                Display this help message.
  -o, --output-directory=OUTPUT-DIR
                            The directory to create the new project in.
  -D=<String=String>        Java properties
  -x, --extension=EXTENSION[,EXTENSION...]
                            Extension(s) to add to the project.
                              Default: []

Quarkus version:
  -S, --stream=platformKey:streamId
                            A target stream, for example:
                              io.quarkus.platform:2.0
  -P, --platform-bom=groupId:artifactId:version
                            A specific Quarkus platform BOM, for example:
                              io.quarkus.platform:quarkus-bom:2.2.0.Final
                              io.quarkus::999-SNAPSHOT  2.2.0.Final
                            Default groupId: io.quarkus.platform
                            Default artifactId: quarkus-bom


Build tool (Maven):
      --jbang               Use JBang (Java only)
      --maven               Use Maven
      --gradle              Use Gradle
      --gradle-kotlin-dsl   Use Gradle with Kotlin DSL

Target language (Java):
      --java                Use Java
      --kotlin              Use Kotlin
      --scala               Use Scala

Code Generation:
      --[no-]wrapper        Include a buildtool wrapper (e.g. mvnw, gradlew)
      --[no-]code           Include starter code provided by extensions or
                              generate an empty project
      --package-name=PACKAGE-NAME
                            Base package for generated classes
  -c, --app-config=<appConfig>
                            Configuration attributes to be set in the
                              application.properties/yml file. Specify as
                              'key1=value1,key2=value2'

For example (using default values), a new Java project will be created in a
'code-with-quarkus' directory; it will use Maven to build an artifact with
GROUP-ID='org.acme', ARTIFACT-ID='code-with-quarkus', and VERSION='1.0.0
-SNAPSHOT'.
たまぬぎたまぬぎ

以下のコマンドでプロジェクトを作成

ビルドツールはMavenでいいし、TargetLangもjavaでいいので、プロジェクト名まわりだけ指定する

$ quarkus create app com.tamanugi:quarkus-learn:1.0

作成されたものは

$ tree quarkus-learn/
quarkus-learn/
├── README.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── docker
    │   │   ├── Dockerfile.jvm
    │   │   ├── Dockerfile.legacy-jar
    │   │   ├── Dockerfile.native
    │   │   └── Dockerfile.native-distroless
    │   ├── java
    │   │   └── com
    │   │       └── tamanugi
    │   │           └── GreetingResource.java
    │   └── resources
    │       ├── META-INF
    │       │   └── resources
    │       │       └── index.html
    │       └── application.properties
    └── test
        └── java
            └── com
                └── tamanugi
                    ├── GreetingResourceTest.java
                    └── NativeGreetingResourceIT.java

13 directories, 13 files

Dockerfile まで生成してくれるのか・・・ 👀

たまぬぎたまぬぎ

Step 3 Run the Getting Started Application

起動は以下のコマンド

$ quarks dev

初回は依存関係を落としてくるので時間がかかる 🕧

以下のような出力が出たら 🙆‍♂️

Listening for transport dt_socket at address: 5005
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2021-12-29 16:38:15,645 INFO  [io.quarkus] (Quarkus Main Thread) quarkus-learn 1.0 on JVM (powered by Quarkus 2.6.1.Final) started in 0.727s. Listening on: http://localhost:8080

2021-12-29 16:38:15,652 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2021-12-29 16:38:15,653 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx]


--
All 1 test is passing (0 skipped), 1 test was run in 6030ms. Tests completed at 16:38:36.
Press [r] to re-run, [o] Toggle test output, [h] for more options>

この状態でテストまでしてくれるし、再実行もできるみたい。すごい。

http://localhost:8080 にブラウザでアクセスするとWelcomページが表示される

たまぬぎたまぬぎ

Step 4 Live Coding with Quarkus

ブラウザで http://localhost:8080/hello を開くと Hello RESTEasy が表示されている。

この状態で src/main/java/GreetingsResource.java を変更してみる

src/main/java/GreetingsResource.java
package com.tamanugi;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
-        return "Hello RESTEasy";
+        return "Hello world";
    }
}

ブラウザをリロードすると Hello world に表示が切り替わっている 🎉

コンソールを確認すると、テスト失敗しているのがわかる。便利すぎぃ

terminal
: java.lang.AssertionError: 1 expectation failed.
Response body doesn't match expectation.
Expected: is "Hello RESTEasy"
  Actual: Hell RESTEasy

	at io.restassured.internal.ValidatableResponseImpl.body(ValidatableResponseImpl.groovy)
	at com.tamanugi.GreetingResourceTest.testHelloEndpoint(GreetingResourceTest.java:18)
このスクラップは2021/12/29にクローズされました