ǰÑÔ
¹¹½¨£¬Èí¼þÉúÃüÖÜÆÚÖÐÖØÒªµÄÒ»»·£¬ÔÚÏÖ´úÈí¼þ¿ª·¢¹ý³ÌÖУ¬Æð×ÅÔ½À´Ô½ÖØÒªµÄ×÷Ó᣹ýÈ¥ÔÚJava»òÀàJavaµÄÊÀ½çÀAnt¡¢MavenÔÙÊìϤ²»¹ýÁË£¬Mavenƾ½èÆäÇ¿´óµÄÒÀÀµÅäÖÃսʤAnt£¬»ù±¾ÉϳÉΪÁËJava¹¹½¨µÄ±ê×¼¡£¶øÔÚÏÖ´ú£¬ÏµÍ³ÈÕÒæ¸´ÔÓ£¬¹¹½¨µÄÁé»îÐÔÒªÇóÔ½À´Ô½¸ß£¬±ÈÈ磺¹¹½¨¹ý³ÌÖÐÐèÒª´ò°üÉÏ´«µ½·þÎñÆ÷£¬MavenÎÞ·¨ºÜºÃµØÖ§³ÖÕâÖÖ¸´ÔÓµÄϵͳ¹¹½¨£¬ËùÒÔ£¬ÎÒÑ¡ÔñÁËGradle£¬Ò»¸ö»ùÓÚGroovy£¬¸üÁé»î¸üÇ¿´óµÄ¹¹½¨ÏµÍ³£¬ÄܰïÖúÎÒÃǹ¹½¨¸ü¸´ÔÓµÄÏîÄ¿¡£
ΪʲôѡÔñGradle
´Ó¿ò¼Ü·½ÏòÀ´¿´£º
GradleÊǺܳÉÊìµÄ¼¼Êõ£¬¿ÉÒÔ´¦Àí´ó¹æÄ£¹¹½¨
Gradle¶Ô¶àÓïÑÔ¡¢¶àƽ̨ÓиünaturalµÄÖ§³Ö
Gradle¹Ø×¢ÔÚ¹¹½¨Ð§ÂÊÉÏ
Gradle·¢²¼ºÜƵ·±£¬ÖØÒªfeature¿ª·¢¼Æ»®Í¸Ã÷»¯
GradleÉçÇøºÜ»îÔ¾£¬²¢ÇÒÔö¼ÓѸËÙ
´ÓÓïÑÔÌØÐÔÀ´¿´£º
1.´úÂëºÜ¾«¼ò
2.Gradle»ùÓÚGroovy£¬ÄÜÍê³É¸´ÔÓϵͳµÄ¹¹½¨ÈÎÎñ
3.DSL±ÈXML¸ü¼ò½à¸ßЧ
GradleÔÚ¿ªÔ´ÏîÄ¿ÖеÄʹÓÃ
ÏÖÔÚʹÓÃGradle¹¹½¨µÄ¿ªÔ´ÏîÄ¿ºÜ¶à£¬ÎÒÓйý½Ó´¥µÄ±ÈÈ磺Grails, Griffon, Groovy,
Hibernate, Spring
»¹ÓкܶàÆäËü¿ªÔ´ÏîĿҲ¶¼ÔÚÓÃGradle£¬±ÈÈçTapestry£¬Qi4J£¬NetflixÏÂËùÓпªÔ´ÏîÄ¿£¨python¡¢c++¡¢htmlµÈ³ýÍ⣩µÈµÈ¡£
GradleÔÚÆóÒµÖеÄʹÓÃ
ÏÖÔÚʹÓÃGradleÀ´×ö¹¹½¨ÌåϵµÄ¹«Ë¾Ò²Ô½À´Ô½¶à£¬linkedin¾ÍºÜÔ翪ʼÇл»µ½Gradle¡£
GradleÌåÑé
GradleµÄ°²×°·Ç³£·½±ã£¬ÏÂÔØZIP°ü£¬½âѹµ½±¾µØÄ¿Â¼£¬ÉèÖà GRADLE_HOME »·¾³±äÁ¿²¢½«
GRADLE_HOME/bin ¼Óµ½ PATH »·¾³±äÁ¿ÖУ¬°²×°¾ÍÍê³ÉÁË¡£Óû§¿ÉÒÔÔËÐÐgradle -vÃüÁîÑéÖ¤°²×°£¬ÕâЩ³õʼµÄ²½ÖèºÍMavenûʲôÁ½Ñù¡£ÎÒÕâÀï°²×°µÄGradle°æ±¾ÊÇ1.10£¬ÏêϸÐÅÏ¢¼ûÏ£º
bob [10:42] ? gradle -v
------------------------------------------------------------
Gradle 1.10
------------------------------------------------------------
Build time: 2013-12-17 09:28:15 UTC
Build number: none
Revision: 36ced393628875ff15575fa03d16c1349ffe8bb6
Groovy: 1.8.6
Ant: Apache Ant(TM) version 1.9.2 compiled on
July 8 2013
Ivy: 2.2.0
JVM: 1.7.0_45 (Oracle Corporation 24.45-b08)
OS: Mac OS X 10.9.2 x86_64 |
GradleµÄFeaturesºÜ¶à£¬¹ÙÍødoc½éÉܺÜÏêϸ£¬ÎÒÕâÀï¾Í²»¶à˵¡£ÏÂÃæ¼òµ¥½éÉÜÒ»ÏÂGradle¹¹½¨Ïà¹ØµÄ¶«Î÷¡£
Gradle»ù´¡
1£¬GradleÓÐÁ½¸ö×î»ù±¾µÄ¸ÅÄprojectºÍtask¡£GradleÀïÃæµÄËùÓж«Î÷¶¼»ùÓÚÕâÁ½¸ö¸ÅÄî¡£projectͨ³£Ö¸Ò»¸öÏîÄ¿£¬¶øtaskÖ¸¹¹½¨¹ý³ÌÖеÄÈÎÎñ¡£Ò»´Î¹¹½¨¿ÉÒÔÓÐ1µ½n¸öproject£¬Ã¿¸öprojectÓÐ1µ½n¸ötask¡£
2£¬GradleÓÐÒ»¸öÀàËÆMavenÖÐpom.xmlµÄÅäÖÃÎļþ£ºbuild.gradle¡£¹¦ÄÜÒ²»ù±¾Ò»Ñù£¬¸ºÔðµ±Ç°projectµÄ¹¹½¨¶¨Òå¡£¿´Ò»¸öbuild.gradleµÄ¼òµ¥Àý×Ó£º
bob [10:46] ? pwd /Users/bob/framework/gradle-1.10/samples/userguide/tutorial/hello // ÔÚÄã°²×°µÄgradle¸ùĿ¼ÏÂÓжÔÓ¦µÄsamplesĿ¼£¬ÀïÃæÓкܶàÀý×Ó
bob [10:46] ? cat build.gradle
task hello {
doLast {
println 'Hello world!'
}
} |
ÎļþÖж¨ÒåÁËÒ»¸ötask£ºhello£¬taskµÄÄÚÈÝÊÇ "println 'Hello world!'"£¬ÎÒÃÇÀ´Ö´ÐÐһϣº
bob [10:49] ? gradle -q hello Hello world! |
¿ÉÒÔ¿´µ½£¬Êä³öÁË"Hello world!"£¬ÕâÀï-qµÄÒâ˼ÊÇquietģʽ£¬Ö»Êä³ö¹¹½¨ÖеıØÒªÐÅÏ¢¡£
gradleÀï¿ÉÒÔ¶¨Òå¶à¸ötask£¬taskÖ®¼äÒ²¿ÉÒÔÓÐÒÀÀµ¹ØÏµ£¬»¹¿ÉÒÔ¶¨ÒåĬÈÏtask£¬¿´Ò»¸öÀý×Ó£º
´øÓÐtaskÒÀÀµ¹ØÏµ£º
bob [10:53] ? cat userguide/tutorial/lazyDependsOn/build.gradle task taskX(dependsOn: 'taskY') << { println 'taskX' } task taskY << { println 'taskY' } |
´øÓÐĬÈÏtaskÀý×Ó£º
bob [10:59] ? cat userguide/tutorial/defaultTasks/build.gradle defaultTasks 'clean', 'run'
task clean << {
println 'Default Cleaning!'
}
task run << {
println 'Default Running!'
}
task other << {
println "I'm not a default task!"
} |
¿´¿´Ö´ÐÐÇé¿ö£º
bob [10:59] ? gradle -q Default Cleaning! Default Running!
bob [11:00] ? gradle -q other
I'm not a default task! |
ĬÈÏtask£¬µ±Ã»ÓÐtaskÖ¸¶¨Ê±£¬Ôò»áÖ´ÐÐĬÈϵÄtask¡£
GradleÒÀÀµ
GradleºÍMavenÔÚÒÀÀµ¹ÜÀíÉϼ¸ºõ²î²»¶à£¬ºËÐĵĸÅÄîÊÇÒ»ÑùµÄ£¬Ö»²»¹ýGradleÓï·¨¸ü¾«¼ò£¬²¢ÇÒ¶àÁËһЩ¸üÁé»îµÄ×Ô¶¨ÒåÅäÖá£ÎÒÃÇÏÈ¿´Ò»¸öÀý×Ó£¬MavenµÄpom.xml£º
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies> |
¸ü»»³ÉGradle½Å±¾£¬½á¹ûÊÇÕâÑù£º
dependencies { compile('org.springframework:spring-core:3.2.4.RELEASE') compile('org.springframework:spring-beans:3.2.4.RELEASE') compile('org.springframework:spring-context:3.2.4.RELEASE') testCompile('junit:junit:4.7') } |
´úÂë¿éÉÙÁ˺ܶࡣÊÔÏ룬Éú²ú»·¾³ÏµÄÖС¢´óÐÍÓ¦ÓÃÈç¹ûÓö¼ÓÃGradleÌæ»»Maven£¬ÄÇÊÆ±Ø»á´ó´ó¼õÉÙÅäÖÃÎļþ´úÂë¿é£¬²¢ÓиüÇ¿µÄ¿É¶ÁÐÔ£¬Ò²¾ÍÒâζ×Åϵͳ¸ü¼ÓÎȽ¡¡£
1£¬GradleÔÚÒÀÀµÅäÖÃÉÏÃæ£¬ºÍMavenÒ»Ñù£¬Ö§³Ö´«µÝÐÔÒÀÀµ£¬È»ºóºÍMaven²»Í¬µÄÊÇ£¬Ëü»¹Ö§³ÖÅųý´«µÝÐÔÒÀÀµÒÔ¼°¹Ø±Õ´«µÝÐÔÒÀÀµ¡£
2£¬GradleµÄÒÀÀµscope£¬Ò²»ù±¾ºÍMavenÒ»Ñù£¬²»¹ýËüÊÇͨ¹ýÅäÖÃÀ´¶¨Ò壬pluginÀ´Ö§³ÅºÍ¼ÓÇ¿µÄ£¬ËùÒÔ³ýÁË»ù±¾µÄcompile¡¢runtimeµÈscopeÍ⣬Gradle»¹¿ÉÒÔ×Ô¶¨Òå³öºÜ¶àÅäÖã¬Õë¶Ô²»Í¬µÄÅäÖÃд²»Í¬µÄtaskÀ´Íê³É¸ü¸´ÔÓ¸üÁé»îµÄ¹¹½¨ÈÎÎñ¡£
ÒÀÀµÏà¹ØµÄ²Ö¿âÅäÖúÜÁé»î£¬Ö§³Ö¶àÖÖrepository£¬¿´ÏÂÃærepository¶¨ÒåÀý×Ó£º
bob [11:07] ? cat userguide/artifacts/defineRepository/build.gradle
repositories {
mavenCentral() // ¶¨Òå²Ö¿âΪmavenÖÐÐIJֿâ
}
repositories {
jcenter() // ¶¨Òå²Ö¿âΪjcenter²Ö¿â
}
repositories {
maven {
url "http://repo.mycompany.com/maven2"
// ¶¨ÒåÒÀÀµ°üÐÒéÊÇmaven£¬µØÖ·Êǹ«Ë¾µÄ²Ö¿âµØÖ·
}
}
repositories { // ¶¨Òå±¾µØ²Ö¿âĿ¼
flatDir {
dirs 'lib'
}
}
repositories { // ¶¨ÒåivyÐÒéÀàÐ͵IJֿâ
ivy {
url "http://repo.mycompany.com/repo"
}
} |
¿ÉÒÔ¿´µ½£¬¶ÔÓÚ³£ÓõÄmaven¡¢ivy¡¢localÒÔ¼°jcenterµÄrepository¶¼ÓÐÖ§³Ö£¬Óï·¨ºÜ¼òµ¥¡£¶øÇÒ»¹¿ÉÒÔͨ¹ý±àдtaskÀ´Ö§³Ö¸ü¸´ÔÓµÄrepository£¬¸ü¶àÏêÇé¿ÉÒԲ鿴°²×°°üÀïµÄ¶ÔӦĿ¼ÏÂÎļþ²é¿´¡£
Gradle¹¹½¨
ºÍMavenÒ»Ñù£¬GradleÒ²ÊÇͨ¹ýartifactÀ´´ò°ü¹¹½¨µÄ¡£µÃÒæÓÚÉÏÊöµÄGradle±¾ÉíµÄÌØÐÔ£¬artifactÔÚGradleÀïʵÏֵøüÁé»îһЩ¡£¿´Ò»¸öÀý×Ó£º
bob [13:00] ? cat userguide/artifacts/uploading/build.gradle
## jarÀàÐ͵Äartifact
task myJar(type: Jar)
artifacts {
archives myJar
}
## fileÀàÐ͵Äartifact
def someFile = file('build/somefile.txt')
artifacts {
archives someFile
}
## ¸ù¾Ý×Ô¶¨ÒåtaskÀ´Íê³Éartifact
task myTask(type: MyTaskType) {
destFile = file('build/somefile.txt')
}
artifacts {
archives(myTask.destFile) {
name 'my-artifact'
type 'text'
builtBy myTask
}
}
## ¸ù¾Ý×Ô¶¨ÒåtaskÀ´Íê³Éartifact
task generate(type: MyTaskType) {
destFile = file('build/somefile.txt')
}
artifacts {
archives file: generate.destFile, name: 'my-artifact',
type: 'text', builtBy: generate
} |
ÕâÑù¾Í¼òµ¥µØ¶¨ÒåÁ˺ü¸ÖÖartifactÉú³ÉµÄ¶¨Ò壬¸ù¾Ý²»Í¬µÄ³¡¾°ÐèÇó£¬Éú³ÉÎı¾Îļþ¡¢jar°ü»òÕßzip£¬»¹¿ÉÒÔÔÙÉÏ´«µ½·þÎñÆ÷ÉÏ¡£
Ò»°ãÇé¿öÏ£¬³£ÓõIJå¼þ£¬±ÈÈç˵"Java plugin"¶¼Ä¬È϶¨ÒåÁË"jar"ÕâÑùµÄartifact
task£¬ËùÒÔÒ»°ã²»ÐèÒª¶îÍ⿪·¢¡£µ«ÊÇ£¬Õë¶ÔÓÚһЩ¸´ÔÓÇé¿ö£¬»òÕßÔÚplugin»ù´¡ÉÏÔöÇ¿µÄ»°£¬×Ô¶¨Òåartifact
task»¹ÊǷdz£ÓÐÓõġ£
Gradle¹¹½¨µÄÏîÄ¿£¬·¢²¼µ½²Ö¿âÖУ¬Ò²·Ç³£ÈÝÒ×£º
apply plugin: 'maven'
uploadArchives {
repositories {
ivy {
credentials {
username "username"
password "pw"
}
url "http://repo.mycompany.com"
}
}
} |
Gradle ²å¼þ
ÉÏÃæ¼ò½é½éÉÜÁËÒ»ÏÂGradleµÄһЩ¸ÅÄîºÍÅäÖã¬ÒªÓõ½ÏîÄ¿ÖÐrunÆðÀ´£¬ÏÖÔÚ»¹»¹ÒªÒ»²½£¬¾ÍÊDZ¾½Ú½éÉܵÄGradle²å¼þ¡£GradleÏÖÔÚÒѾ֧³ÖºÜ¶à²å¼þ£¬Õâ¸ø¿ª·¢Õß´øÀ´¼«´óµÄ±ãÀû£¬ÏÈ˵˵Java²å¼þ°É¡£
1£¬Ê¹ÓÃJava plugin£¬Ö»ÐèÒªÔÚbuild.gradleÖмÓÈëÕâ¾ä»°£º
2£¬Á˽â»òÉèÖÃJava project²¼¾Ö¡£GradleºÍMavenÒ»Ñù£¬²ÉÓÃÁË¡°Ô¼¶¨ÓÅÓÚÅäÖᱵķ½Ê½¶ÔJava
project²¼¾Ö£¬²¢ÇÒ²¼¾Ö·½Ê½ÊǺÍMavenÒ»ÑùµÄ£¬´ËÍ⣬Gradle»¹¿ÉÒÔ·½±ãµÄ×Ô¶¨Òå²¼¾Ö¡£ÔÚGradleÖУ¬Ò»°ã°ÑÕâЩĿ¼½Ð×ösource
set¡£¿´Ï¹ٷ½µÄ´ð°¸£º

