Gradleプロジェクトの作成(javaビルドツール)

目次

1.Gradleとは
 Gradleはプロジェクト管理ツール(ビルドツール)で、プロジェクトの作成、ライブラリの管理、プログラムのビルド、テスト、実行、デプロイなど一連の開発に必要な作業ができます。
 GradleではGroovyというスクリプト言語でスクリプトを記述して管理します。

2.Groovyの準備
 Gradleを利用するためにGroovyを用意します。
(1)Groovyのダウンロード
 https://www.groovy-lang.org/

「apache-groovy-sdk-3.0.9.zip」を「全て展開」し、
「groovy-3.0.9」のフォルダを任意の場所に配置。
 C:\Users***\Documents\groovy-3.0.9

3.Gradleの準備
(1)Gradleのダウンロード
 http://gradle.org/

「gradle-7.3.1-all.zip」を「全て展開」し、
「gradle-7.3.1」のフォルダを任意の場所に配置。
 C:\Users***\Documents\gradle-7.3.1

(2)環境変数の追加
 コントロールパネル>システムとセキュリティ>システム>システムの詳細設定>環境変数

 Path>編集>新規ボタンでbinフォルダがあるディレクトリを設定します。
 ここでは、
 C:\Users*\Documents\groovy-3.0.9\bin
 C:\Users*\Documents\gradle-7.3.1\bin
を設定します。
 バージョンの確認
 > gradle -version

4.build.gradleの作成
 プロジェクトのフォルダ(ここでは「gradleapp」)を作成し、その中に「build.gradle」というファイルを作成し下記のスクリプトを記述します。
 ここでは、プロジェクトフォルダは
 C:\Users***\Documents\gradleapp
とします。
 ファイルの作成は、
 >type nul > build.gradle

 「build.gradle」

task helo{
 println("Hello! Gradle") 
}

 task タスクの名前{
 ・・・実行する処理・・・
 }
 コマンドプロンプトでプロジェクトフォルダのディレクトリに移動し、下記のコマンドでタスクを実行します。
 > gradle helo

5.アプリケーションのビルド
 前記では、「build.gradle」ファイルで、”task”で定義した名前のタスクをコマンドで実行できることが確認できました。ここでは、アプリケーションのビルドを確認します。 
(1)クラスファイルの作成
 プロジェクトフォルダの配下にsrc/main/java/gradleappのフォルダを作成し、クラスファイル「MyApp.java」を作成します。

「MyApp.java」

package gradleapp;

public class MyApp{
	public static void main(String[] args){
		System.out.println("Hello,This is Sample MyApp");
		System.out.println("build by Gradle!");
	}
}

(2)build.gradleの作成
 「build.gradle」

apply plugin:'application'

mainClassName = 'gradleapp.MyApp'

run{
	println("======= run app =======");
}

・プラグインの追加
 プラグインはGradleに機能を追加するときに記述します。
 apply plugin:プラグイン名
 プラグイン「application」はJavaアプリケーションのビルドの機能です。
・メインクラスの指定 
 「application」プラグインが必要とする設定で、”mainClassName”は、main()メソッドがあるクラスを示す変数、 
 mainClassName = ‘(パッケージ名).(クラス名)’
 で定義します。
・runタスクの作成
 「build.gradle」に記述することで、アプリケーションのビルドから実行まで行えるようになります。

(3)ビルドの実行
 > gradle build

(4)プログラムの実行
 > gradle run

6.プロジェクトの作成(gradle)
 initタスクを実行することで対話形式でgradleプロジェクトのフォルダを作成できます。
(1)プロジェクトの作成(init)
 > gradle init

C:\Users\***\Documents\gradleapp2>gradle init
Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2
 
Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3
 
Split functionality across multiple subprojects?:
  1: no - only one application project
  2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1
 
Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1
 
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]                                                                                     no
 
Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] 4
 
Project name (default: gradleapp2): gradleapp2
Source package (default: gradleapp2): gradleapp2
 
> Task :init
Get more help with your project: https://docs.gradle.org/7.3.1/samples/sample_building_java_applications.html
 
BUILD SUCCESSFUL in 1m 5s

 プロジェクトのワークフォルダ配下に下記のディレクトリが作成されます。

また、下記のファイルが作成されます。

「build.gradle」
 ビルドの定義はbuild.gradleファイルに記述します。

/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java application project to get you started.
 * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle
 * User Manual available at https://docs.gradle.org/7.3.1/userguide/building_java_projects.html
 */

plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'

    // This dependency is used by the application.
    implementation 'com.google.guava:guava:30.1.1-jre'
}

application {
    // Define the main class for the application.
    mainClass = 'gradleapp2.App'
}

/* 追加 JAR マニフェスト属性指定 */
jar {
    manifest {
        attributes 'Main-Class': 'gradleapp2.App'
    }
}

tasks.named('test') {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}

「settings.gradle」

/*
 * This file was generated by the Gradle 'init' task.
 *
 * The settings file is used to specify which projects to include in your build.
 *
 * Detailed information about configuring a multi-project build in Gradle can be found
 * in the user manual at https://docs.gradle.org/7.3.1/userguide/multi_project_builds.html
 */

