この記事では、このプロジェクトビルダーのgradleプラグイン、タスク、依存関係、自動テストなどのトピックについて詳しく説明しません。 まず、各トピックは個別の記事または一連の記事に値するものであり、次に、ハブにはこれらのトピックに関する記事が既にあります。たとえば、 Gradle:Tasks Are Code 、 Gradle:Better Way To Buildです。 また、Gradleの公式Webサイトには、美しく書かれたGradleユーザーガイドがあります。 タスクの当面の解決策に焦点を当て、すべての関連トピックはこのタスク自体のフレームワークで説明します。
最初に目標を決めます。出口で何を取得しますか? そして、目標は記事のタイトルに示されています。 Gradleを使用して構築されたいくつかのモジュールを含むプロジェクトを取得します。 それでは、始めましょう。
ステップ1. gradleをインストールする
注: 記事のファイルをダウンロードしてgradleを「再生」したい場合、またはプロジェクトのルートにマジックファイルgradlew(gradlew.bat)を使用して他の人のソースを取得した場合、gradleをインストールする必要はありません。
Gradleは、Gradle ダウンロードページから最新バージョンをダウンロードするか、お気に入りのOSのパッケージマネージャーを使用してインストールできます(注:Mac OSにはbrew経由で、Debianには標準ソースからapt-get経由でインストールしました)
最初のステップの結果:
$ gradle -version ------------------------------------------------------------ Gradle 1.11 ------------------------------------------------------------ Build time: 2014-02-11 11:34:39 UTC Build number: none Revision: a831fa866d46cbee94e61a09af15f9dd95987421 Groovy: 1.8.6 Ant: Apache Ant(TM) version 1.9.2 compiled on July 8 2013 Ivy: 2.2.0 JVM: 1.8.0_05 (Oracle Corporation 25.5-b02) OS: Mac OS X 10.9.3 x86_64
ステップ2.プロジェクト、プラグイン、ラッパーを空にする
プロジェクトフォルダーを作成し、そのルートに次の内容の
build.gradle
ファイルを作成します。
{project_path} /build.gralde
apply plugin: “java” apply plugin: “application” task wrapper(type: Wrapper) { gradleVersion = '1.12' }
ファイルに書き込んだ内容を詳しく見てみましょう。 動的言語Groovyを使用します。 gradleで本格的なプログラミング言語を使用すると、宣言型言語を使用するパッケージビルダーに比べて自由度が高くなります。
このファイルには、
java
プラグインと
application
プラグインが含まれています。
java
プラグインには、jar(jarアーカイブをコンパイルする)、compileJava(ソースコードをコンパイルするなど)などの便利なタスクが含まれています 。プラグインの詳細については、 こちらをご覧ください 。
application
プラグインには次のタスクが含まれ
application
。run-
application
起動します。 installApp-アプリケーションをコンピューターにインストールします。このタスクは、* nixおよびWindows用の実行可能ファイル(batファイル)を作成します。 distZip-アプリケーションをzipアーカイブに収集し、すべてのjarファイルとオペレーティングシステム固有のスクリプトをそこに配置します。 プラグインの詳細については、 ドキュメントを参照してください 。
次に、
wrapper
タスクについて詳しく説明します。 この非常に便利なタスクは、おそらくプログラマーの生活を楽にするために設計された最も独創的なソリューションです。
$ gradle wrapper
すると、次の結果が得られます。
$ gradle wrapper :wrapper BUILD SUCCESSFUL Total time: 7.991 secs
$ ls -a . .. .gradle build.gradle gradle gradlew gradlew.bat
このスクリプトは、* nixのgradlew実行可能ファイル、Windowsのgradlew.bat、およびgradleフォルダーと.gradleフォルダーを作成したことがわかります。 非表示の.gradleフォルダーは、リポジトリーから省略することができ、依存ライブラリーが含まれています。 すべての基本は、gradleとgradlewファイル自体にあります。 これで、適切なバージョンのjdkを持っている人にプロジェクトを安全に渡すことができ
./gradlew
使用してプロジェクトをコンパイル、アセンブル、インストールできます。 gradleの私のバージョン(上記の
$ gradle -version
結果を参照)はbuild.gradleファイルで指定したものとは異なりますが、これは恐ろしいことではありません。ラッパータスクを実行した後、必要なgradleのバージョンを取得するからです。
$ ./gradlew -version ------------------------------------------------------------ Gradle 1.12 ------------------------------------------------------------ Build time: 2014-04-29 09:24:31 UTC Build number: none Revision: a831fa866d46cbee94e61a09af15f9dd95987421 Groovy: 1.8.6 Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013 Ivy: 2.2.0 JVM: 1.8.0_05 (Oracle Corporation 25.5-b02) OS: Mac OS X 10.9.3 x86_64
これで、
gradlew
代わりに
gradle
gradlew
を安全に使用
gradlew
ます。 ところで、パラメーターなしで
$ ./gradlew
を実行すると、
.gralde
フォルダーが作成され、
.gralde
すべての依存ライブラリーがダウンロードされます(以下の依存関係について)。 しかし、gradle(gradlew)の開始時に依存関係がチェックされ、欠落しているファイルがダウンロードされるため、このコマンドの実行は必要ありません。 したがって、gradlewファイルが配置されているプロジェクトを受け取ったら、すぐに目的のタスクを起動できます。そのリストは、コマンド
./gradlew tasks
取得できます。
2番目のステップの結果(結論は減ります):
$ ./gradlew tasks :tasks ------------------------------------------------------------ All tasks runnable from root project ------------------------------------------------------------ Application tasks ----------------- distTar - Bundles the project as a JVM application with libs and OS specific scripts. distZip - Bundles the project as a JVM application with libs and OS specific scripts. installApp - Installs the project as a JVM application along with libs and OS specific scripts. run - Runs this project as a JVM application ... Other tasks ----------- wrapper ... To see all tasks and more detail, run with --all. BUILD SUCCESSFUL Total time: 7.808 secs
ステップ3.空白を埋める
この段階で、すでにいくつかの
gradle
タスクを実行できます。 jarファイルをコンパイルすることもできますが、そこには空のマニフェストしかありません。 コードを作成します。 GradleはデフォルトでMavenと同じディレクトリ構造を使用します。
src -main -java -resources -test -java -resources
main/java
はプログラムのjavaファイル、
main/resources
は残りのファイル(* .properties、* .xml、* .imgなど)です。
test
は、
test
に必要なファイルが含まれています。
この記事ではテストは考慮されないため、すべてのサブフォルダーで
src/main
フォルダーを作成し、アプリケーションの作成を開始します。 アプリケーションはHello Worldで、 Log4jライブラリを使用します。 依存関係がgradleでどのように機能するかを理解するだけです。
build.gradle
ファイルに変更を加え、
src/main/java
フォルダー内のメインアプリケーションクラスと設定ファイルLog4j
src/main/resources/log4j.xml
使用して
com/example/Main.java
ファイルを作成します。 そして、
gradle.properties
ファイル(オプション、以下の詳細)
{project_path} /build.gradle
apply plugin: "java" apply plugin: "application" mainClassName = "com.example.Main" sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 repositories { mavenCentral() } dependencies { compile "log4j:log4j:1.2.17" } jar { manifest.attributes("Main-Class": mainClassName); } task wrapper(type: Wrapper) { gradleVersion = "1.12" }
{project_path} /gradle.properties
org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home/
{project_path} /src/main/java/com/example/Main.java
package com.example; import org.apache.log4j.Logger; public class Main { private static final Logger LOG = Logger.getLogger(Main.class); public static void main(String[] args) { LOG.info("Application started"); System.out.println("I'm the main project"); LOG.info("Application finished"); } }
{project_path} /src/main/resources/log4j.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p %c: %m%n"/> </layout> </appender> <root> <priority value ="debug" /> <appender-ref ref="console" /> </root> </log4j:configuration>
build.gradle
ファイルへの変更を検討してください。 変数
mainClassName
を追加しました。 アプリケーションのメインクラスを示し、
run
タスクで
application
プラグインによって使用されます。 起動されるのはこのクラスです。
sourceCompatibility
targetCompatibility
と
targetCompatibility
も追加し、値
JavaVersion.VERSION_1_7
割り当てました。 これらは
java
プラグインの変数であり、ビルド時に必要なjdkのバージョンを示します。 次のブロックは
repositories
。 このブロックでは、 Mavenリポジトリーを接続します。 Gradleは彼と非常に「友好的」です。
dependencies
ブロックには、アプリケーションの依存関係が含まれています。 ドキュメントの設定の微妙さを見ます 。 ここで、
compile
タスクにはlog4jが必要であることを示します。 この例には、簡単な構文があります。 詳細なバージョンを書くと、次のようになります。
complie group: 'log4j', name: 'log4j', version: '1.2.17'
比較のために、Mavenの同様のブロック:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
compile files('libs/a.jar', 'libs/b.jar')
および
compile project(':library_project')
サブプロジェクトの
compile project(':library_project')
依存関係を構成することもできます。
build.gradle
への最後の追加は、
jar
ブロックです。 また、
java
プラグインも指します。 jarファイルを構築するための追加情報が含まれています。 この場合、上記で宣言した
mainClassName
変数を使用して、メインクラスをマニフェストに追加します。
以下は、オプションの
gradle.properties
ファイルです。 このファイルの説明はドキュメント全体に散らばっています 。 こことここに少しあります 。 この場合、実際には
JAVA_HOME
変数をオーバーライドしてい
JAVA_HOME
。 私の場合、記事の冒頭で注意することができるように、jdkの複数のバージョンがある場合、これは当てはまります。
$ gradle -version
は、
JVM: 1.8.0_05 (Oracle Corporation 25.5-b02)
バージョン
JVM: 1.8.0_05 (Oracle Corporation 25.5-b02)
ます。
src/main/java/Main.java
および
src/main/resources/log4j.xml
について
src/main/java/Main.java
するのは無意味だと思います。すべてが非常に単純だからです。 Loggerに2つのメッセージを送信します。「I'm the main project」というメッセージがコンソールに表示されます。 log4j設定ファイルは、ロガーもコンソールにメッセージを出力することを示しています。
3番目のステップの結果:
$ ./gradlew run :compileJava Download http://repo1.maven.org/maven2/log4j/log4j/1.2.17/log4j-1.2.17.jar :processResources :classes :run INFO com.example.Main: Application started I'm the main project INFO com.example.Main: Application finished BUILD SUCCESSFUL Total time: 14.627 secs
不足しているライブラリがダウンロードされており、その使用が実証されていることがわかります。
ステップ4.目標に到達する
私たちはすでに、gradleで動作し、ビルドし、実行するプロジェクトを持っています。 最小の詳細を完成させるために残っています:gradleの用語を使用して、記事またはmulti-projectのタイトルに記載されているマルチモジュールを実装します。 プロジェクトのルートに
main_project
と
library_project
2つのディレクトリを作成します。
src
フォルダーと
build.gradle
ファイルを作成したばかりの
main_project
ディレクトリーに
main_project
し、ルートに次の内容を持つ新しい
settings.gradle
ファイルを作成し
settings.gradle
(このファイルの詳細はこちら )。
{project_path} /settings.gradle
rootProject.name = 'Gradle_Multiproject' include 'main_project'
このファイルでは、プロジェクトの名前と接続するフォルダーを指定します(実際には独立したgradleプロジェクト)。 この段階では、
main_project
フォルダーが1つ必要です。 このような変更の後、
$ ./gradlew run
または特定のサブプロジェクト
$ ./gradlew main_project:run
、ステップ3の最後と同じ結果を取得できます。つまり、作業中のプロジェクトです。 他のすべてのjar、build、installAppコマンドなども実行できます。 特定のサブプロジェクトを指定しない場合、Gradleは、このタスクを持つすべての接続されたサブプロジェクトでタスクを開始します(たとえば、アプリケーションプラグインが1つのサブプロジェクトのみに接続されている場合、main_projectがあり、コマンド
$ ./gradlew run
はこのサブプロジェクトの実行のみを実行します)
ここで、
library_project
コードを作成します。
build.gradle
と
src/main/java/com/example/library/Simple.java
作成します
{project_path} /library_project/build.gradle
apply plugin: "java" sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7
{project_path} /library_project/src/main/java/com/example/library/Simple.java
package com.example.library; public class Simple { private int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } }
このサブプロジェクトの
build.gradle
ははるかに簡単です。 Javaプラグインを使用し、変数をJDKバージョンで設定します。 この記事ではこれで十分です。 ここで、gradleにlibrary_project
library_project
について知ってもらいたいので、これを
settings.gradle
ファイルで説明します。
{project_path} /settings.gradle
rootProject.name = 'Gradle_Multiproject' include 'main_project', 'library_project'
これで、コマンド
$ ./gradlew library_project:jar
を使用して、ライブラリを含むjarファイルをコンパイルできます。
$ ./gradlew library_project:jar :library_project:compileJava :library_project:processResources UP-TO-DATE :library_project:classes :library_project:jar BUILD SUCCESSFUL Total time: 10.061 secs
結果のファイルは
{project_path}/library_project/build/libs/library_project.jar
ます。
次に、
Simple
クラスの使用を
main_project
追加しましょう。 これを行うには、
{project_path}/main_project/build.gradle
ファイルの
dependencies
ブロックにライン
compile project(":library_project")
を
{project_path}/main_project/build.gradle
ます。これは、このモジュールでコンパイルタスクを実行するために
library_project
プロジェクトが必要であることを示します。
MiniMからの追加 : gradleでは、「/」の代わりに記号「:」が使用され、より分岐した構造の場合、プロジェクトリンクは次のようになります。:: loaders:xml-loader
{project_path} /main_project/build.gradle (
dependencies
ブロック)
dependencies { compile "log4j:log4j:1.2.17" compile project(":library_project") }
{project_path} /main_project/src/main/java/com/example/Main.java
package com.example; import org.apache.log4j.Logger; import com.example.library.Simple; public class Main { private static final Logger LOG = Logger.getLogger(Main.class); public static void main(String[] args) { LOG.info("Application started"); System.out.println("I'm the main project"); Simple simple = new Simple(); simple.setValue(10); System.out.println("Value from Simple: " + simple.getValue()); LOG.info("Application finished"); } }
確認できます。
4番目のステップの結果:
$ ./gradlew run :library_project:compileJava UP-TO-DATE :library_project:processResources UP-TO-DATE :library_project:classes UP-TO-DATE :library_project:jar UP-TO-DATE :main_project:compileJava :main_project:processResources UP-TO-DATE :main_project:classes :main_project:run INFO com.example.Main: Application started I'm the main project Value from Simple: 10 INFO com.example.Main: Application finished BUILD SUCCESSFUL Total time: 11.022 secs
ステップ5(最終)。 ごみを取り除く
主な目標は達成されましたが、この段階では、ビルドファイル内の情報の複製、gradleのより深い設定、さらには何をさらに検討するかについて、かなり論理的な疑問が生じる可能性があります。 独立した学習については、記事の最後にあるリンクの内容を読むことをお勧めします。 それまでは、プロジェクトのルートに
build.gradle
を作成し、残りのビルドファイルの内容を変更して、ビルドファイルを整理しましょう。
{project_path} /build.gradle
apply plugin: "idea" apply plugin: "eclipse" subprojects { apply plugin: "java" tasks.withType(JavaCompile) { sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 } repositories { mavenCentral() } } task wrapper(type: Wrapper) { gradleVersion = "1.12" }
{project_path} /main_project/build.gradle
apply plugin: "application" version = '1.0' mainClassName = "com.example.Main" dependencies { compile "log4j:log4j:1.2.17" compile project(":library_project") } jar { manifest.attributes("Main-Class": mainClassName); }
{project_path} /build.gradle
version = "1.1_beta"
ルート
build.gradle
には、すべてのプロジェクトに適用されるもの(実際、すべての設定は一般的に保存できますが、大きなファイルを分離することを好みます)およびサブプロジェクトに不要なものを保存します。たとえば、1つのラッパーのみが必要です。ルートで。
subprojects
ブロックに、
subprojects
の設定を配置します。つまり、javaプラグインを接続します。誰もが必要です。 jdkバージョンを設定します。 Mavenリポジトリーを接続します。 また、このファイルでは、 IdeaプラグインとEclipseプラグインを接続します。 これらのプラグインには、対応するIDEのプロジェクトファイルを生成するためのタスクが含まれています。 そして、ここでラッパータスクを転送します。 すべてに共通のgradlewファイルを作成するには、ルートでのみ必要です。
サブプロジェクトでは、不要なものをすべて削除し、
version
変数を追加しました。 この変数の値はjarファイルに追加されます。たとえば、library_project.jarの代わりにlibrary_project-1.1.beta.jarが作成されます。
subprojects
ブロックに加えて、
allprojects
または
project(':project_name')
使用できます。 詳細はこちら 。
これで終わります。 この記事がGradleになじみのない人々の関心を喚起し、より詳細な調査とその後のプロジェクトでのこのツールの使用を促すことを願っています。
ご清聴ありがとうございました。
追加:
MiniM : gradleでは、「/」の代わりに記号「:」が使用され、より分岐構造の場合、プロジェクトリンクは次のようになります。:: loaders:xml-loader
leventov :
idea
プラグインに
idea
ます。 issues.gradle.org/browse/GRADLE-1041 、最後のコメントには解決策があります。
便利なリンク
bitbucketの記事 ( zipアーカイブ )で作成されたプロジェクトのソース
グラドル
Gradleユーザーガイド
Apacheロギングサービス
Apache Maven
Groovy言語