linebot-serverless-blueprint-javaの作り方（その１）

[linebot-serverless-blueprint-javaを作った！](http://qiita.com/moritalous/items/af4f05543a1b8817e472)で紹介したLINE BOTの雛形の作り方を何回かに分けて紹介します。

# 環境

* Windows 10
* Node: v6.9.1
* npm: 3.10.8
* Git for Windows: 2.9.3.windows.2
* Java 8
* AWSアカウント（AdministratorAccess権限）  
  ※rootアカウントはやめましょう

# 前準備～serverlessの導入

## プロジェクト用フォルダーの作成

```bat
mkdir linebot-serverless-blueprint-java
cd linebot-serverless-blueprint-java
```

## package.jsonの作成

```bat
npm init -y
```

```json:package.json
{
  "name": "linebot-serverless-blueprint-java",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

## serverlessのインストール

```bat
npm install serverless --save-dev
```

"devDependencies"が追加されます。

```json:package.json
{
  "name": "linebot-serverless-blueprint-java",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "serverless": "^1.8.0"
  }
}
```

## serverlessプロジェクトの作成

```bat
node_modules\.bin\serverless create -t aws-java-gradle
```

なぜか```gradle\wrapper\gradle-wrapper.jar```が作成されませんので、個別にダウンロードします。
https://github.com/serverless/serverless/blob/master/lib/plugins/create/templates/aws-java-gradle/gradle/wrapper/gradle-wrapper.jar
こんな感じになります。

```
C:.
│  .npmignore
│  build.gradle
│  gradlew
│  gradlew.bat
│  package.json
│  serverless.yml
│  
├─gradle
│  └─wrapper
│          gradle-wrapper.jar
│          gradle-wrapper.properties
│          
├─node_modules
～～～省略～～～
│              
└─src
    └─main
        ├─java
        │  └─com
        │      └─serverless
        │              ApiGatewayResponse.java
        │              Handler.java
        │              Response.java
        │              
        └─resources
                log4j.properties
```

# Javaプロジェクトのフォルダー構成の変更

今回はJavaプロジェクトを２つ用意しますので、フォルダー構成を変更します。

## ```src```フォルダーと```build.gradle```をサブフォルダー内に移動

```bat
mkdir webhook
move src webhook\
        1 個のディレクトリを移動しました。
move build.gradle webhook\
        1 個のファイルを移動しました。
```

## もう一つのJavaプロジェクト用ファイルもコピーして作成

```bat
xcopy /E /I webhook reply
webhook\build.gradle
webhook\src\main\java\com\serverless\ApiGatewayResponse.java
webhook\src\main\java\com\serverless\Handler.java
webhook\src\main\java\com\serverless\Response.java
webhook\src\main\resources\log4j.properties
5 個のファイルをコピーしました
```

## ```settings.gradle```ファイルの作成

```bat
type nul > settings.gradle
```

```groovy:settings.gradle
include 'webhook','reply'
```

## Gradle動作確認

```bat
gradlew projects
```

```bat
------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'linebot-serverless-blueprint-java'
+--- Project ':reply'
\--- Project ':webhook'

To see a list of the tasks of a project, run gradlew <project-path>:tasks
For example, try running gradlew :reply:tasks

BUILD SUCCESSFUL

Total time: 7.01 secs
```

## ```build.gradle```ファイルの修正

webhook/build.gradleを少し修正します。reply/build.gradleも同様（baseNameはreply）に修正します。

```diff:webhook/build.gradle
apply plugin: 'java'

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

+tasks.withType(AbstractCompile)*.options*.encoding = tasks.withType(GroovyCompile)*.groovyOptions*.encoding = 'UTF-8'

dependencies {
    compile (
        'com.amazonaws:aws-lambda-java-core:1.1.0',
        'com.amazonaws:aws-lambda-java-log4j:1.0.0',
+        'com.amazonaws:aws-java-sdk-dynamodb:1.11.98',
+        'com.linecorp.bot:line-bot-api-client:1.6.0',
    )
    testCompile 'junit:junit:4.12'
}

// Task for building the zip file for upload
task buildZip(type: Zip) {
    // Using the Zip API from gradle to build a zip file of all the dependencies
    //
    // The path to this zip file can be set in the serverless.yml file for the
    // package/artifact setting for deployment to the S3 bucket
    //
    // Link: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Zip.html

    // set the base name of the zip file
-    baseName = "hello"
+    baseName = "webhook"
    from compileJava
    from processResources
    into('lib') {
        from configurations.runtime
    }
}

build.dependsOn buildZip
```

以上で下準備は完了です。
次回はServerlessの設定やJavaプログラムについての解説を行いたいと思います。