rootProject.name = 'gradleapp2'
include('app')

./app/src/main/java/gradleapp2/App.java

/*
 * This Java source file was generated by the Gradle 'init' task.
 */
package gradleapp2;

public class App {
    public String getGreeting() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}

./app/src/test/java/gradleapp2/AppTest.java

/*
 * This Java source file was generated by the Gradle 'init' task.
 */
package gradleapp2;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test void appHasAGreeting() {
        App classUnderTest = new App();
        assertNotNull(classUnderTest.getGreeting(), "app should have a greeting");
    }
}

(2)タスク一覧の表示(tasks)
 >gradle tasks
 gradleで実行できるタスクの一覧を表示します。

C:\Users\***\Documents\gradleapp2>gradle tasks
 
> Task :tasks
 
------------------------------------------------------------
Tasks runnable from root project 'gradleapp2'
------------------------------------------------------------
 
Application tasks
-----------------
run - Runs this project as a JVM application
 
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.
 
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
 
Distribution tasks
------------------
assembleDist - Assembles the main distributions
distTar - Bundles the project as a distribution.
distZip - Bundles the project as a distribution.
installDist - Installs the project as a distribution as-is.
 
Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.
 
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradleapp2'.
dependencies - Displays all dependencies declared in root project 'gradleapp2'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradleapp2'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
outgoingVariants - Displays the outgoing variants of root project 'gradleapp2'.
projects - Displays the sub-projects of root project 'gradleapp2'.
properties - Displays the properties of root project 'gradleapp2'.
tasks - Displays the tasks runnable from root project 'gradleapp2' (some of the displayed tasks may belong to subprojects).
 
Verification tasks
------------------
check - Runs all checks.
test - Runs the test suite.
 
To see all tasks and more detail, run gradle tasks --all
 
To see more detail about a task, run gradle help --task <task>
 
BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed

(3)テストの実行
 > gradle test

(4)JARファイルの作成
 > gradle jar

(5)クラスファイルの実行
 クラスパスにJARファイルのパスを指定してjavaコマンドで実行します。
 カレントディレクトリがプロジェクトフォルダ
 C:\Users***\Documents\gradleapp2
のとき、下記のコマンドでJavaアプリケーションが実行できます。
 > java -jar app/build/libs/app.jar

(6)アプリケーションの実行(gradle run)

7.Webアプリケーションの作成(Eclipse)
 jetty(Java Servletコンテナ/Webサーバ)を使ってWebアプリケーションを作成しようとしたところ、gradle-7.3.1ではjetty pluginが使えないようだったため、Eclipseでgradleプロジェクトを作成します。

(1)プロジェクトの作成
①ファイル>新規>その他

 ここではプロジェクト名:gradleapp3
とします。

②プロジェクトフォルダを選択してマウス右ボタン>プロパティ>プロジェクト・ファセット>「ファセット・フォームへ変換」

 「動的Webモジュール」にチェックし、「より詳しい構成が使用可能」を選択

 コンテンツ・ディレクトリーをsrc/main/webapp
とし、「web.xmlデプロイメント記述子の生成」をチェックします。

 デプロイメント・ディスクリプタ(web.xml)が作成されます。JSP&サーブレットの設定ファイルで、Webアプリケーションの配置情報をXMLで定義します。

「web.xml」

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>gradleapp3</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

(2)index.htmlの作成
「index.html」

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>Hello Gradle WebApp !</p>
</body>
</html>

(3)Webアプリケーションの実行
①プロジェクトフォルダを選択してマウス右ボタン>プロパティ>プロジェクト・ファセットで、javaのバージョンを設定します。

②プロジェクトフォルダを選択してマウス右ボタン>実行>サーバで実行を選択し、Tomcat v8.0を選択して「完了」押すと、サーバが起動します。

ブラウザでサーバにアクセス

(4)サーブレットクラスの作成
 上記(2)、(3)では、index.htmlの静的なページの表示でした。ここでは、サーブレットクラスを追加し、サーブレットクラスのレスポンスが表示されることを確認します。
①サーブレットクラスの作成
 src/main/java/gradleapp3配下にサーブレットクラス「HelloMsg.java」を作成します。

 ”「servlet-api.jar」というTomcatライブラリにパスが通っていない。”旨のエラーが表示されるときは、下記のようにビルド・パスを通す必要があります。
 プロジェクトを選択してマウス右ボタン>ビルド・パス>ビルド・パスの構成>「外部JARの追加」
「servlet-api.jar」を選択して「開く」押す。

import javax.servlet・・・のエラーが消えます

「HelloMsg.java」

package gradleapp3;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloMsg
 */
@WebServlet("/HelloMsg")
public class HelloMsg extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor.
     */
    public HelloMsg() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out=response.getWriter();
		out.println("<html>");
		out.println("Hello Gradleapp3!");
		out.println("</html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

②サーバを起動
 サーブレットクラスのdoGetメソッドのHTMLレスポンスが表示されます。

ブラウザからアクセス

(参考文献)
・「EclipseではじめるJavaフレームワーク入門 第5版」
 著者:掌田津耶乃 発行:株式会社秀和システム

The end