ÕâÀïҪעÒ⣬ÿ¸öpluginµÄsource set¿ÉÄܶ¼²»Ò»Ñù¡£
ͬÑùµÄ£¬Java plugin»¹¶¨ÒåºÃÁËÒ»¶Ñtask£¬ÈÃÎÒÃÇ¿ÉÒÔÖ±½ÓʹÓ㬱ÈÈ磺clean¡¢test¡¢buildµÈµÈ¡£ÕâЩtask¶¼ÊÇÎ§ÈÆ×ÅJava
pluginµÄ¹¹½¨ÉúÃüÖÜÆÚµÄ£º

ͼÖÐÿһ¿é¶¼ÊÇÒ»¸ötask£¬¼ýÍ·±íʾtaskÖ´ÐÐ˳Ðò/ÒÀÀµ£¬±ÈÈçÖ´ÐÐtask
jar£¬ÄÇô±ØÐëÏÈÖ´ÐÐtask compileJavaºÍtask processResources¡£ÁíÍâ¿ÉÒÔ¿´µ½£¬GradleµÄJava
plugin¹¹½¨ÉúÃüÖÜÆÚ±È½Ï¸´ÔÓ£¬µ«ÊÇÒ²±íÃ÷Á˸ü¼ÓÁé»î£¬¶øÇÒ£¬ÔÚÏîÄ¿ÖУ¬Ò»°ãֻʹÓÃÆäÖг£Óõö£ºclean
test check build µÈµÈ¡£
gradle¹¹½¨¹ý³ÌÖУ¬ËùÓеÄÒÀÀµ¶¼±íÏÖΪÅäÖ㬱ÈÈç˵ϵͳÔËÐÐʱµÄÒÀÀµÊÇruntime£¬gradleÀïÓÐÒ»¸öÒÀÀµÅäÖýÐruntime£¬ÄÇôϵͳÔËÐÐʱ»á¼ÓÔØÕâ¸öÒÀÀµÅäÖÃÒÔ¼°ËüµÄÏà¹ØÒÀÀµ¡£ÕâÀï˵µÄÓеãÈÆ£¬¿ÉÒÔ¼òµ¥Àí½âÒÀÀµºÍmavenÀàËÆ£¬Ö»²»¹ýgradleÓÃconfigurationʵÏÖ£¬ËùÒÔ¸üÁé»î£¬Óиü¶àÑ¡Ôñ¡£ÏÂͼÊÇÒÀÀµÅäÖùØÏµÍ¼ÒÔ¼°ºÍtaskµ÷ÓõĹØÏµÍ¼£º

