Gradleを使用したマルチモジュールJavaプロジェクト。 ステップバイステップ

Gradleに関する多くの記事書かれています。 私の場合、このような段階的な指示を貯金箱に追加したいと思います。これを読んで、Gradleを初めて使用する人も「試して」、このツールを自分で勉強し続けることができます。



この記事では、このプロジェクトビルダーのgradleプラグイン、タスク、依存関係、自動テストなどのトピックについて詳しく説明しません。 まず、各トピックは個別の記事または一連の記事に値するものであり、次に、ハブにはこれらのトピックに関する記事が既にあります。たとえば、 Gradle:Tasks Are CodeGradle: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.gradledependencies



ブロック)

 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になじみのない人々の関心を喚起し、より詳細な調査とその後のプロジェクトでのこのツールの使用を促すことを願っています。



ご清聴ありがとうございました。



追加:

MiniMgradleでは、「/」の代わりに記号「:」が使用され、より分岐構造の場合、プロジェクトリンクは次のようになります。:: loaders:xml-loader

leventovidea



プラグインにidea



ます。 issues.gradle.org/browse/GRADLE-1041 、最後のコメントには解決策があります。



便利なリンク


bitbucketの記事zipアーカイブ )で作成されたプロジェクトのソース

グラドル

Gradleユーザーガイド

Apacheロギングサービス

Apache Maven

Groovy言語



All Articles