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が通っていなかった
export PATH="$HOME/.jbang/bin:$PATH"
config.fish
に以下を追記してPATHを通してあげれば ok
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
を変更してみる
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
に表示が切り替わっている 🎉
コンソールを確認すると、テスト失敗しているのがわかる。便利すぎぃ
: 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)