2017年1月29日日曜日

Gradle / 事始め2

書き足りなかった部分をプラス
途中からSpringも混ざりますが、ご容赦願います。


メモ

$ gradlew xxx -Pargs="hoge"
-Pargs:引数の設定

jarだけ消す
$ gradle cleanJar
[root]/build/libsディレクトリ配下にあるjarを消去できます。
生成済みのclassファイルは残ったままです。

サーバポートを変更してwebアプリjarを実行する
$ java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8888
でいけるはずですが、、、
no main manifest attribute, in demo-0.0.1-SNAPSHOT.jar
となりました。デフォルトポートで実行するぶんにはマニフェストファイル不要なんですがね。。。
mavenで作った際は指定できましたが、gradleだと何か足りていないみたいでした。

spring boot devtoolsを使用する
compile('org.springframework.boot:spring-boot-starter-web',
'org.springframework.boot:spring-boot-devtools')

結果、立ち上げ時のmainプロセスが、restartedMainプロセスに変わります。
これでホットデプロイできるらしいですが、これは完全サポートが保証されているわけではないみたいです。

build.gradle
sourceCompatibility:受け付けるソースコードのバージョン
targetCompatibility:クラスファイルのバージョン

SpringBootTest
package com.example;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.*;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.boot.test.web.client.TestRestTemplate;
import static org.hamcrest.CoreMatchers.is;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class DemoApplicationTests {

 @Autowired
 TestRestTemplate template;


 @Test
 public void contextLoads() {
  ResponseEntity res = template.getForEntity("/", String.class);
  assertThat(res.getStatusCode(), is(HttpStatus.OK));
  assertThat(res.getBody(), is("Hello world"));
 }

}

Assertはstaticでないといけないっていうのが気をつけどこ

Java / try with resources句
tryに()カッコをつけて、その中で閉じる必要があるインスタンスを生成する
finally句がなくてOK

IntelliJでlombokを入れる
Preferencies → Install JetBrains plugin...
→ lombokで検索 → Install
libraryに追加した後にビルドパスに追加するのをお忘れなく。。。
Eclipseでもそうですが、libraryにjarをコピーしただけでは使えません。

また、Annotation Processorsを有効にしないと@AllArgsConstructorなどが認識されない
参考:Lombokプラグインをインストールする
Preferencies → Build, Execution, Deployment
→ Compiler → Annotation Processors
Defaultを選んで、右のペインで「Enable annotation processing」にチェックを入れる

IntelliJにCoverageというプラグインが入っている
Run with Coverageで実行するとどれだけテストがカバーできているかが表示される

Spring / @SpringBootApplication
下記3つのアノテーションを1つにまとめた効果
  • @EnableAutoCOnfiguration
  • @Configulation
  • @ComponentScan

Spring / CommandLineRunnerインターフェース
DIが可能になる(プロパティに@Autowiredをつけて、インスタンスを自動生成できる)
また、mainメソッドに
SpringApplication.run(xxx.class, args);
とすることでアプリを立ち上げられる。
もちろん、自クラスにrunメソッドを記載すること。

Java可変長引数([type]... hoges)
そんなに使わないから、ググりました。
ひしだま's 技術メモページ
  • 配列としてメソッド内で使える
  • 引数のうち一つだけ
  • 最後の引数の時だけ使用可能
  • 可変長引数と同じ型でオーバーロードして、どちらにも適用されるような呼び出しは、可変長で「ない」メソッドに引数を渡す

Spring / @ComponentScanの対象になるアノテーション
  • @Component
  • @Controller
  • @Service
  • @Repository

lombok/ @AllArgsConstructor
プロパティ全てを引数に取るコンストラクタを自動生成するCC

Java / ConcurrentMapインターフェース
スレッドセーフなマップ
実装はConcurrentHashMapクラスか、ConcurrentSkipListMapクラス。

Postgre SQL / ユーザの一覧
$ select rolname from pg_roles;
or
=> \du
Describe Userかな。。。

psql / \c (database name)
pslqでのDB接続は\c (database name)

Spring / JDBCでの接続
必要なもの
  • DBコネクタライブラリ
  • spring-boot-starter-jdbc
実行の流れ
  • NamedParameterJdbcTemplateインスタンス
  • SQL文字列
  • MapSqlParameterSourceインスタンス(SqlParameterSourceインターフェース)
  • NamedParameterJdbcTemplateのqueryForObjectメソッド実行

H2DBでインメモリな設定
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.sql-script-encoding=UTF-8

H2DBで永続化する
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:file:./target/db/testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.sql-script-encoding=UTF-8

SQL / テーブルがなかったら、、、
CREATE table if not EXISTS salse_table ( id int, date timestamp );

0 件のコメント:

コメントを投稿