FRÅN MAVEN TILL GRADLE



Relevanta dokument
ID1020 Introduktion av Maven. Dr. Jim Dowling

Laboration 10 - NetBeans

Testramverk och Model based testing med java i praktiken

Android översikt. TDDD80 Mobila och sociala applikationer

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Att använda Java SE JDK 6

FactoryCast HMI. Premium & Quantum PLC. Applets

Laboration 10 - Eclipse

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Reguljära uttryck. Reguljära uttryck. Nu kommer en siffra78 och en till SIFFRA(78) men utan 7kstuga SIFFRA(89)

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Tentamen Programmering fortsättningskurs DIT950

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Kompilering av Java-program med eclipse SDK för den som kan BlueJ

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

2I1049 Föreläsning 9. Iterativ programutveckling. Iterativ programutveckling. Modularisering, återanvändning och JavaBeans

Separation of Concern. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Objektorienterad programmering

Internationalisering/lokalisering på webben

emopluppen Användning av "Ant" Niklas Backlund Version: 1.4 ( 2002/04/26 07:27:52 UTC)

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

NetBeans 5.5. Avsikt. Projektfönster

Att använda Java SE JDK 6

Här beskrivs Eclipse, den programutvecklingsmiljö som utnyttjas i programmeringskurserna. Mera information finns på:

INSTALLATION...3 ATT KOMMA IGÅNG...3 PROGRAMMETS DESIGN...4 LÄGGA TILL TABELL...4 EDITERA TABELL...4 EDITERA RELATION...5 SPARA OCH AVSLUTA...

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

DAT043 - Föreläsning 7

Stackar, köer, iteratorer och paket

Guide Ett FitNesse-test

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Verktyg och Utvecklingsmiljö. Jochim von Hacht

Föreläsning 1 & 2 INTRODUKTION

ID1004 Laboration 4, November 2012

ID1004 Laboration 3, 5-6 November 2012

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag till exempeltenta 1

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

JAVA Mer om klasser och objektorientering

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Snabbguide Visma Compact API Copyright Visma Spcs AB

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Verktyg och Utvecklingsmiljö. Föreläsning 2 Eclipse

Det finns många flaggor till g++,

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

JUnit. Ska kompletteras med kodexempel på JUnit. DD2385 Programutvecklingsteknik Några bilder till föreläsning 12 21/5 2012

Föreläsning 10. Paket Synlighet Arkiv. DA129A Programmering 1

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

NetBeans 7. Avsikt. Projektfönster

Inledande programmering med C# (1DV402) Introduktion till C#

Föreläsning 2. Länkad lista och iterator

Separation of Concern. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

DAT043 - föreläsning 8

Nationell rekommendation R-RCT. Teknisk och funktionell översikt

Arv. Objektorienterad och komponentbaserad programmering

DAT043 Objektorienterad Programmering

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Upplägg. Introduktion. Examination. Mål. Konsekvenser. Java. Kursen heter konstruktion, ej design eller formgivning.

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Arbeta med databas. Översikt. Lektion 1: Arbeta med Entity Data Models. Arbeta med Entity Data Models. LINQ (Language Integrated Query).

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Entreprenöriell programmering TDP028

Tentamen. Grundläggande programmering i Java A 5p, DTAA

Att skriva till och läsa från terminalfönstret

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Algoritmer. Två gränssnitt

Identitet och ekvivalens

Föreläsning 2. Länkad lista och iterator

Snabbguide Visma Compact API Version 5.1 Copyright Visma Spcs AB Visma Compact API

F4. programmeringsteknik och Matlab

Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. Skriv ditt idnummer på varje blad (så att vi inte slarvar bort dem).

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Classes och Interfaces, Objects och References, Initialization

Tentamen. Lösningsförslag

Föreläsning 13 Innehåll

Agil användbarhetsutveckling för handhållna enheter. Per Lind

Tillämpad programmering

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

OOMPA 2D1359 Föreläsning 3

Dugga i Grundläggande programmering STS, åk

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Läsanvisning: Dessa OH bilder samt kap 1-3

