SDKMANでJavaの開発環境をセットアップする

こんにちは。beaglesoftの真鍋です。

Javaの開発環境はJDKのインストールに始まりビルドツールであるmavenやgradleのインストールまで行う必要があります。以前はそれぞれ別々にインストールする必要があったのですが、最近ではこれらのツールを管理するツールが提供されておりかなり便利にインストールができます。そのツールがcurl -s “https://get.sdkman.io” | bashです。

JDKのインストールについて

JDKのインストールについてSDK MANで実行することは可能ですが、インストール後の設定でJAVA_HOMEの設定などを行う必要があるためOracle社からJDKをダウンロードしてインストールすることをおすすめします。

SDK MANのインストール

SDK MANのインストールは以下のコマンドを実行します。

$ curl -s "https://get.sdkman.io" | bash


Thanks for using...


     SSSSSSSSSSSSSSS DDDDDDDDDDDDD       KKKKKKKKK    KKKKKKK
   SS:::::::::::::::SD::::::::::::DDD    K:::::::K    K:::::K
  S:::::SSSSSS::::::SD:::::::::::::::DD  K:::::::K    K:::::K
  S:::::S     SSSSSSSDDD:::::DDDDD:::::D K:::::::K   K::::::K
  S:::::S              D:::::D    D:::::DKK::::::K  K:::::KKK
  S:::::S              D:::::D     D:::::D K:::::K K:::::K
   S::::SSSS           D:::::D     D:::::D K::::::K:::::K
    SS::::::SSSSS      D:::::D     D:::::D K:::::::::::K
      SSS::::::::SS    D:::::D     D:::::D K:::::::::::K
         SSSSSS::::S   D:::::D     D:::::D K::::::K:::::K
              S:::::S  D:::::D     D:::::D K:::::K K:::::K
              S:::::S  D:::::D    D:::::DKK::::::K  K:::::KKK
  SSSSSSS     S:::::SDDD:::::DDDDD:::::D K:::::::K   K::::::K
  S::::::SSSSSS:::::SD:::::::::::::::DD  K:::::::K    K:::::K
  S:::::::::::::::SS D::::::::::::DDD    K:::::::K    K:::::K
   SSSSSSSSSSSSSSS   DDDDDDDDDDDDD       KKKKKKKKK    KKKKKKK


                      mmmmmmm    mmmmmmm     aaaaaaaaaaaaa  nnnn  nnnnnnnn
                    mm:::::::m  m:::::::mm   a::::::::::::a n:::nn::::::::nn
                   m::::::::::mm::::::::::m  aaaaaaaaa:::::an::::::::::::::nn
                   m::::::::::::::::::::::m           a::::ann:::::::::::::::n
                   m:::::mmm::::::mmm:::::m    aaaaaaa:::::a  n:::::nnnn:::::n
                   m::::m   m::::m   m::::m  aa::::::::::::a  n::::n    n::::n
                   m::::m   m::::m   m::::m a::::aaaa::::::a  n::::n    n::::n
                   m::::m   m::::m   m::::ma::::a    a:::::a  n::::n    n::::n
                   m::::m   m::::m   m::::ma::::a    a:::::a  n::::n    n::::n
                   m::::m   m::::m   m::::ma:::::aaaa::::::a  n::::n    n::::n
                   m::::m   m::::m   m::::m a::::::::::aa:::a n::::n    n::::n
                   mmmmmm   mmmmmm   mmmmmm  aaaaaaaaaa  aaaa nnnnnn    nnnnnn


                                                 Now attempting installation...

Looking for a previous installation of SDKMAN...
Looking for unzip...
Looking for zip...
Looking for curl...
Looking for sed...
Installing SDKMAN scripts...
Create distribution directories...
Getting available candidates...
Prime the config file...
Download script archive...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 20944  100 20944    0     0   9382      0  0:00:02  0:00:02 --:--:--  142k
Extract script archive...
Install scripts...
Set version to 5.5.10+240 ...
Attempt update of zsh profiles...



All done!


Please open a new terminal, or run the following in the existing one:

    source "/Users/user/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!

次にターミナルなどを新しく起動して以下のコマンドを実行します。

$ source "/Users/{user}/.sdkman/bin/sdkman-init.sh"
$ sdk help
==== BROADCAST =================================================================
* 12/08/17: Kscript 1.6.0 released on SDKMAN! #kscript
* 10/08/17: Azul Zulu 9ea13 is now available for download from SDKMAN! on Linux, Mac OSX, Windows. #java
* 09/08/17: Java 8u144 released on SDKMAN! #java
================================================================================

