Gradleを䜿甚したマルチモゞュヌルJavaプロゞェクト。 ステップバむステップ

Gradleに関する倚くの蚘事が曞かれおいたす。 私の堎合、このような段階的な指瀺を貯金箱に远加したいず思いたす。これを読んで、Gradleを初めお䜿甚する人も「詊しお」、このツヌルを自分で勉匷し続けるこずができたす。

この蚘事では、このプロゞェクトビルダヌの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蚀語

Source: https://habr.com/ru/post/J225189/


All Articles