PAINTFEUD. Erfarenheter

Transkript:

FRÅN MAVEN TILL GRADLE JESPER HOLMBERG 2015-01-28 CALLISTAENTERPRISE.SE

VARFÖR GRADLE? Är enkelt att lära sig för den som arbetat med Maven. Kan använda befintliga maven-repon för beroenden. Kan reducera antalet rader i byggfiler med 75-80%. Kan konfigureras med ett riktigt JVM-språk. Är designat för att anpassas efter projektets behov inte tvärtom. Kan uttrycka komplexa beroenden på ett flexibelt sätt. Kan bygga ett stort projekt parallellt på flera kärnor. Utvecklas snabbt just nu. Är roligt att arbeta med! 2

KOD-EXEMPEL 1 3

LIKHETER MELLAN MAVEN OCH GRADLE Fördefinierad filstruktur ( src/main/java, src/test/java ) Maven-repositories Klassificering av beroenden (grupp, modul, version) Förinstallerade byggsteg (gradle tasks) för det man vill göra (compile, test, jar, ) Beroende-kedja mellan byggsteg Flera uppsättningar classpaths: scope i maven, configuration i gradle. Funktionaliteten kan utökas genom pluginer. 4

SKILLNADER MELLAN MAVEN OCH GRADLE 5 Gradle är språk-agnostiskt: t.o.m. java-stöd måste laddas genom en plugin. Gradle har inte mavens faser, istället en beroende-graf av tasks som liknar ants targets. Gemensam funktionalitet modelleras explicit i underprojekt, snarare än genom arv till ett föräldra-projekt. Många problem som man i maven löser med en plugin löser man i gradle med några rader groovy-kod. Gradle har ett strukturerat API i flera lager som gör det lätt att lösa specifika problem med elegant programmatisk kod.

SKILLNADER MELLAN MELLAN MAVEN OCH GRADLE Groovy! Gradle är språk-baserat snarare än plugin-baserat. Många saker som man i maven löser med en plugin löser man i gradle med några rader groovy-kod. Deklarativ kod är bättre än programmatisk kod, men i gradle är även programmatisk kod OK. Gradle har ett strukturerat API i flera lager som gör det lätt att lösa specifika problem med elegant programmatisk kod. 6

GRADLE BASICS: CONFIGURATIONS Configuration är ett viktigt begrepp i gradle-modellen. Begreppet liknar scope i maven. En configuration är en gruppering av beroenden, liknande en classpath. Olika configurations används vid olika uppgifter i bygget. Varje configuration har sin egen anpassning, t.ex. om dess beroenden är transitiva. En configuration skapas antingen via en plugin eller direkt i byggfilen. 7

CONFIGURATIONS Java-pluginen definierar ett antal viktiga configurations: compile, runtime, testcompile, testruntime och archives - compile används vid kompilering av produktionskoden. - runtime används vid körning av produktionskoden. - testcompile används vid kompilering av tester. - testruntime används för körning av tester. - archives representerar de byggda artefakterna (jar-fil, ear-fil etc) 8

CONFIGURATIONS DEFINIERADE I JAVA-PLUGINEN compile archives runtime testcompile testruntime 9

KOD-EXEMPEL 2 10

FRÅN MAVEN TILL GRADLE Automatkonverteringen av vårt projekt har bara givit oss en första skiss att fylla i. Skissen innehåller ett par grundläggande gradle-pluginer som java och war men inga maven-pluginer har översatts. Funktionalitet från mavens pluginer kan vi antingen översätta med en gradle-plugin eller genom groovy-kod i bygg-filerna. Första exemplet är java-kods-generering från wsdl-filer. 11

WSDL-GENERERING I ANT <target name="wsdltojava"> <java classname="org.apache.cxf.tools.wsdlto.wsdltojava" fork="true"> <arg value="-validate"/> <arg value="-d"/> <arg value="src/generated"/> <arg value="resources/hsa.wsdl"/> <classpath> <path refid="cxf.classpath"/> </classpath> </java> </target> <path id="cxf.classpath"> <pathelement location="lib/cxf-2.7.9.jar"/> </path> 12