Usage: sdk <command> [candidate] [version]
       sdk offline <enable|disable>

   commands:
       install   or i    <candidate> [version]
       uninstall or rm   <candidate> <version>
       list      or ls   [candidate]
       use       or u    <candidate> [version]
       default   or d    <candidate> [version]
       current   or c    [candidate]
       upgrade   or ug   [candidate]
       version   or v
       broadcast or b
       help      or h
       offline           [enable|disable]
       selfupdate        [force]
       flush             <candidates|broadcast|archives|temp>

   candidate  :  the SDK to install: groovy, scala, grails, gradle, kotlin, etc.
                 use list command for comprehensive list of candidates
                 eg: $ sdk list

   version    :  where optional, defaults to latest stable if not provided
                 eg: $ sdk install groovy

ここまででSDK MANのインストールは完了です。特にmacやUbuntuで設定内容が異なることはありません。素晴らしいですね!

JDKのインストール

ここからは各アプリケーションのインストールです。インストールできるアプリケーションを表示します。

$ sdk list

================================================================================
Available Candidates
================================================================================
q-quit                                  /-search down
j-down                                  ?-search up
k-up                                    h-help

--------------------------------------------------------------------------------
Activator (1.3.10)                   http://www.lightbend.com/activator/download

Typesafe is a GUI/CLI tool to help with building reactive applicaions. It uses
sbt (simple build tool) behind the scenes to build, run, and test your project.
It provides a code editing interface, and provides templaes and seeds for you to
clone and use.

                                                         $ sdk install activator
--------------------------------------------------------------------------------
Ant (1.10.1)                                             https://ant.apache.org/

Apache Ant is a Java library and command-line tool whose mission is to drive
processes described in build files as targets and extension points dependent
upon each other. The main known usage of Ant is the build of Java applications.
Ant supplies a number of built-in tasks allowing to compile, assemble, test and
run Java applications. Ant can also be used effectively to build non Java
applications, for instance C or C++ applications. More generally, Ant can be
used to pilot any type of process which can be described in terms of targets and
tasks.

                                                               $ sdk install ant
--------------------------------------------------------------------------------
...

listを表示することで、インストール可能なアプリケーションとインストール法オフが表示されます。例えば、Antの場合にはsdk install antでインストールできることがわかります。

groovyのインストール

groovyのインストールは以下の通り実行します。

$ groovy -v
zsh: command not found: groov

$ sdk install groovy

Downloading: groovy 2.4.12

In progress...

######################################################################## 100.0%

Installing: groovy 2.4.12
Done installing!


Setting groovy 2.4.12 as default.

$ groovy -v
Groovy Version: 2.4.12 JVM: 1.8.0_144 Vendor: Oracle Corporation OS: Mac OS X

mavenのインストール

mavenのインストールは以下の通り実行します。

$ mvn -v
zsh: command not found: mvn
ymanabe ~ $ sdk install maven

Downloading: maven 3.5.0

In progress...

######################################################################## 100.0%

Installing: maven 3.5.0
Done installing!


Setting maven 3.5.0 as default.
$ mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T04:39:06+09:00)
Maven home: /Users/{user}/.sdkman/candidates/maven/current
Java version: 1.8.0_144, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.6", arch: "x86_64", family: "mac"

Gradleのインストール

最後にGradleのインストールを行います。

$ gradle -v
$ sdk install gradle

Downloading: gradle 4.1

In progress...

######################################################################## 100.0%

Installing: gradle 4.1
Done installing!


Setting gradle 4.1 as default.

$ gradle -v

------------------------------------------------------------
Gradle 4.1
------------------------------------------------------------

Build time:   2017-08-07 14:38:48 UTC
Revision:     941559e020f6c357ebb08d5c67acdb858a3defc2

Groovy:       2.4.11
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_144 (Oracle Corporation 25.144-b01)
OS:           Mac OS X 10.12.6 x86_64

最後に

これでJavaに関する環境構築はかなり楽になるのではないでしょうか。手動でインストールを行っていた方はぜひ利用してみてください。

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradleのtestタスクでソースコードがコピーされない

こんにちは。beaglesoftの真鍋です。

IntelliJでJavaクラスファイルを作成するところがKotlinファイルを作成してからKotlin使い始めました。

さて、先日Gradleを利用してテストを実行しよう(gradle clean test)としたところ、:test NO-SOURCEと表示されテストが実行されない事象に遭遇しました。あまりにもアタリマエのことなのでGoogleで検索しても出てこなかったため簡単にまとめてみます。

状況

プロジェクトの構成はGradleのJavaプラグインの規約に準拠したプロジェクト構成でした。

.
├── README.md
├── beagle-customer.iml
├── build
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── src
    ├── main
    │   ├── java
    │   │   └── net
    │   │       └── beaglesoft
    │   │           └── customer
    │   └── resources
    │       ├── META-INF
    │       │   └── net
    │       │       └── beaglesoft
    │       │           └── customer
    │       ├── application-prod.properties
    │       ├── application-staging.properties
    │       ├── application.properties
    │       ├── db
    │       │   └── migration
    │       ├── logback-spring.xml
    │       ├── static
    │       └── templates
    └── test
        ├── java
        │   └── net
        │       └── beaglesoft
        │           └── customer
        │               ├── controllers
        │               │   ├── BarControllerTest.groovy
        │               │   └── ...
        │               └── services
        │                   ├── FooService.groovy
        │                   └── ...
        └── resources
            ├── application.properties
            └── logback-spring.xml

