Gradle: Grégory Boissinot
Gradle: Grégory Boissinot
Gradle: Grégory Boissinot
Grégory Boissinot
Présentation Gradle 1
• Consultant et formateur chez Zenika
• Mes spécialités
– Ant/Ivy
– Maven
– Gradle
– Hudson
• Contributeur Hudson
Présentation Gradle 2
• Système de build pour la JVM Java, focalisé sur le build
des applications d'entreprise
Présentation Gradle 3
1ère génération 2ème génération 3ème génération
3
1
Présentation Gradle 4
<!–- ANT -- build.xml -->
<project>
<property name="version"
<!–- MAVEN – pom.xml-->
value="1.0"/>
<?xml version="1.0" encoding="UTF-8"?>
<target name="antTask>
<project>
<echo message="Hello"/>
<modelVersion>4.0.0</modelVersion>
</target>
<groupId>com.zenika</groupId>
</project>
<artifactId>zenikac-core</artifactId>
<version>1.0</version>
<!–- GRADLE– build.gradle --> <dependencies>
apply plugin:'java' <dependency>
<groupId>org.apache.wicket</groupId>
repositories { <artifactId>wicket</artifactId>
mavenCental() <version>1.4.7</version>
flatDir(dirs:'lib') <scope>compile</scope>
} </dependency>
</dependencies>
dependencies { </project>
compile
"org.apache.wicket:wicket:1.4.7"
}
Présentation Gradle 5
Distribution Gradle
api
outils
Librairies tierces
Présentation Gradle 6
Écrire un script Gradle consiste à configurer un objet Gradle Project
configurations
repositories
dependencies
build.gradle
Project
ant
task artifacts
API
Présentation Gradle 7
Un script de build Gradle est défini par un ensemble de tâches sur
lesquelles sont ajoutées des actions qui sont des closures Groovy
Zip Tar
public class Copy extends AbstractCopyTask {
public AbstractCopyTask from(Object... sourcePaths);
public AbstractCopyTask into(Object destDir);
}
Jar
War
Présentation Gradle 9
<!– HelloTask.groovy -->
class HelloTask extends DefaultTask {
@TaskAction
public void print(){ > gradle myhello
println message :myhello
} Default Message
}
> gradle myhello2
<!-- build.gradle --> :myhello2
Task Message
task(myhello, type:HelloTask)
task(myhello2, type:HelloTask){
message="Task Message"
}
Présentation Gradle 10
ant {
def wsdl2java_classpath = path {
fileset(dirs:'lib', includes: '*.jar')
}
taskdef(
name: 'axiswsdl2java',
classname:
'org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask',
classpath: wsdl2java_classpath )
axiswsdl2java( output:"generated",
verbose:"true" ,
url:"Exemple.wsdl" )
}
ant.echo (message:ANT)
Présentation Gradle 11
build.xml
<project>
<target name="antTask">
<echo message="Hello from Ant"/>
</target>
</project>
build.gradle
ant.importBuild('build.xml')
antTask.doLast {
println('Hello from Gradle')
}
Assert.assertTrue( ! zipTree(myzip.archivePath).isEmpty())
ziptxtfiles=zipTree(myzip.archivePath).matching{
include('*.txt')
}
txtfiles=fileTree('somedir').include('*.txt')
Assert.assertEquals (
txtfiles.getFiles().size(),
ziptxtfiles.getFiles().size())
}
}
Présentation Gradle 13
Chaque plugin déclaré apporte un ensemble de tâches et de propriétés
api
outils
Présentation Gradle 14
> gradle clean build
:clean
apply plugin:'java' :compileJava
:processResources
repositories { :classes
mavenCental() :jar
flatDir(dirs:'destrepo', :assemble
name:'ivyrep’) :compileTestJava myLib
} :processTestResources .jar
:testClasses
dependencies { :test
compile :check
"jdom:jdom:1.0", :build
":qtjambi:4.5.2_01"
testCompile BUILD SUCCESSFUL
"junit:junit:4.7"
} Total time: 2.937 secs
Présentation Gradle 15
apply plugin:'war'
> gradle build -PskipTest
processResources.enabled=false :compileJava
:processResources SKIPPED
//Add behavior in the lifecycle :classes
task(preJar) :preJar
jar.dependsOn preJar :jar
:war
//Predicate :assemble
:compileTestJava
test.onlyIf{
:processTestResources
!project.hasProperty('skipTests') :testClasses
} :test SKIPPED
:check
//Change the output directory :build
buildDirName='target'
BUILD SUCCESSFUL
//Change the source directory
Total time: 2.937 secs
sourceSets{
main{
java.srcDir file('src/main')
}
} Présentation Gradle 16
Soyez informé de tous les événements de votre chaîne de build
class MyTestListener implements TestListener{
Présentation Gradle 17
<!-- settings.gradle --> shared
include 'api',
'shared',
'services:webservices'
repositories {
mavenCental()
flatDir(dirs:'destrepo', IVY
name:'ivyrep’)
}
group='test'
version='1.0'
status='release' > gradle uploadArchives
uploadArchives {
repositories {
add(repositories.ivyrep)
}
} Repository
Ivy
distant Artifacts +
meta Ivy
Présentation Gradle 19
apply plugin:'java'
apply plugin:'maven' Maven
Ant
group='test' Tasks
version='1.0-SNAPSHOT'
uploadArchives {
repositories {
mavenDeployer {
repository( > gradle > gradle
url: remoteRepo) install uploadArchives
}
}
}
Repository Repository
Maven Maven
Artifacts +
Local meta Maven distant Artifacts +
meta Maven
Présentation Gradle 20
• Amélioration constante de la DSL pour encore plus de richesse et
de simplicité
Présentation Gradle 21
gmock
spcok
Présentation Gradle 22
• Gradle vous offre toute la richesse pour exprimer vos chaines de
build au plus près de vos besoins
Présentation Gradle 23