WSDL-GENERERING I MAVEN 13 <plugin> <groupid>org.apache.cxf</groupid> <artifactid>cxf-codegen-plugin</artifactid> <version>2.7.9</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <sourceroot>src/generated</sourceroot> <wsdloptions> <wsdloption> <extraargs> <extraarg>-validate</extraarg> </extraargs> <wsdl>src/main/resources/hsa.wsdl</wsdl> </wsdloption> </wsdloptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin>

WSDL-GENERERING I GRADLE (PLUGIN) apply plugin: 'no.nils.wsdl2java' wsdl2java { generatedwsdldir = file("src/generated") wsdlstogenerate = [ ['src/main/resources/hsa.wsdl'], ['-validate', '-d', 'src/generated'] ] cxfversion = "2.7.9" 14

WSDL-GENERERING I GRADLE ( FÖR HAND ) task wsdl2java(type: JavaExec) { classpath configurations.wsdlgen main "org.apache.cxf.tools.wsdlto.wsdltojava" args "-validate", '-d', "src/generated", "src/main/resources/hsa.wsdl" compilejava.dependson(wsdl2java) sourcesets.main.java { srcdir "src/generated configurations { wsdlgen dependencies { wsdlgen "org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:2.7.9" 15

FITNESSE 16 Ett exempel på en plugin som inte finns (än) är Fitnesse, som är ett verktyg för automatiserade acceptanstester. För att skriva Fitnesse-tester startar man en Fitnesse-wiki-server. Från wiki-sidan kan man sedan starta testerna. Vi behöver två classpather: - För att starta Fitnesse-servern behöver vi en fitnesse-configuration. - För testerna behöver vi en classpath med vår egen kod och alla beroenden, i en systemvariabel vars värde ser ut så här:!path /opt/project/ /project.jar!path /opt/project/ /lib1.jar!path /opt/project/ /lib2.jar

task fitnessewiki << { project.javaexec { main = "fitnesse.fitnesse" classpath = configurations.fitnesse systemproperties = ['test.classpath': testpathforwiki()] args = ['-p', 9125, '-d', 'src/test/fitnesse', '-o'] build.gradle def testpathforwiki() { (configurations.archives.artifacts.files + configurations.runtime.asfiletree).collect { file -> "!path ${file.path".join("\n") configurations { fitnesse dependencies { fitnesse "org.fitnesse:fitnesse:20140901" 17

ext.fitnesseport = 9125 ext.fitnessedir = "src/test/fitnesse" class Fitnesse extends DefaultTask { @TaskAction def runfitnesse() { project.javaexec { main = "fitnesse.fitnesse" classpath = project.configurations.fitnesse systemproperties = ["test.classpath": testpathforwiki()] args = ['-p', project.fitnesseport, '-d', project.fitnessedir, '-o'] build.gradle def testpathforwiki() {... task fitnessewiki(type: Fitnesse) configurations { fitnesse dependencies { fitnesse "org.fitnesse:fitnesse:20140901" 18

EN TASK-TYP KAN ÅTERANVÄNDAS Fitnesse.groovy class Fitnesse { buildsrc/src/main/groovy/ Fitnesse.groovy class Fitnesse { FitnessePlugin: Fitnesse.groovy class Fitnesse { build.gradle apply from: Fitnesse.groovy task fitnesse(type Fitnesse) build.gradle import Fitnesse task fitnesse(type Fitnesse) build.gradle apply plugin: Fitnesse 19

BUILDSRC-KATALOGEN All kod som läggs i rot-projektets buildsrc-kod kompileras automatiskt och finns tillgänglig i bygg-filerna. Koden i buildsrc kan vara skriven i det JVM-språk man föredrar. Med koden i buildsrc kan gemensam funktionalitet delas på många ställen i bygg-filerna. 20

import org.gradle.api.defaulttask import org.gradle.api.tasks.taskaction class Fitnesse extends DefaultTask { @TaskAction def runfitnesse() { project.javaexec { main = "fitnesse.fitnesse" classpath = project.configurations.fitnesse systemproperties = ["test.classpath": testpathforwiki()] args = ['-p', project.fitnesseport, '-d', project.fitnessedir, '-o'] buildsrc/src/main/groovy/fitnesse.groovy def testpathforwiki() {... 21

import Fitnesse task fitnessewiki(type: Fitnesse) build.gradle ext.fitnesseport = 9125 ext.fitnessedir = "src/test/fitnesse configurations { fitnesse dependencies { fitnesse "org.fitnesse:fitnesse:20140901" 22

EN EGEN PLUGIN Genom att skriva en egen plugin kan man distribuera gemensam funktionalitet till många projekt. Ett plugin-projekt är ett vanligt gradle-projekt, skrivet i groovy eller java (eller scala, eller clojure) Några filer behöver finnas på plats för att gradle ska kunna koppla in pluginen på rätt sätt: - En klass som implementerar interfacet Plugin. - En fil som anger vad pluginen ska kallas i bygg-filerna. - Task-klasser som implementerar funktionaliteten. 23

KOD-EXEMPEL 3 24

buildscript { dependencies { classpath 'se.test:gradle-fitnesse-plugin:1.0-snapshot' build.gradle apply plugin: 'fitnesse task fitnessewiki(type: Fitnesse) ext.fitnesseport = 9125 ext.fitnessedir = "src/test/fitnesse" configurations { fitnesse dependencies { fitnesse "org.fitnesse:fitnesse:20140901" 25

KOD-EXEMPEL 4 26

buildscript { dependencies { classpath 'se.test:gradle-fitnesse-plugin:1.0-snapshot' build.gradle apply plugin: 'fitnesse' fitnesse { port = 9125 workingdir = "src/test/fitnesse" 27

VAD ÅTERSTÅR? Ersätt all funktionalitet med plugin eller egna tasks. Samla gemensam funktionalitet i subprojects {. Städa beroenden, ta bort duplicerade beroenden. Ladda upp artefakter till maven-repo. 28

VARFÖR GRADLE? Kan använda befintliga maven-repon för beroenden. Kan reducera antalet rader i byggfiler med 75-80%. Kan konfigureras med ett riktigt JVM-språk. Är designat för att enkelt kunna användas för olika behov. Kan uttrycka komplexa beroenden på ett kraftfullt och flexibelt sätt. Kan bygga ett stort projekt parallellt på flera kärnor. Utvecklas snabbt just nu. Är roligt att arbeta med! 29

AVANCERAD BEROENDE-HANTERING Genom gradles API är det enkelt att specialbehandla vissa beroenden. ---- configurations.all { resolutionstrategy.eachdependency { dependency -> if (dependency.requested.name == 'commons-logging') { dependency.usetarget 'org.slf4j:jcl-over-slf4j:1.7.7' 30

PROVIDED SCOPE Provided scope saknas i gradle, men kan enkelt skapas. ---- configurations { provided sourcesets { main { compileclasspath += configurations.provided dependencies { provided "org.apache.geronimo.specs:geronimo-jms_1.1_spec:1.1.1" 31

PROFILER 32 Stöd för profiler saknas i gradle, men kan enkelt skapas. ---- task loadconfiguration { addprojectpropertiesfromfile(file( configs/${env/build.properties")) private void addprojectpropertiesfromfile(propfile) { def props = new Properties(); propfile.withinputstream { props.load(it) allprojects { subproject -> props.each { key, value -> subproject.ext.setproperty(key, value.tostring())

ANT FINNS TILLGÄNGLIGT UTAN SÄRSKILD KONFIGURERING Alla ant-targets finns tillgängliga i gradle utan särskild konfigurering. ---- task createversionpropertyfile(dependson: processresources) << { def propertyfile = "${builddir/resources/main/version.properties" ant.touch(file: propertyfile, mkdirs: "true") ant.propertyfile(file: propertyfile) { entry(key: 'project.version', default: project.version) jar.dependson createversionpropertyfile 33