また、build.gradleは特段の処理を追加することもなく以下のような標準的な内容となっていました。

group 'beagle-customer'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.1.2'
    ext {
        springBootVersion = '1.5.4.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

repositories {
    mavenCentral()
    repositories {
        mavenCentral artifactUrls: [
                'http://jasperreports.sourceforge.net/maven2',
                'http://jaspersoft.artifactoryonline.com/jaspersoft/third-party-ce-artifacts/'
        ]
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: "groovy"
apply plugin: 'idea'
apply plugin: 'jacoco'
apply plugin: 'org.springframework.boot'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

springBoot {
    mainClass = "net.beaglesoft.customer.CustomerApp"
}

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

// DOMA用の設定
processResources.destinationDir = compileJava.destinationDir
compileJava.dependsOn processResources

dependencies {
.. 省略
}

task wrapper(type: Wrapper) {
    gradleVersion = '3.4.1'
}

原因

原因はテストファイルにありました。今回テストは[Spock](http://spockframework.org/]を利用しているため、テストファイルの保存先はjavaではなくgroovyとするのが正しいということがわかりました。

.
├── README.md
├── beagle-customer.iml
├── build
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── src
    ├── main
    │   ├── java
    │   │   └── net
    │   │       └── beaglesoft
    │   │           └── customer
    │   └── resources
    │       ├── META-INF
    │       │   └── net
    │       │       └── beaglesoft
    │       │           └── customer
    │       ├── application-prod.properties
    │       ├── application-staging.properties
    │       ├── application.properties
    │       ├── db
    │       │   └── migration
    │       ├── logback-spring.xml
    │       ├── static
    │       └── templates
    └── test
        ├── groovy
        │   └── net
        │       └── beaglesoft
        │           └── customer
        │               ├── controllers
        │               │   ├── BarControllerTest.groovy
        │               │   └── ...
        │               └── services
        │                   ├── FooService.groovy
        │                   └── ...
        └── resources
            ├── application.properties
            └── logback-spring.xml

気づいてしまえば当たり前なのですが、ミニマムプロジェクトを作成して同じようにGradleの設定を行ってビルドを実行していたところ記述するテストごとにtestディレクトリにディレクトリが作成されていることに気づいたのが最初でした。

その後Groovyプラグインのドキュメントをよく読んでみるとまさにそのことが記述されていました。

[The Groovy Plugin - Gradle User Guide Version 3.3] (https://docs.gradle.org/3.3/userguide/groovy_plugin.html#sec:groovy_project_layout)

src/test/java Test Java source

src/test/groovy Test Groovy sources. May also contain Java sources for joint compilation.

結論

ドキュメントはよく読まないといけないのですが、どこを読めばいいか(すべてを読むことは最初は難しい…)を探るためにも、単純なミニマムコードを用意してうまく行かないことを確認するのは大事ですね。

あと、Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築にはとてもおせわになりました。うまく行かないときはGoogleで検索して出てきたコードの断片をとりあえず貼り付けて動くか?なんてことをやりがちなのですが、正しい情報でないこともありました。

Gradleはどういうものかということがとてもわかり易く記述されていたので役立ちました。公式ガイドもわかりやすいのですが、紙の書籍のほうがパラパラと見れてよかったです。

SpringBootTestでのapplication.propertiesの設定を変更する

SpringBootTestでapplication.propertiesの値を設定する

SpringBootTestでapplication.propertiesの値を変更する方法は以下の通りとなります。

application.properties

今回対象とするapplication.propertiesの項目は以下の通りとなります。

...
foo.bar.enable=false
...

通常のテストを実行するときにはfoo.bar.enableの値はfalseとしますが、今回のテスト対象実行時のみtrueへ設定することを想定します。

SpringBootTest

SpringBootTestでテスト実行時にapplication.propertiesのfoo.ba.enableの値をtrueに設定するには、以下の通りSpringBootTestアノテーションのpropertiesfoo.bar.enable=trueのように設定します。複数の項目を指定するときにはカンマで区切ることで設定可能となります。

package ...

@Slf4j
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,
        properties = { "foo.bar.enable=true" })
public class SampleTest {
  ...
}

これにより、SampleTest実行時にはfoo.bar.enableの値はtrueが設定されるようになります。

参考

The @SpringBootTest annotation also has a properties attribute that can be used to specify any additional properties that should be defined in the Environment. Properties are now loaded in the exact same way as Spring’s regular @TestPropertySource annotation.

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発