Quarkus のクィック・スタートでmvn dependency:treeをやってみた
はじめに
本エントリの内容は件名通りです。
プロジェクト生成のコマンド
以下のコマンドを使用しました。Quarkus: コンテナ上で Java アプリを高速起動する新しい手法のご紹介 | 寺田 佳央 - Yoshio Teradaに記載されているママですね。
$ mvn io.quarkus:quarkus-maven-plugin:0.11.0:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=getting-started \ -DclassName="org.acme.quickstart.GreetingResource" \ -Dpath="/hello"
pom.xmlの内容
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>org.acme</groupId> <artifactId>getting-started</artifactId> <version>1.0-SNAPSHOT</version> <properties> <surefire-plugin.version>2.22.0</surefire-plugin.version> <quarkus.version>0.11.0</quarkus.version> <maven.compiler.source>1.8</maven.compiler.source> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-bom</artifactId> <version>${quarkus.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-arc</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5</artifactId> </dependency> <dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.version}</version> <executions> <execution> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>${surefire-plugin.version}</version> <configuration> <systemProperties> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> </systemProperties> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>native</id> <activation> <property> <name>native</name> </property> </activation> <build> <plugins> <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.version}</version> <executions> <execution> <goals> <goal>native-image</goal> </goals> <configuration> <enableHttpUrlHandler>true</enableHttpUrlHandler> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>${surefire-plugin.version}</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> <configuration> <systemProperties> <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> </systemProperties> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> </project>
mvn dependency:treeの結果
以下の通りです。
$ mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building getting-started 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ getting-started --- [INFO] org.acme:getting-started:jar:1.0-SNAPSHOT [INFO] +- io.quarkus:quarkus-resteasy:jar:0.11.0:provided [INFO] | +- io.quarkus:quarkus-core:jar:0.11.0:provided [INFO] | | +- commons-beanutils:commons-beanutils-core:jar:1.8.3:provided [INFO] | | +- org.jboss.invocation:jboss-invocation:jar:1.5.1.Final:provided [INFO] | | +- org.wildfly.common:wildfly-common:jar:1.5.0.Final-format-001:provided [INFO] | | +- org.jboss.classfilewriter:jboss-classfilewriter:jar:1.2.4.Final:provided [INFO] | | +- io.quarkus.gizmo:gizmo:jar:1.0.0.Alpha2:provided [INFO] | | +- org.jboss:jandex:jar:2.1.1.Final:provided [INFO] | | +- org.ow2.asm:asm:jar:6.2.1:provided [INFO] | | +- io.quarkus:quarkus-core-runtime:jar:0.11.0:provided [INFO] | | | +- javax.inject:javax.inject:jar:1:provided [INFO] | | | +- io.smallrye:smallrye-config:jar:1.3.5:provided [INFO] | | | | \- org.eclipse.microprofile.config:microprofile-config-api:jar:1.3:provided [INFO] | | | | \- org.osgi:org.osgi.annotation.versioning:jar:1.0.0:provided [INFO] | | | +- org.jboss.logmanager:jboss-logmanager-embedded:jar:1.0.0:provided [INFO] | | | | \- com.oracle.substratevm:svm:jar:1.0.0-rc12:provided [INFO] | | | +- org.jboss.logging:jboss-logging-annotations:jar:2.1.0.Final:provided [INFO] | | | +- org.jboss.threads:jboss-threads:jar:3.0.0.Alpha4:provided [INFO] | | | +- org.slf4j:slf4j-api:jar:1.7.25:provided [INFO] | | | +- org.jboss.slf4j:slf4j-jboss-logging:jar:1.1.0.Final:provided [INFO] | | | +- org.graalvm.sdk:graal-sdk:jar:1.0.0-rc12:provided [INFO] | | | +- org.wildfly.security:wildfly-elytron-ssl:jar:2.0.0.Alpha1:provided [INFO] | | | | +- org.wildfly.security:wildfly-elytron-auth-server:jar:2.0.0.Alpha1:provided [INFO] | | | | | \- org.wildfly.security:wildfly-elytron-permission:jar:2.0.0.Alpha1:provided [INFO] | | | | +- org.wildfly.security:wildfly-elytron-base:jar:2.0.0.Alpha1:provided [INFO] | | | | +- org.wildfly.security:wildfly-elytron-credential:jar:2.0.0.Alpha1:provided [INFO] | | | | +- org.wildfly.security:wildfly-elytron-auth:jar:2.0.0.Alpha1:provided [INFO] | | | | +- org.wildfly.security:wildfly-elytron-util:jar:2.0.0.Alpha1:provided [INFO] | | | | \- org.wildfly.security:wildfly-elytron-x500:jar:2.0.0.Alpha1:provided [INFO] | | | \- org.wildfly.security:wildfly-elytron-x500-cert:jar:2.0.0.Alpha1:provided [INFO] | | | +- org.wildfly.security:wildfly-elytron-asn1:jar:2.0.0.Alpha1:provided [INFO] | | | \- org.wildfly.security:wildfly-elytron-x500-cert-util:jar:2.0.0.Alpha1:provided [INFO] | | \- io.quarkus:quarkus-builder:jar:0.11.0:provided [INFO] | +- io.quarkus:quarkus-resteasy-common:jar:0.11.0:provided [INFO] | | \- io.quarkus:quarkus-resteasy-common-runtime:jar:0.11.0:provided [INFO] | | \- org.jboss.resteasy:resteasy-core:jar:4.0.0.Beta8:provided [INFO] | | +- org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec:jar:1.0.2.Final:provided [INFO] | | +- org.jboss.spec.javax.xml.bind:jboss-jaxb-api_2.3_spec:jar:1.0.1.Final:provided [INFO] | | +- org.jboss.resteasy:resteasy-core-spi:jar:4.0.0.Beta8:provided [INFO] | | +- org.reactivestreams:reactive-streams:jar:1.0.2:provided [INFO] | | +- commons-io:commons-io:jar:2.5:provided [INFO] | | \- net.jcip:jcip-annotations:jar:1.0:provided [INFO] | +- io.quarkus:quarkus-undertow:jar:0.11.0:provided [INFO] | | +- io.undertow:undertow-servlet:jar:2.0.17.Final:provided [INFO] | | | +- io.undertow:undertow-core:jar:2.0.17.Final:provided [INFO] | | | \- org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec:jar:1.0.0.Final:provided [INFO] | | +- io.quarkus:quarkus-undertow-runtime:jar:0.11.0:provided [INFO] | | | +- org.jboss.xnio:xnio-nio:jar:3.6.5.Final:provided [INFO] | | | \- org.jboss.xnio:xnio-api:jar:3.6.5.Final:provided [INFO] | | \- org.jboss.metadata:jboss-metadata-web:jar:11.0.0.Final:provided [INFO] | | \- org.jboss.metadata:jboss-metadata-common:jar:11.0.0.Final:provided [INFO] | +- io.quarkus:quarkus-jaxb:jar:0.11.0:provided [INFO] | | \- io.quarkus:quarkus-jaxb-runtime:jar:0.11.0:provided [INFO] | \- io.quarkus:quarkus-resteasy-runtime:jar:0.11.0:provided [INFO] | +- javax.validation:validation-api:jar:2.0.1.Final:provided [INFO] | \- com.sun.activation:jakarta.activation:jar:1.2.1:provided [INFO] +- io.quarkus:quarkus-arc:jar:0.11.0:provided [INFO] | +- io.quarkus:quarkus-arc-runtime:jar:0.11.0:provided [INFO] | | \- io.quarkus.arc:arc-runtime:jar:0.11.0:provided [INFO] | \- io.quarkus.arc:arc-processor:jar:0.11.0:provided [INFO] | +- javax.enterprise:cdi-api:jar:2.0.SP1:provided [INFO] | | +- javax.el:javax.el-api:jar:3.0.0:provided [INFO] | | \- javax.interceptor:javax.interceptor-api:jar:1.2:provided [INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:provided [INFO] | \- javax.annotation:javax.annotation-api:jar:1.3.2:provided [INFO] +- io.quarkus:quarkus-junit5:jar:0.11.0:test [INFO] | +- io.quarkus:quarkus-test-common:jar:0.11.0:test [INFO] | | \- org.glassfish:javax.json:jar:1.1.4:test [INFO] | +- org.junit.jupiter:junit-jupiter-api:jar:5.3.2:test [INFO] | | +- org.apiguardian:apiguardian-api:jar:1.0.0:test [INFO] | | +- org.opentest4j:opentest4j:jar:1.1.1:test [INFO] | | \- org.junit.platform:junit-platform-commons:jar:1.3.2:test [INFO] | +- org.junit.jupiter:junit-jupiter-params:jar:5.3.2:test [INFO] | \- org.junit.jupiter:junit-jupiter-engine:jar:5.3.2:test [INFO] | \- org.junit.platform:junit-platform-engine:jar:1.3.2:test [INFO] \- io.rest-assured:rest-assured:jar:3.3.0:test [INFO] +- org.codehaus.groovy:groovy:jar:2.4.15:test [INFO] +- org.codehaus.groovy:groovy-xml:jar:2.4.15:test [INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.6:provided [INFO] | +- org.apache.httpcomponents:httpcore:jar:4.4.10:provided [INFO] | +- commons-logging:commons-logging:jar:1.2:provided [INFO] | \- commons-codec:commons-codec:jar:1.10:provided [INFO] +- org.apache.httpcomponents:httpmime:jar:4.5.3:test [INFO] +- org.hamcrest:hamcrest-core:jar:1.3:test [INFO] +- org.hamcrest:hamcrest-library:jar:1.3:test [INFO] +- org.ccil.cowan.tagsoup:tagsoup:jar:1.2.1:test [INFO] +- io.rest-assured:json-path:jar:3.3.0:test [INFO] | +- org.codehaus.groovy:groovy-json:jar:2.4.15:test [INFO] | \- io.rest-assured:rest-assured-common:jar:3.3.0:test [INFO] \- io.rest-assured:xml-path:jar:3.3.0:test [INFO] +- org.apache.commons:commons-lang3:jar:3.4:test [INFO] +- javax.xml.bind:jaxb-api:jar:2.3.1:provided [INFO] +- com.sun.xml.bind:jaxb-osgi:jar:2.2.10:test [INFO] \- org.apache.sling:org.apache.sling.javax.activation:jar:0.1.0:test [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.979 s [INFO] Finished at: 2019-03-13T21:19:58+09:00 [INFO] Final Memory: 26M/260M [INFO] ------------------------------------------------------------------------
さいごに
特にオチはないです。
読書メモ:Effective Java 第3版に第2版から追加された項目
はじめに
Effective Java 第3版に「付録 第2版に対応する項目」という章が存在します。
「この付録を使ったら、第3版で追加された項目が洗い出せるのでは?」と思いついたら洗い出してみたくなったので、洗い出しました。
第3版に第2版から追加された項目
以下が追加された項目のリストです。
- 第2章 オブジェクトの生成と消滅
- 項目 5 資源を直接結び付けるよりも依存性注入を選ぶ
- 項目 9 try-finallyよりも try-with-resourcesを選ぶ
- 第4章 クラスとインタフェース
- 項目 22 肩を定義するためだけにインタフェースを選ぶ
- 項目 25 ソースファイルを単一のトップレベルのクラスに限定する
- 第5章 ジェネリックス
- 項目 32 ジェネリックスと可変長引数を注意して組み合わせる
- 第7章 ラムダとストリーム
- 項目 43 ラムダよりもメソッド参照を選ぶ
- 項目 44 標準の関数型インタフェースを使う
- 項目 45 ストリームを注意して使う
- 項目 46 ストリームで副作用のない関数を選ぶ
- 項目 47 戻り値としてStream よりも Collection を選ぶ
- 項目 48 ストリームを並列化するときは注意を払う
- 第8章 メソッド
- 項目 55 オプショナルを注意して返す
- 第11章 並行性
- 項目 78 共有された可変データへのアクセスを同期する
読書メモ:Effective Java 第3版 項目45 ストリームを注意して使う
はじめに
Effective Java 第3版を読んだら勇気が湧いてくることが書いてあったのでメモ。
「項目45 ストリームを注意して使う」に勇気が湧いてくること書いてある
P207に以下のコードがあります。
try (Stream<String> words = Files.lines(dictionary)) { words.collect(groupingBy(word -> word.chars().sorted() .collect(StringBuilder::new, (sb, c) -> sb.append((char) c), StringBuilder::append).toString())) .values().stream() .filter(group -> group.size() >= minGroupSize) .map(group->group.size() + ":"+ group) .forEach(System.out::println); }そして、そのコードの下には以下の一文が。
このコードを読むのが難しいと思っても、心配しないでください。
引用した個所を読んで、ストリームAPIを使う勇気が湧いてきました。
関数型言語苦手でこういうのを読むの苦手だったんですが、それでも良いんだ。
読書メモ:いちばんやさしいGit&GitHubの教本
はじめに
「いちばんやさしいGit&GitHubの教本 人気講師が教えるバージョン管理&共有入門 (「いちばんやさしい教本」シリーズ)」を読みました。
「この本凄いな!」と思ったので、自分のためにメモを残します。
凄いところ
表紙の「知識ゼロでも大丈夫!」に全力で取り組んでいる
本書を読む前は、「表紙のキャッチコピーは『バージョン管理システムを使ったことなくても大丈夫です』という程度の意味だろう」と思っていました。
しかし、そういうことではなかったです。
なんと、以下も本書の内容に含まれているのです。
- ターミナルの起動方法
- ディレクトリの概念
「著者は本気だ。本気で『知識ゼロでも大丈夫』を目指している……」と私は感じました。
バージョン管理システムの説明についても、他のシステムとの比較の話は一切登場しません。
比較したほうが説明しやすい箇所もあるかと思うのですが、「知識ゼロ」を標榜している本書は、そんな手法は採ってません。
惜しみなく図を使って説明している
私が最初Gitを触った時は「コミットするとステージングエリアに移動するらしいが、ステージングエリアって何??」と結構混乱しました。
本書は、図を惜しみなく使っているため凄くわかりやすいです。
余談ですが、ステージングエリアの話題が初めて登場するChapter1(P022)に、以下の一言があります。
しかし、もし難しいと感じた場合は、先にChapter 2以降を読み進め、あとから戻ってくるという読み方をしてもかまいません。詰まって先に進めなくなる人が居ないように配慮されているのです。
なんて優しい本なんだ……。
Githubも取り上げているのが素晴らしい
昔、「トピックブランチを作って開発するものらしい」と知った時は次のように思いました。
「Gitがトピックごとにブランチを分けて開発しやすいように作られているのはわかった。でも、レビュー→修正→マージの作業、結局面倒じゃないか。これ、便利なのかな…」って。
私が「Gitいいじゃん!」って思ったのはGitHubクローンに触れて、Pull Requestを使ってからです。
本書は、ブランチをつくったあとPull Requestを作成するという流れで説明されています。
この流れで説明されていれば、「面倒そう…」なんて感想をもつことなく、「なるほどー。良いね!」って思うに違いありません。
Githubも取り上げたのは、素晴らしいと思いました。
さいごに
「私がGitを勉強し始めた時にこの本があれば良かったのに」と思いました。
Kubespray + Vagrant で遊ぶ時の注意点
はじめに
Kubespray + Vagrant でごにょごにょ遊んでいたのですが、使う際のコツが少しあったのでメモ。
環境
- Vagrant 2.1.2
- Kubespray commit hash:f1e348ab9592e8bc87e5ce70492a78f73666aa44
vagrant haltは使わない
「vagrant halt」を実行すると、「vagrant up」後、Kubernetesが使えません。
どうやら、Kubernetesに必要なコンポーネントに自動起動が仕込まれていないようです。
vagrantで起動するOS、何度やっても起動しないものもあるので頑張りすぎない
Vagrantfileを読むといくつかOSを選べます。
しかし、試してみたらcoreos-stableは私の環境では何度やってもうまくいかず……。
試してみるのを諦めました。
CoreOSはバージョンアップ早いですからね。そういうこともあるのかもしれません。
さいごに
Kubespray + vagrantの情報、日本語だとそんなに見つからないんですよね。
遊ぶのであれば、自らちょっとずつ探っていかねば。
「Software Design 2018年3月号」をみてkubesprayをインストールしてみた
はじめに
「Software Design 2018年3月号」が出版されて随分たちました。今更kubesprayのインストールを試してみたら、気になった点・気づいた点がありましたので、メモ。
環境
- Lununtu 16.04 (VMWare Player 14.1.2上で起動)
- VirtualBox 5.2.14
- Vagrant 2.1.2
- Ansible 2.4.2.0
- Jinja2 2.10
- netaddr 0.7.19
- kubespray commit hash:f1e348ab9592e8bc87e5ce70492a78f73666aa44
気になった点・気づいた点
記事で扱っているkubesprayのバージョンの記載
「Software Design 2018年3月号」のP82に、kubesprayのcommit hashが記載されています。「なぜtagの名前を記載しないんだろう?」と疑問に思いました。
kubesprayのリポジトリをみてみたところ、tagを打つ間隔がわりとまちまちですので新しい情報を記事に取り入れようとして、tagからソースを取得しなかったのではないかと思われます。
比較的最近のtagについて、対象となったコミットの日付を調べてみましたところ、以下のようになっていました。
- v2.5.0…2018/4/16
- v2.4.0…2018/2/1
- v2.3.0…2017/10/27
- v2.2.1…2017/9/27
P82のinventory/group_vars/k8s-cluster.ymlの所在
inventoryの直下には、group_varsは存在しません。
代わり(?)に、local/group_varsとsample/group_varsが存在します。
「これはどっちを使えばいいのだろう?」と疑問に思いました。
sampleの方を使うのだと私は判断しました。
判断理由は、GitHub - kubernetes-incubator/kubespray: Setup a kubernetes clusterの説明で、sampleをコピーして設定変更しているためです。
使用するVagrantとVirtualBoxのバージョン
記事に記載されているバージョンのVagrantとVirtualBoxを使用したところ、何度もタイムアウトしました。
これは私の環境が貧弱なためと思われます。
検証時点で最新のバージョンを使用したところ改善されましたので、タイムアウトで苦しむ場合は、バージョンを変えてみるとよいかもしれません。
P83の「kubectl_localhost: true」を有効にした場合のkubectlの配置場所
inventory/inventory名/artifactsに配置されます。
私の場合inventory/sample/artifactsですね。
さいごに
久しぶりにi5-3320Mの限界を強く感じました。
一台の物理PCに「Docker for Windows Desktop with integrated Kubernetes」と「Minikube」の実験環境を作りたい
はじめに
結構検討に時間を要したので、件名の件について構成をメモ。
構成
以下が構成です。
補足:Hyper-VとVMWare Playerは、HyperV-Switchで切り替えて使用します。
検討したこと
一つのOSに、「Docker for Windows Desktop with integrated Kubernetes」と「Minikube」を同居させるか?
以下について冴えたアイデアが出なかったので、別々のOSにインストールすることにしました。
- 「Docker for Windows Desktop with integrated Kubernetes」でインストールされたdockerコマンド、kubectlコマンドと、Minikube用にインストールしたdockerコマンド、kubectlコマンドの切り替え方法。
環境変数の切り替えという案は浮かびましたが、「私は切り替えミスしそうだ」と思いそれは採用しませんでした。
仮想化ソフトに何を使用するか?
「仮想化の入れ子」を今回実現する必要があります。
私はVMWare Playerを採用しました。「Intel VT-x/EPT または AMD-V/RVI を仮想化」を有効にすることで、「仮想化の入れ子」が可能なことが机上調査で分かったためです。
参考
さいごに
まとめると大したことはやっていない感じがありますが、結構時間かかってしまった…。