Sady zdrojov gradle

1. Prehľad

Zdrojové sady nám poskytujú efektívny spôsob štruktúrovania zdrojového kódu v našich projektoch Gradle.

V tomto rýchlom návode sa dozvieme, ako ich používať.

2. Predvolené sady zdrojov

Pred prechodom na predvolené hodnoty si najskôr vysvetlíme, čo sú to zdrojové sady. Ako už z názvu vyplýva, zdrojové sady predstavujú logické zoskupenie zdrojových súborov.

Budeme sa venovať konfigurácii projektov Java, ale koncepty sú použiteľné aj pre ďalšie typy projektov Gradle.

2.1. Predvolené rozloženie projektu

Začnime jednoduchou štruktúrou projektu:

zdrojové sady ├── src │ └── hlavné │ ├── java │ │ ├── SourceSetsMain.java │ │ └── SourceSetsObject.java │ └── test │ └── SourceSetsTest.java └── zostaviť. gradle 

Teraz sa pozrime na build.gradle:

apply plugin: "java" description = "Zdroj nastavuje príklad" test {testLogging {udalostí "prešiel", "preskočil", "zlyhal"}} závislosti {implementácia ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4,12')}

Java plugin predpokladá src / main / java a src / test / java ako predvolené zdrojové adresáre.

Poďme vytvoriť jednoduchú úlohu:

úloha printSourceSetInformation () {doLast {sourceSets.each {srcSet -> println "[" + srcSet.name + "]" print "-> Zdrojové adresáre:" + srcSet.allJava.srcDirs + "\ n" print "-> výstup adresáre: "+ srcSet.output.classesDirs.files +" \ n "println" "}}}

Vytlačíme tu iba niekoľko vlastností zdrojovej sady. Vždy môžeme skontrolovať celý JavaDoc, kde nájdete ďalšie informácie.

Poďme to spustiť a uvidíme, čo dostaneme:

$ ./gradlew printSourceSetInformation> Úloha: zdrojové sady: printSourceSetInformation [main] -> Zdrojové adresáre: [... / source-sets / src / main / java] -> Výstupné adresáre: [... / source- set / build / classes / java / main] [test] -> Zdrojové adresáre: [... / source-sets / src / test / java] -> Výstupné adresáre: [... / source-sets / build / classes / java / test] 

Všimnite si máme dve predvolené zdrojové sady: hlavný a test.

2.2. Predvolené konfigurácie

Doplnok Java pre nás tiež automaticky vytvára niektoré predvolené konfigurácie Gradle.

Postupujú podľa zvláštnej konvencie pomenovania: .

Používame ich na deklaráciu závislostí v build.gradle:

závislosti {implementation ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12')}

Všimnite si, že to špecifikujeme implementácia namiesto mainImplementácia. Toto je výnimka z konvencie pomenovania.

Predvolene, testImplementácia konfigurácia sa rozširuje implementácia a dedí všetky svoje závislosti a výstupy.

Poďme vylepšiť našu pomocnú úlohu a pozrime sa, o čo ide:

úloha printSourceSetInformation () {doLast {sourceSets.each {srcSet -> println "[" + srcSet.name + "]" print "-> Zdrojové adresáre:" + srcSet.allJava.srcDirs + "\ n" print "-> výstup adresáre: "+ srcSet.output.classesDirs.files +" \ n "print" -> Zostaviť cestu k triede: \ n "srcSet.compileClasspath.files.each {print" "+ it.path +" \ n "} println" "} }}

Poďme sa pozrieť na výstup:

[main] // rovnaký výstup ako predtým -> kompilovať cestu k triede: ... / httpclient-4.5.12.jar ... / httpcore-4.4.13.jar ... / commons-logging-1.2.jar .. ./commons-codec-1.11.jar [test] // rovnaký výstup ako predtým -> kompilovať cestu k triede: ... / source-sets / build / classes / java / main ... / source-sets / build / resources / main ... / httpclient-4.5.12.jar ... / junit-4.12.jar ... / httpcore-4.4.13.jar ... / commons-logging-1.2.jar ... / commons- kodek-1.11.jar ... / hamcrest-core-1.3.jar

The test zdrojová sada obsahuje výstupy z hlavný vo svojej kompilovanej triede ciest a zahŕňa aj jej závislosti.

Ďalej vytvoríme náš test jednotky:

verejná trieda SourceSetsTest {@Test public void whenRun_ThenSuccess () {SourceSetsObject underTest = nový SourceSetsObject ("lorem", "ipsum"); assertThat (underTest.getUser (), je ("lorem")); assertThat (underTest.getPassword (), je ("ipsum")); }}

Tu testujeme jednoduché POJO, ktoré ukladá dve hodnoty. Môžeme to použiť priamo, pretože the hlavný výstupy sú v našom test triedna cesta.

Ďalej to spustíme z Gradle:

./gradlew clean test> Úloha: zdrojové sady: test com.baeldung.test.SourceSetsTest> whenRunThenSuccess PASSED 

3. Vlastné sady zdrojov

Doteraz sme zaznamenali niekoľko rozumných zlyhaní. V praxi však často potrebujeme vlastné zdrojové sady, najmä pre integračné testy.

Je to preto, že možno budeme chcieť mať konkrétne testovacie knižnice iba na triede integračných testov. Možno by sme ich tiež chceli vykonať nezávisle na jednotkových testoch.

3.1. Definovanie vlastných množín zdrojov

Vytvorme samostatný zdrojový adresár pre naše integračné testy:

zdrojové sady ├── src │ └── hlavní │ ├── java │ │ ├── SourceSetsMain.java │ │ └── SourceSetsObject.java │ ├── test │ │ └── SourceSetsTest.java │ └── itest │ └── SourceSetsITest.java └── build.gradle 

Ďalej, poďme nakonfigurovať v našom build.gradle pomocou sady zdrojov konštrukt:

sourceSets {itest {java {}}} závislosti {implementation ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12')} // ďalšie vynechané deklarácie 

Všimnite si, že sme nezadali žiadny vlastný adresár. Je to preto, že náš priečinok sa zhoduje s názvom novej zdrojovej sady (itest).

Môžeme prispôsobiť, ktoré adresáre sú súčasťou srcDirs nehnuteľnosť:

sourceSets {itest {java {srcDirs ("src / itest")}}}

Pamätáte si na našu pomocnú úlohu od začiatku? Poďme to znova spustiť a uvidíme, čo sa vytlačí:

$ ./gradlew printSourceSetInformation> Úloha: zdrojové sady: printSourceSetInformation [itest] -> Zdrojové adresáre: [... / source-sets / src / itest / java] -> Výstupné adresáre: [... / source- sets / build / classes / java / itest] -> Compile classpath: ... / source-sets / build / classes / java / main ... / source-sets / build / resources / main [main] // same výstup ako predtým [test] // rovnaký výstup ako predtým

3.2. Priradenie konkrétnych závislostí sady zdrojov

Pamätáte si predvolené konfigurácie? Teraz máme niekoľko konfigurácií pre itest zdrojová sada tiež.

Poďme použiť itestImplementácia priradiť novú závislosť:

závislosti {implementation ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12') itestImplementation ('com.google.guava: guava: 29.0-jre')}

Toto sa týka iba integračných testov.

Upravme náš predchádzajúci test a pridajme ho ako test integrácie:

verejná trieda SourceSetsItest {@Test public void givenImmutableList_whenRun_ThenSuccess () {SourceSetsObject underTest = nový SourceSetsObject ("lorem", "ipsum"); List someStrings = ImmutableList.of ("Baeldung", "is", "cool"); assertThat (underTest.getUser (), je ("lorem")); assertThat (underTest.getPassword (), je ("ipsum")); assertThat (someStrings.size (), is (3)); }}

Byť schopný spustiť to, musíme definovať vlastnú testovaciu úlohu, ktorá využíva skompilované výstupy:

// deklarácie zdrojových súborov // deklarácie závislostí úloha itest (typ: Test) {description = "Spustiť integračné testy" skupina = "overenie" testClassesDirs = sourceSets.itest.output.classesDirs classpath = sourceSets.itest.runtimeClasspath}

Tieto vyhlásenia sa vyhodnocujú počas fázy konfigurácie. Ako výsledok, ich poradie je dôležité.

Napríklad nemôžeme odkazovať na itest zdroj nastavený v tele úlohy skôr, ako bude deklarovaný.

Pozrime sa, čo sa stane, ak spustíme test:

$ ./gradlew clean itest // niektoré problémy s kompiláciou PORUCHA: Zostavenie zlyhalo s výnimkou. * Čo sa pokazilo: Vykonanie úlohy „: source-sets: compileItestJava“ zlyhalo. > Kompilácia zlyhala; podrobnosti nájdete na výstupe chyby kompilátora.

Na rozdiel od predchádzajúceho spustenia sa nám tentokrát zobrazí chyba kompilácie. Takže, čo sa stalo?

Táto nová zdrojová sada vytvára nezávislú konfiguráciu.

Inými slovami, itestImplementácia nededí JUnit závislosť, ani nezíska výstupy z hlavný.

Opravíme to v našej konfigurácii Gradle:

sourceSets {itest {compileClasspath + = sourceSets.main.output runtimeClasspath + = sourceSets.main.output java {}}} // konfigurácie deklarácií závislostí {itestImplementation.extendsFrom (testImplementation) itestRuntimeOnly.extendsFrom (testRuntimeOnly)}

Teraz si zopakujme náš integračný test:

$ ./gradlew clean itest> Úloha: zdrojové sady: itest com.baeldung.itest.SourceSetsItest> givenImmutableList_whenRun_ThenSuccess PREDANÝ

Test vyhovuje.

3.3. Manipulácia s IDE Eclipse

Doteraz sme videli, ako pracovať so zdrojovými sadami priamo s Gradle. Väčšinou však používame IDE (napríklad Eclipse).

Keď importujeme projekt, dostaneme niekoľko problémov s kompiláciou:

Ak však spustíme test integrácie z Gradle, nedostaneme žiadne chyby:

$ ./gradlew clean itest> Úloha: zdrojové sady: itest com.baeldung.itest.SourceSetsItest> givenImmutableList_whenRun_ThenSuccess PREDANÝ

Takže, čo sa stalo? V takom prípade guava závislosť patrí itestImplementácia.

Bohužiaľ doplnok Eclipse Buildship Gradle tieto vlastné konfigurácie veľmi nezvláda.

Poďme opravte to v našom build.gradle:

apply plugin: "eclipse" // predchádzajúce deklarácie zatmenie {classpath {plusConfigurations + = [configurations.itestCompileClasspath]}} 

Poďme si vysvetliť, čo sme tu robili. Našu konfiguráciu sme pridali do triedy Eclipse.

Ak obnovíme projekt, problémy s kompiláciou sú preč.

Avšak tento prístup má nevýhodu: IDE nerozlišuje medzi konfiguráciami.

To znamená môžeme ľahko importovať guava v našom test zdroje (čomu sme sa konkrétne chceli vyhnúť).

4. Záver

V tomto tutoriáli sme sa venovali základom zdrojových množín Gradle.

Potom sme vysvetlili, ako fungujú vlastné zdrojové sady a ako ich používať v Eclipse.

Ako obvykle, kompletný zdrojový kód nájdeme na GitHube.


$config[zx-auto] not found$config[zx-overlay] not found