¿ÉÒÔ¿´µ½£¬»ù±¾ºÍMavenÊÇÒ»ÑùµÄ¡£ÆäʵGradleÀïÃæÕâЩÒÀÀµ(scope)¶¼ÊÇͨ¹ýconfigurationÀ´ÊµÏֵģ¬ÕâÀï¾Í²»Ï¸Ëµ£¬ÓÐÐËȤµÄ¿ÉÒÔÑо¿Ò»Ï¹ٷ½×ÊÁÏ¡£
¹ØÓÚ¡°Ô¼¶¨ÓÅÓÚÅäÖá±£¬»¹ÓкܶණÎ÷£¬ÕâÀﲻϸ˵£¬¹Ù·½docÒѾ˵µÄºÜÏêϸÁË¡£
Gradle ÆäËü²»´íµÄÌØÐÔ
1£¬ËùÓÐÉùÃ÷¶¼ÊÇÒ»µÈ¹«Ãñ
2£¬¶àproject¹¹½¨
3£¬ÒýÓÃÍⲿ/ͨÓù¹½¨½Å±¾
4£¬Gradle wrapper
С½á
1£¬Gradle·Ç³£¼ò½à£¬ÏîÄ¿±¾ÉíµÄÅäÖôúÂë·Ç³£ÉÙ¡£
2£¬GradleÔÚÍⲿproject¹¹½¨Ò²Ö§³ÖºÜºÃ£¬ÕûÌå¹¹½¨¼òµ¥£¬²¢ÇÒͨ¹ý¹«ÓÃÍⲿ¹¹½¨½Å±¾£¬ÈÃÅäÖÃÄÚÈݾ¡Á¿Ã»ÓÐÈßÓà¡£
3£¬GradleºÜÁé»î£¬¿ÉÒÔ·½ÃæµÄÔö¼ÓºÍÐ޸Ĺ¹½¨¹ý³Ì¡£¶øMavenÈ´ÐèÒª¿ª·¢²å¼þÀ´Ö§³Ö¡£
4£¬GradleÊÇ»ùÓÚGroovyµÄ£¬Ò²¾ÍÊÇ˵ÅäÖÃÖпÉÒÔ±àд×Ô¶¨Òå´úÂ룬ÄÜÊÊÓ¦¸ü¸´Ôӵij¡¾°£¬ÄÜÍê³É¸üÇ¿´óµÄ¹¦ÄÜ£¬±ÈÈç˵£º×Ô¶¯ÉÏ´«¡¢·Ö·¢¡¢²¿ÊðµÈµÈ¡£
ÏîĿʵս
Gradle½éÉÜÁËÄÇô¶à£¬¿ÉÒÔ¿´³ö£¬gradleÊǷdz£Áé»îµÄ£¬¿ÉÒÔÊÊÓ¦¸÷ÖÖ¸´ÔÓ»·¾³¡£½¨Òé¸÷λ´Ó¼Ü¹¹½Ç¶È¿¼ÂÇgradle¹¹½¨£¬¶ø²»½ö½ö°ÑËüµ±×÷Ò»¸ö¹¹½¨¹¤¾ß¡£ÏÂÃæÀ´ËµËµÎÒÃÇʵ¼ÊÏîÄ¿ÖеÄGradle¸ÄÔ칤×÷¡£
±³¾°£º
ÎÒÃǵÄÏîÄ¿¾¹ýÒ»¸ö°ëQµÄѸËÙ·¢Õ¹£¬Õû¸öÏîÄ¿ÒѾÓÉ1¸ö¼òÒ׺ǫ́±ä³É4¸öϵͳ£«Èô¸É½Å±¾ÈÎÎñÁË£¬ÏîÄ¿ÖдæÔںܶàÈßÓà´úÂëºÍÖØ¸´ÅäÖá£ÎÒÃÇʹÓÃÉÏÃæ½éÉܵķ½·¨¶ÔÏîÄ¿½øÐÐÁ˸ÄÔ죬ÒÔ½â¾öÕâÁ½¸öÎÊÌâ¡£
²½Ö裺
Òª½â¾öÈßÓà´úÂëºÍͨÓÃÅäÖõÄÎÊÌ⣬×î¼òµ¥µÄ×ö·¨¾ÍÊdzéÈ¡³ö¹²Í¬²¿·Ö£¬×÷ΪÆäËüËùÓÐÏîÄ¿µÄparent/commonÏîÄ¿¡£·½·¨£º
1£¬Ê¹ÓÃgit submodule
½«ËùÓÐϵͳÖй«¹²µÄÀà¿âºÍͨÓõÄÅäÖ㬷ŵ½¶ÀÁ¢µÄ²Ö¿âCommonÖС£ÒòΪÎÒÃÇÓÃgitÀ´¹ÜÀí´úÂ룬¶øgit±¾ÉíÌᳫ¶àbranch£¬¶à²Ö¿â£¬ËùÒÔ²ÉÓÃgit
submodule·½Ê½£¬ÆäËüÏîÄ¿ÐèÒªÌí¼ÓCommonÕâ¸ösubmodule£º
git submodule add yourGitRepo deps/Common |
×îºóµÄ"deps/Common"ÊÇ×Ô¶¨ÒåµÄ£¬Òâ˼¾ÍÊÇÔÚµ±Ç°µÄdepsĿ¼ÏÂÓÃCommonÃû×ÖÀ´µ±×÷submoduleµÄclone¡£
Èç¹ûÄãclone±ðµÄ´øÓÐsubmoduleµÄÏîĿʱ£¬Ä¬ÈÏÇé¿öÏ£¬µ±Ç°µÄproject²¢²»»á°ÑsubmoduleµÄ´úÂë¶¼cloneÏÂÀ´£¬¿ÉÒÔÖ´ÐУº
git submodule foreach git pull |
ÒÔÏÂÕâ¶ÎÒ»°ã´ó¼Ò¾³£»áÓöµ½£º
µ±ÄãcloneÏîĿʱ£¬submodule»áÒÔ×îеÄmaster·ÖÖ§ÉϵÄcommit
id×÷Ϊ±¾´ÎµÄtagÏÂÔØ£¬ÀàËÆÒ»¸ö¸±±¾£¬ÒòΪһ°ã´ó¼Ò¶¼ÊÇÓÃsubmodule£¬¶ø²»ÊÇÐÞ¸ÄËü¡£ËùÒÔµ±ÄãµÄsubmoduleÐèÒª¸üеÄʱºò£¬ÐèÒªÏÈÖ´ÐÐÕâ¶Î´úÂ룺
git submodule foreach git checkout master |
ÈÃsubmoduleÇл»µ½master·ÖÖ§ÁË£¬È»ºó¾Í¿ÉÒÔÓÃÉÏÃæµÄsubmodule pullÀ´¸üÐÂÁË¡£
2£¬gradle¹¹½¨£º
¼øÓÚÉÏÎĶÔgradleÓŵãµÄÃèÊö£¬ÎÒÃDzÉÓÃgradleÀ´¹¹½¨¡£ÎÒÃǵÄÏîÄ¿×î³õ¶¼ÊÇ»ùÓÚmavenÀ´¹¹½¨µÄ£¬´ÓmavenÇл»µ½gradleºÜ¼òµ¥£¬ÔÚÏîÄ¿¸ùĿ¼Ï£¬ÏÈÖ´ÐУ¨¼ÙÉèÄãµÄ»úÆ÷ÒѾ°²×°ÁËgradle»·¾³£¬Ò»°ã¸ºÔð¹¹½¨µÄÈËÊ×´ÎÐèÒª°²×°£¬¿ª·¢ÈËÔ±¿ÉÒÔ²»°²×°£©£º
ÕâÑù£¬¾Í»á×Ô¶¯Éú³ÉÏà¹ØµÄgradlew£¬build.gradle£¬settings.gradleµÈÎļþºÍÏà¹ØÄ¿Â¼£¬²¢»á×Ô¶¯ÏÂÔØ¶ÔÓ¦°æ±¾µÄgradle
binary°ü£¨ËùÒÔÒÔºó²»ÐèÒª°²×°£©¡£Gradle»á×Ô¶¯Ê¶±ðMavenÀïµÄÅäÖ㬲¢ÏàÓ¦µÄµ¼Èë½øÀ´£¬ÓÐÉÙÁ¿²¿·ÖÅäÖÿÉÄÜÐèÒªÐ޸ġ£
×¢£ºÔÚÒÑÓеÄgradleÏîÄ¿À¾¡Á¿Ê¹ÓÃÉú³ÉµÄgradlewÕâ¸öwrapper£¬ÒòΪËü»á×Ô¶¯ÏÂÔØ¶ÔÓ¦°æ±¾µÄGradle£¬Ò²¾ÍÊÇ˵ÍŶӺÏ×÷µÄÆäËûÈË¿ª·¢»úÉÏÊDz»ÐèÒªÊÖ¶¯°²×°GradleµÄ£¬²¢ÇÒwrapperÒ²Èôó¼ÒµÄGradle°æ±¾Ò»Ö£¬±ÜÃâÎÊÌâ¡£
3£¬gradle½Å±¾ÐÞ¸Ä
ÉÏÃæÖ´ÐÐÍêÖ®ºó£¬»·¾³ÒѾ׼±¸ºÃÁË£¬ÏÖÔÚÒª×öµÄ¾ÍÊÇÐ޸Ĺ¹½¨½Å±¾£º
ÒòΪÒѾͨ¹ýgit submodule°Ñ¹«¹²ÏîÄ¿·Åµ½¶ÀÁ¢Ä¿Â¼£¨deps/Common£©ÁË£¬²¢ÇÒËü±¾ÉíÒ²ÊǶÀÁ¢¿É¹¹½¨µÄÏîÄ¿£¬ÄÇôҲ¾ÍÊÇ˵µ±Ç°ÓÐÁ½¸öÏîÄ¿ÁË£¬Ò»¸öÊǵ±Ç°project£¬Ò»¸öÊÇCommonÏîÄ¿£¬Òª×öµÄ¾ÍÊǸæËßgradle£¬Òª¶àÏîÄ¿¹¹½¨£¬±à¼settings.gradle£¬Ôö¼ÓÏîÄ¿ÅäÖãº
ÒÔÉϾÍÊǰÑCommonÒýÈëµ½µ±Ç°ÏîÄ¿ÁË¡£
¸ù¾ÝÏîÄ¿µÄ²»Í¬£¬È»ºó¶ÔÓ¦ÐÞ¸Äbuild.gradle£¬¾Í´ó¹¦¸æ³ÉÁË¡£¿´Ò»¸öÀý×Ó£º
// ÕâÒ»¶ÎÖ÷ÒªÊǰѹ«¹²¿âCommonµÄ¹¹½¨½Å±¾ÒýÈ룬ÒòΪһ°ã»áÓÐͨÓõÄÅäÖÃÔÚÀïÃæ def userGradleScript = file("deps/Common/build.gradle") if (userGradleScript.exists()) { apply from: userGradleScript } // ʹÓÃwar²å¼þ£¬ÕâÑù¾ÍĬÈÏÒýÈëÁËjava²å¼þ apply plugin: 'war' // for jetty apply plugin: 'jetty' stopKey = 'yourStopKey' // ×Ô¶¨ÒåµÄstopkey stopPort = xxxx // Í£Ö¹¶Ë¿Ú httpPort = xxxx // Æô¶¯http¶Ë¿Ú
// ÏîÄ¿ÊôÐÔ
group = 'yourApp'
version = '1.0.0'
description = """ÕâÀïÃèÊöÄãµÄÏîÄ¿"""
// checkstyle configÎļþµØÖ·
checkstyle {
configFile = file("deps/Common/config/checkstyle/checkstyle.xml")
}
// libÒÀÀµ
dependencies {
// ÒÀÀµ¹«¹²¿âCommon£¬compileÊǺÍmavenÀïµÄcompile scopeÒ»Ñù
compile project(':deps:Common')
compile 'commons-validator:commons-validator:1.4.0'
compile('javax.servlet.jsp.jstl:jstl-api:1.2')
{
exclude(module: 'servlet-api') // ·ÀÖ¹°æ±¾³åÍ»
}
compile 'javax.persistence:persistence-api:1.0.2'
runtime 'mysql:mysql-connector-java:5.1.26'
providedCompile 'org.apache.tomcat:tomcat-servlet-api:7.0.30'
// providedCompile Õâ¸öconfÔÚjava²å¼þÀïÊDZ¨´íµÄ£¬warÀïÊÇÕýÈ·µÄ
providedCompile 'javax.servlet.jsp:jsp-api:2.1'
...
}
|
ÎÒÃÇÔÙÀ´¼òµ¥¿´Ï¹«¹²ÏîÄ¿CommonµÄ¹¹½¨½Å±¾£º
// ¶¨ÒåÒ»¶Ñ»ù´¡²å¼þ apply plugin: 'java' apply plugin: 'maven' apply plugin: "jacoco" apply plugin: 'checkstyle' apply plugin: 'pmd' apply plugin: 'findbugs' apply plugin: 'eclipse' apply plugin: 'idea' // ¶¨ÒåÏîÄ¿ÊôÐÔ group = 'Common' version = '1.0.0' description = """Giant common library"""
// ¶¨ÒåÒÀÀµ²Ö¿â
repositories {
mavenCentral()
}
// projectµÄ¶îÍâÊôÐÔ£¬ÕâÀïÓÃÓÚ¶¨ÒåprofileÊôÐÔ£¬Ä£ÄâmavenµÄprofile
ext {
if (project.hasProperty('profile')) {
profile = project['profile']
} else {
profile = "dev"
}
println "profile:" + profile
}
// ¶îÍâÔö¼Ósource path
sourceSets {
main {
resources {
srcDir "src/main/profiles/${profile}"
}
}
}
// projectÒÀÀµ
dependencies {
compile 'ch.qos.logback:logback-core:1.0.13'
compile 'ch.qos.logback:logback-classic:1.0.13'
compile 'ch.qos.logback:logback-access:1.0.13'
compile 'commons-io:commons-io:2.0.1'
compile 'commons-lang:commons-lang:2.6'
compile 'joda-time:joda-time:1.6.2'
compile 'org.testng:testng:6.8.7'
compile 'com.googlecode.jmockit:jmockit:1.5'
...
}
// taskÅäÖÃ
checkstyle {
ignoreFailures = true
sourceSets = [sourceSets.main]
}
findbugs {
ignoreFailures = true
sourceSets = [sourceSets.main]
}
pmd {
ruleSets = ["basic", "braces",
"design"]
ignoreFailures = true
sourceSets = [sourceSets.main]
}
jacocoTestReport {
reports {
xml.enabled true
html.enabled true
csv.enabled false
}
sourceSets sourceSets.main
}
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
test {
useTestNG()
jacoco {
excludes = ["org.*"]
}
} |
ÕâÑù£¬¾Í¿ÉÒÔÔÚ¹«¹²ÏîÄ¿ÀïÅäÖúÃÒ»¶Ñ»ù´¡µÄtask£¬dependenciesµÈµÈ£¬¶øÊ¹ÓÃÕâ¸ö¹«¹²ÏîÄ¿µÄÆäËüÏîÄ¿Ôò¿ÉÒÔÖ±½ÓʹÓã¬ÎÞÐèÔÙ¶îÍâÅäÖá£
4£¬run
½Å±¾ÐÞ¸ÄÍêÁË£¬¾Í¿ÉÒÔ¿ªÊ¼¹¹½¨ÁË£¨²»ÐèÒª°²×°gradle£¬Ö±½ÓʹÓÃÉú³ÉµÄgradlew¾ÍÐУ©£º
./gradlew build
// »ùÓÚprofile¹¹½¨
./gradlew -Pprofile=dev build |
³£Óù¹½¨ÃüÁ
clean£ºÇå³ý֮ǰµÄ¹¹½¨
test£ºÖ´ÐвâÊÔ
compileJava£º±àÒëjava
check£ºÔÚtestÖ®ºó×öÒ»¸öcheck£¬Ò»°ã´úÂë¼ì²é²å¼þ£¬¶¼ÊÇÔÚÕâ¸ö½×¶Î×öµÄ
build£º¹¹½¨´ò°ü
×ܽá
Ëæ×Ź«Ë¾ÒµÎñµÄ·¢Õ¹£¬Èí¼þϵͳ±äµÃÈÕÒæ¸´ÔÓºÍÅÓ´ó£¬Õâ¾ÍÒªÇóÓиüÁé»î¡¢¸ü¸ßЧµÄ¹¹½¨ÏµÍ³À´Ö§³Å¡£ÏÖ´ú¹¹½¨ÏµÍ³GradleÌṩÁËÇ¿´óµÄ¹¦ÄÜ¡¢¼ò½àµÄÓï·¨¡¢Áé»îµÄÅäÖã¬ÄÜÊÊÓ¦¸÷ÖÖ¸´ÔӵĹ¹½¨»·¾³¡£ÀûÓöàproject¹¹½¨£¬ÈÃÕû¸öϵͳģ¿é»¯£¬¹ÜÀí¸ü¸ßЧ¡£
|