Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
GradleÔÚ´óÐÍJavaÏîÄ¿ÉϵÄÓ¦ÓÃ
 
»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-10-08
  3832  次浏览      33
 

ÔÚJava¹¹½¨¹¤¾ßµÄÊÀ½çÀÏÈÓÐÁËAnt£¬È»ºóÓÐÁËMaven¡£MavenµÄCoC[1]¡¢ÒÀÀµ¹ÜÀíÒÔ¼°ÏîÄ¿¹¹½¨¹æÔòÖØÓÃÐÔµÈÌØµã£¬ÈÃMaven¼¸ºõ³ÉΪJava¹¹½¨¹¤¾ßµÄÊÂʵ±ê×¼¡£È»¶ø£¬ÈßÓàµÄÒÀÀµ¹ÜÀíÅäÖᢸ´ÔÓ²¢ÇÒÄÑÒÔÀ©Õ¹µÄ¹¹½¨ÉúÃüÖÜÆÚ£¬¶¼³ÉΪʹÓÃMavenµÄÀ§ÈÅ¡£

Gradle×÷ΪÐµĹ¹½¨¹¤¾ß£¬»ñµÃÁË2010 Springy´ó½±£¬²¢ÈëΧÁË2011µÄJax×î¼ÑJava¼¼Êõ·¢Ã÷½±¡£ËüÊÇ»ùÓÚGroovyÓïÑԵĹ¹½¨¹¤¾ß£¬¼È±£³ÖÁËMavenµÄÓŵ㣬ÓÖͨ¹ýʹÓÃGroovy¶¨ÒåµÄDSL[2]£¬¿Ë·þÁË MavenÖÐʹÓÃXML·±ÈßÒÔ¼°²»Áé»îµÈȱµã¡£ÔÚEugene Dvorkin׫дµÄÎÄÕ¡¶×îÈÃÈ˼¤¶¯µÄ5¸öJavaÏîÄ¿¡·ÖУ¬ËûÊÇÕâÑù½éÉÜGradleµÄ£º

¡°¹¤³Ì×Ô¶¯»¯ÊÇÈí¼þÏîÄ¿³É¹¦µÄ±ØÒªÌõ¼þ£¬¶øÇÒËüÓ¦¸ÃʵÏÖÆðÀ´¼òµ¥¡¢Ò×ÓᢺÃÍæ¡£¹¹½¨Ã»ÓÐǧƪһÂɵķ½·¨£¬ËùÒÔGradleûÓÐËÀ°åµÄÇ¿¼Ó·½·¨ÓÚÎÒÃÇ£¬¾¡¹ÜÄã»áÈÏΪ²éÕÒºÍÃèÊö·½·¨ºÜÖØÒª£¬È»¶øGradle¶ÔÓÚÈçºÎÃèÊöÓÐ×ŷdz£ºÃµÄÖ§³Ö¡£ÎÒ²»ÈÏΪ¹¤¾ßÄܹ»Õü¾ÈÎÒÃÇ£¬µ«ÊÇGradleÄܸøÄãËùÐèÒªµÄ×ÔÓÉ£¬Äã¿ÉÒÔÀûÓÃGradle¹¹½¨Ò×ÃèÊöµÄ¡¢¿Éά»¤µÄ¡¢¼ò½àµÄ¡¢¸ßÐÔÄÜÏîÄ¿¡±¡£

ÔÚ×î½ü°ëÄêÀÎÒÔÚʹÓÃGradle×÷Ϊ¹¹½¨½Å±¾µÄ´óÐÍJavaÏîÄ¿ÉϹ¤×÷£¬¸üÉîÇÐÌå»áµ½GradleÔÚÏîÄ¿¹¹½¨¹ý³ÌÖÐÊÇÈç´ËµÄ¼òµ¥¡¢Ò×Óá£

1. ¶àModuleµÄÏîÄ¿

HibernateÏîÄ¿¸ºÔðÈËSteve EbersoleÔÚHibernate½«¹¹½¨½Å±¾´ÓMaven»»³ÉGradleʱ£¬×¨ÃÅдÁËһƪÎÄÕ¡¶Gradle: why?¡·£¬ÎÄÖÐÌáµ½MavenµÄÒ»¸öȱµã¾ÍÊÇ£ºMaven²»Ö§³Ö¶àmoduleµÄ¹¹½¨¡£ÔÚMicro-Service[3]¼Ü¹¹·ç¸ñÁ÷ÐеĽñÌ죬ÔÚÒ»¸öÏîÄ¿ÀïÃæ°üº¬¶à¸öModuleÒѳÉΪһÖÖÇ÷ÊÆ¡£GradleÌìȻ֧³Ö¶àmodule£¬²¢ÇÒÌṩÁ˺ܶàÊÖ¶ÎÀ´¼ò»¯¹¹½¨½Å±¾¡£ÔÚGradleÖУ¬Ò»¸öÄ£¿é¾ÍÊÇËüµÄÒ»¸ö×ÓÏîÄ¿£¨subproject£©£¬ËùÒÔ£¬ÎÒʹÓø¸ÏîÄ¿À´ÃèÊö¶¥¼¶ÏîÄ¿£¬Ê¹ÓÃ×ÓÏîÄ¿À´ÃèÊö¶¥¼¶ÏîÄ¿ÏÂÃæµÄÄ£¿é¡£

1.1 ÅäÖÃ×ÓÏîÄ¿

ÔÚ¶àÄ£¿éµÄÏîÄ¿ÖУ¬Gradle×ñÑ­¹ßÀýÓÅÓÚÅäÖà £¨Convention Over Configuration£©Ô­Ôò¡£

ÔÚ¸¸ÏîÄ¿µÄ¸ùĿ¼ÏÂѰÕÒsettings.gradleÎļþ£¬ÔÚ¸ÃÎļþÖÐÉèÖÃÏëÒª°üÀ¨µ½ÏîÄ¿¹¹½¨ÖеÄ×ÓÏîÄ¿¡£ÔÚ¹¹½¨µÄ³õʼ»¯½×¶Î£¨Initialization£©£¬Gradle»á¸ù¾Ýsettings.gradle ÎļþÀ´ÅжÏÓÐÄÄЩ×ÓÏîÄ¿±»includeµ½Á˹¹½¨ÖУ¬²¢ÎªÃ¿Ò»¸ö×ÓÏîÄ¿³õʼ»¯Ò»¸öProject¶ÔÏó£¬ÔÚ¹¹½¨½Å±¾ÖÐͨ¹ýproject(¡®:sub-project-name¡¯)À´ÒýÓÃ×ÓÏîÄ¿¶ÔÓ¦µÄProject¶ÔÏó¡£

ͨ³££¬¶àÄ£¿éÏîÄ¿µÄĿ¼½á¹¹ÒªÇó½«×ÓÄ£¿é·ÅÔÚ¸¸ÏîÄ¿µÄ¸ùĿ¼Ï£¬µ«ÊÇÈç¹ûÓÐÌØÊâµÄĿ¼½á¹¹£¬¿ÉÒÔÔÚsettings.gradleÎļþÖÐÅäÖá£

ÎÒËùÔÚµÄÏîÄ¿°üÀ¨£º

1.Ò»¸öÃèÊöºËÐÄÒµÎñµÄcoreÄ£¿é

2.Ò»¸öÒÅÁôµÄEnterprise Java Bean£¨enterprise-beans£©Ä£¿é

3.Á½¸öÌṩ²»Í¬·þÎñµÄWebÏîÄ¿£¨cis-warºÍadmin-war£©

4.Ò»¸öͨ¹ýschemaÉú³Éjaxb¶ÔÏóµÄjaxbÏîÄ¿ÒÔ¼°Ò»¸öÓÃÀ´ÓÃÀ´´òear°üµÄearÏîÄ¿

5.Ò»¸öÓÃÓÚ´æ·ÅÏîÄ¿ÅäÖÃÎļþÏà¹ØµÄconfig×ÓĿ¼¡£Ëü²»ÊÇ×ÓÄ£¿é£¬ËùÒÔ config²»Ó¦¸Ã±»¼Óµ½ÏîÄ¿µÄ¹¹½¨ÖÐÈ¥¡£

ËüÃǶ¼·ÅÖÃÔÚ¸ùÏîĿĿ¼Ï¡£ÎÒÃÇͨ¹ýÈçϵÄsettings.gradleÀ´ÉèÖÃÏîÄ¿ÖеÄ×ÓÏîÄ¿£º

include 'core', 'enterprise-beans', 'cis-war', 'admin-war', 'jaxb', 'ear'

ÎÒÃǽ«ÐèÒª¼ÓÈëµ½ÏîÄ¿¹¹½¨ÖеÄ×ÓÏîÄ¿ÅäÖÃÔÚsettings.gradleÎļþÖУ¬¶øÃ»ÓмÓÈë²»ÐèÒªµÄconfig×ÓĿ¼¡£

1.2 ¹²ÏíÅäÖÃ

ÔÚ´óÐÍJavaÏîÄ¿ÖУ¬×ÓÏîĿ֮¼ä±ØÈ»¾ßÓÐÏàͬµÄÅäÖÃÏî¡£ÎÒÃÇÔÚ±àд´úÂëʱ£¬Òª×·Çó´úÂëÖØÓúʹúÂëÕû½à£»¶øÔÚ±àдGradle½Å±¾Ê±£¬Í¬ÑùÐèÒª±£³Ö´úÂëÖØÓúʹúÂëÕû½à¡£Gradle ÌṩÁ˲»Í¬µÄ·½Ê½Ê¹²»Í¬µÄÏîÄ¿Äܹ»¹²ÏíÅäÖá£

allprojects£ºallprojectsÊǸ¸ProjectµÄÒ»¸öÊôÐÔ£¬¸ÃÊôÐԻ᷵»Ø¸ÃProject¶ÔÏóÒÔ¼°ÆäËùÓÐ×ÓÏîÄ¿¡£ÔÚ¸¸ÏîÄ¿µÄbuild.gradle½Å±¾À¿ÉÒÔͨ¹ý¸øallprojects´«Ò»¸ö°üº¬ÅäÖÃÐÅÏ¢µÄ±Õ°ü£¬À´ÅäÖÃËùÓÐÏîÄ¿£¨°üÀ¨¸¸ÏîÄ¿£©µÄ¹²Í¬ÉèÖá£Í¨³£¿ÉÒÔÔÚÕâÀïÅäÖÃIDEµÄ²å¼þ£¬groupºÍversionµÈÐÅÏ¢£¬±ÈÈ磺

allprojects {
apply plugin: 'idea'
}

ÕâÑù¾Í»á¸øËùÓеÄÏîÄ¿£¨°üÀ¨µ±Ç°ÏîÄ¿ÒÔ¼°Æä×ÓÏîÄ¿£©Ó¦ÓÃÉÏidea²å¼þ¡£

subprojects£ºsubprojectsºÍallprojectsÒ»Ñù£¬Ò²ÊǸ¸ProjectµÄÒ»¸öÊôÐÔ£¬¸ÃÊôÐԻ᷵»ØËùÓÐ×ÓÏîÄ¿¡£ÔÚ¸¸ÏîÄ¿µÄbuild.gradle½Å±¾À¸ø subprojects´«Ò»¸ö°üº¬ÅäÖÃÐÅÏ¢µÄ±Õ°ü£¬¿ÉÒÔÅäÖÃËùÓÐ×ÓÏîÄ¿¹²ÓеÄÉèÖ㬱ÈÈ繲ͬµÄ²å¼þ¡¢repositories¡¢ÒÀÀµ°æ±¾ÒÔ¼°ÒÀÀµÅäÖãº

subprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
ext {
guavaVersion = ¡¯14.0.1¡¯
junitVersion = ¡®4.10¡¯
}

dependencies {
compile(
¡°com.google.guava:guava:${guavaVersion}¡±
)
testCompile(
¡°junit:junit:${junitVersion}¡±
)
}
}

Õâ¾Í»á¸øËùÓÐ×ÓÏîÄ¿ÉèÖÃÉÏjavaµÄ²å¼þ¡¢Ê¹ÓÃmavenCentral×÷Ϊ ËùÓÐ×ÓÏîÄ¿µÄrepositoryÒÔ¼°¶ÔGuava[4]ºÍJUnitµÄÏîÄ¿ÒÀÀµ¡£´ËÍ⣬ÕâÀﻹÔÚextÀïÅäÖÃÒÀÀµ°üµÄ°æ±¾£¬·½±ãÒÔºóÉý¼¶ÒÀÀµµÄ°æ±¾¡£

configure£ºÔÚÏîÄ¿ÖУ¬²¢²»ÊÇËùÓеÄ×ÓÏîÄ¿¶¼»á¾ßÓÐÏàͬµÄÅäÖ㬵«ÊÇ»áÓв¿·Ö×ÓÏîÄ¿¾ßÓÐÏàͬµÄÅäÖ㬱ÈÈçÔÚÎÒËùÔÚµÄÏîÄ¿Àï³ýÁËcis-warºÍadmin-warÊÇwebÏîĿ֮Í⣬ÆäËû×ÓÏîÄ¿¶¼²»ÊÇ¡£ËùÒÔÐèÒª¸øÕâÁ½¸ö×ÓÏîÄ¿Ìí¼Ówar²å¼þ¡£GradleµÄconfigure¿ÉÒÔ´«Èë×ÓÏîÄ¿Êý×飬²¢ÎªÕâЩ×ÓÏîÄ¿ÉèÖÃÏà¹ØÅäÖá£ÔÚÎÒµÄÏîÄ¿ÖÐʹÓÃÈçϵÄÅäÖãº

configure(subprojects.findAll {it.name.contains('war')}) {
apply plugin: 'war'
}

configureÐèÒª´«ÈëÒ»¸öProject¶ÔÏóµÄÊý×飬ͨ¹ý²éÕÒËùÓÐÏîÄ¿Ãû°üº¬warµÄ×ÓÏîÄ¿£¬²¢ÎªÆäÉèÖÃwar²å¼þ¡£

1.3 ¶ÀÏíÅäÖÃ

ÔÚÏîÄ¿ÖУ¬³ýÁËÉèÖù²Í¬ÅäÖÃÖ®Í⣬ ÿ¸ö×ÓÏîÄ¿»¹»áÓÐÆä¶ÀÓеÄÅäÖᣱÈÈçÿ¸ö×ÓÏîÄ¿¾ßÓв»Í¬µÄÒÀÀµÒÔ¼°Ã¿¸ö×ÓÏîÄ¿ÌØÊâµÄtaskµÈ¡£GradleÌṩÁËÁ½ÖÖ·½Ê½À´·Ö±ðΪÿ¸ö×ÓÏîÄ¿ÉèÖöÀÓеÄÅäÖá£

ÔÚ¸¸ÏîÄ¿µÄbuild.gradleÎļþÖÐͨ¹ýproject(¡®:sub-project-name¡¯)À´ÉèÖöÔÓ¦µÄ×ÓÏîÄ¿µÄÅäÖᣱÈÈçÔÚ×ÓÏîÄ¿coreÐèÒªHibernateµÄÒÀÀµ£¬¿ÉÒÔÔÚ¸¸ÏîÄ¿µÄbuild.gradleÎļþÖÐÌí¼ÓÈçϵÄÅäÖãº

project(¡®:core¡¯) {
ext{
hibernateVersion = ¡®4.2.1.Final¡¯
}
dependencies {
compile ¡°org.hibernate:hibernate-core:${hibernateVersion}¡±
}
}

×¢ÒâÕâÀï×ÓÏîÄ¿Ãû×ÖÇ°ÃæÓÐÒ»¸öðºÅ£¨£º£©¡£ ͨ¹ýÕâÖÖ·½Ê½£¬Ö¸¶¨¶ÔÓ¦µÄ×ÓÏîÄ¿£¬²¢¶ÔÆä½øÐÐÅäÖá£

ÎÒÃÇ»¹¿ÉÒÔÔÚÿ¸ö×ÓÏîÄ¿µÄĿ¼ÀィÁ¢×Ô¼ºµÄ¹¹½¨½Å±¾¡£ÔÚÉÏÀýÖУ¬¿ÉÒÔÔÚ×ÓÏîÄ¿coreĿ¼ÏÂΪÆä½¨Á¢Ò»¸öbuild.gradleÎļþ£¬²¢Ôڸù¹½¨½Å±¾ÖÐÅäÖÃcore×ÓÏîÄ¿ËùÐèµÄËùÓÐÅäÖá£ÀýÈ磬ÔÚ¸Ãbuild.gradleÎļþÖÐÌí¼ÓÈçÏÂÅäÖãº

ext{
hibernateVersion = ¡®4.2.1.Final¡¯
}
dependencies {
compile ¡°org.hibernate:hibernate-core:${hibernateVersion}¡±
}

¸ù¾ÝÎÒ¶ÔGradleµÄʹÓþ­Ñ飬¶ÔÓÚ×ÓÏîÄ¿ÉÙ£¬ÅäÖüòµ¥µÄСÐÍÏîÄ¿£¬ÍƼöʹÓõÚÒ»ÖÖ·½Ê½ÅäÖã¬ÕâÑù¾Í¿ÉÒÔ°ÑËùÓеÄÅäÖÃÐÅÏ¢·ÅÔÚͬһ¸öbuild.gradleÎļþÀï¡£ÀýÈçÎÒͬÊÂÖ£êʵĿªÔ´ÏîÄ¿moco¡£ËüÖ»ÓÐÁ½¸ö×ÓÏîÄ¿£¬Òò¶ø¾ÍʹÓÃÁ˵ÚÒ»ÖÖ·½Ê½ÅäÖã¬ÔÚÏîÄ¿¸ùĿ¼ÏµÄbuild.gradleÎļþÖÐÉèÖÃÏîÄ¿Ïà¹ØµÄÅäÖÃÐÅÏ¢¡£µ«ÊÇ£¬ÈôÊǶÔÓÚ×ÓÏîÄ¿¶à£¬²¢ÇÒÅäÖø´ÔӵĴóÐÍÏîÄ¿£¬Ê¹ÓõڶþÖÖ·½Ê½¶ÔÏîÄ¿½øÐÐÅäÖûá¸üºÃ¡£ÒòΪ£¬µÚ¶þÖÖÅäÖ÷½Ê½½«¸÷¸öÏîÄ¿µÄÅäÖ÷ֱð·Åµ½µ¥¶ÀµÄbuild.gradleÎļþÖÐÈ¥£¬¿ÉÒÔ·½±ãÉèÖú͹ÜÀíÿ¸ö×ÓÏîÄ¿µÄÅäÖÃÐÅÏ¢¡£

1.4 ÆäËû¹²Ïí

ÔÚGradleÖУ¬³ýÁËÉÏÃæÌáµ½µÄÅäÖÃÐÅÏ¢¹²Ïí£¬»¹¿ÉÒÔ¹²Ïí·½·¨ÒÔ¼°Task¡£¿ÉÒÔÔÚ¸ùĿ¼µÄbuild.gradleÎļþÖÐÌí¼ÓËùÓÐ×ÓÏîÄ¿¶¼ÐèÒªµÄ·½·¨£¬ÔÚ×ÓÏîÄ¿µÄbuild.gradleÎļþÖе÷ÓÃÔÚ¸¸ÏîÄ¿build.gradle½Å±¾ÀﶨÒåµÄ·½·¨¡£ÀýÈçÎÒ¶¨ÒåÁËÕâÑùÒ»¸ö·½·¨£¬Ëü¿ÉÒÔ´ÓÃüÁîÐÐÖлñÈ¡ÊôÐÔ£¬ÈôûÓÐÌṩ¸ÃÊôÐÔ£¬ÔòʹÓÃĬÈÏÖµ£º

def defaultProperty(propertyName, defaultValue) {
return hasProperty(propertyName) ? project[propertyName] : defaultValue
}

×¢Ò⣬Õâ¶Î½Å±¾ÍêÈ«¾ÍÊÇÒ»¶ÎGroovy´úÂ룬¾ßÓзdz£ºÃµÄ¿É¶ÁÐÔ¡£

ÓÉÓÚÔÚ¸¸ÏîÄ¿Öж¨ÒåÁËdefaultProperty·½·¨£¬Òò¶øÔÚ×ÓÏîÄ¿µÄbuild.gradleÎļþÖУ¬Ò²¿ÉÒÔµ÷Óø÷½·¨¡£

2. »·¾³µÄÅäÖÃ

ΪÁË·½±ãµØ½«Ó¦Óò¿Ê𵽿ª·¢¡¢²âÊÔÒÔ¼°²úÆ·µÈ²»Í¬»·¾³ÉÏ£¬ GradleÌṩÁ˼¸ÖÖ²»Í¬µÄ·½Ê½Îª²»Í¬µÄ»·¾³´ò°ü£¬Ê¹µÃ²»Í¬µÄ»·¾³¿ÉÒÔʹÓò»Í¬µÄÅäÖÃÎļþ¡£´ËÍ⣬Ëü»¹ÌṩÁ˼òµ¥µÄ·½·¨£¬Ê¹µÃÎÒÃÇÄܹ»±ã½ÝµØ³õʼ»¯Êý¾Ý¿â ¡£

2.1 PropertiesÅäÖÃ

ҪΪ²»Í¬µÄ»·¾³Ìṩ²»Ò»ÑùµÄÅäÖÃÐÅÏ¢£¬MavenÑ¡ÔñʹÓÃprofile£¬¶øGradleÔòÌṩÁËÁ½ÖÖ·½·¨Îª¹¹½¨½Å±¾ÌṩPropertiesÅäÖãº

µÚÒ»ÖÖ·½Ê½ÊÇʹÓô«Í³µÄpropertiesÎļþ£¬ È»ºóÔÚʹÓÃGradleʱ£¬Í¨¹ý´«È벻ͬµÄ²ÎÊý¼ÓÔØ²»Í¬µÄpropertiesÎļþ¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔÔÚÏîÄ¿ÖÐÌṩdevelopment.properties¡¢test.propertiesºÍproduction.properties¡£ÔÚÏîÄ¿ÔËÐÐʱ£¬Ê¹ÓÃ-Pprofile=developmentÀ´Ö¸¶¨¼ÓÔØ¿ª·¢»·¾³µÄÅäÖ᣹¹½¨½Å±¾ÖмÓÔØpropertiesÎļþµÄ´úÂëÈçÏ£º

ext {
profile = project['profile']
}
def loadProperties(){
def props = new Properties()
new File("${rootProject.projectDir}/config/${profile}.properties")
.withInputStream {
stream -> props.load(stream)
}
props
}

ÔÚÔËÐнű¾µÄʱºò£¬´«ÈëµÄ-Pprofile=development¿ÉÒÔÖ¸¶¨Ê¹ÓÃÄĸöÔËÐл·¾³µÄÅäÖÃÎļþ¡£´úÂëÖÐʹÓÃÁËproject['profile']´ÓÃüÁîÐÐÀï¶ÁÈ¡-P´«ÈëµÄ²ÎÊý£¬Gradle»áÈ¥¸¸ÏîÄ¿¸ùĿ¼ÏµÄconfigÎļþ¼ÐÖÐÐèÕÒ¶ÔÓ¦µÄpropertiesÎļþ¡£

ÁíÍâÒ»ÖÖ·½Ê½¾ÍÊÇʹÓÃGroovyµÄÓï·¨£¬¶¨Òå¿É¶ÁÐÔ¸ü¸ßµÄÅäÖÃÎļþ¡£±ÈÈç¿ÉÒÔÔÚÏîÄ¿Öж¨Òåconfig.groovyµÄÅäÖÃÎļþ£¬ÄÚÈÝÈçÏ£º

environments {
    development {
        jdbc {
            url = 'development'
            user = 'xxxx'
            password = 'xxxx'
        }
    }

    test {
        jdbc {
            url = 'test'
            user = 'xxxx'
            password = 'xxxx'
        }
    }

    production {
        jdbc {
            url = 'production'
            user = 'xxxx'
            password = 'xxxx'
        }
    }
}

ÕâÀﶨÒåÁËÈý¸ö»·¾³ÏµIJ»Í¬Êý¾Ý¿âÅäÖã¬ÔÚ¹¹½¨½Å±¾ÖÐʹÓÃÈçϵĴúÂëÀ´¼ÓÔØ£º

ext {
    profile = project['profile']
}

def loadGroovy(){
    def configFile = file('config.groovy')
    new ConfigSlurper(profile).parse(configFile.toURL()).toProperties()
}

ÕâÀïÔÚConfigSlurperµÄ¹¹Ô캯ÊýÀï´«Èë´ÓÃüÁîÐÐÀïÈ¡µ½µÄ-PµÄ²ÎÊý¡£µ÷ÓÃloadGroovy·½·¨¾Í¿ÉÒÔ¼ÓÔØÏîÄ¿¸ùĿ¼ÏµÄconfig.groovyÎļþ£¬²¢×÷Ϊһ¸öMap·µ»Ø£¬ÕâÑù¾Í¿ÉÒÔͨ¹ýjdbc.urlÀ´»ñÈ¡urlµÄÖµ¡£

´Ó¿É¶ÁÐÔÒÔ¼°´úÂëÕû½à£¨ÅäÖÃÎļþÒ²ÐèÒª´úÂëÕû½à£©¶øÑÔ£¬ÎÒÍÆ¼öʹÓõڶþÖÖ·½Ê½À´ÅäÖã¬ÒòΪÕâÖÖ·½·¨¾ßÓÐÇåÎúµÄ½á¹¹¡£ÈçÉÏÃæµÄÀý×Ó£¬¾Í¿ÉÒÔ°ÑÊý¾Ý¿âÏà¹ØµÄÐÅÏ¢¶¼·ÅÔÚjdbcÕâ¸ö´óµÄ½ÚµãÏ£¬¶ø²»ÓÃÏñpropertiesÎļþÕâÑùµÄ±âƽ½á¹¹¡£µ«ÊǶÔÓÚһЩÒѾ­Ê¹ÓÃpropertiesÎļþÀ´Îª²»Í¬»·¾³ÌṩÅäÖÃÐÅÏ¢µÄÒÅÁôÏîÄ¿ÀʹÓÃpropertiesÎļþҲûÓÐÎÊÌâ¡£

2.2 Ìæ»»

ͨ¹ý²»Í¬µÄ·½Ê½¼ÓÔØ²»Í¬»·¾³µÄÅäÖú󣬾ÍÐèÒª°ÑËüÃÇÌæ»»µ½ÓÐռλ·ûµÄÅäÖÃÎļþÖÐÈ¥¡£ÔÚÅäÖÃÎļþÖÐʹÓÃ@key@À´±ê×¢Òª±»Ìæ»»µÄλÖ㬱ÈÈçÔÚconfigÎļþ¼ÐÖÐÓÐjdbc.propertiesÎļþ£¬ÆäÄÚÈÝÈçÏ£º

jdbc.url=@jdbc.url@
jdbc.user=@jdbc.user@
jdbc.password=@jdbc.password@

ÔÚGradle¹¹½¨¹ý³ÌÖУ¬ÓÐÒ»¸öprocessResourcesµÄTask£¬¿ÉÒÔÐ޸ĸÃTaskµÄÅäÖã¬ÈÃÆäÔÚ¹¹½¨¹ý³ÌÖÐÌæ»»×ÊÔ´ÎļþÖеÄռλ·û£º

processResources {
from(sourceSets.main.resources.srcDirs) {
filter(org.apache.tools.ant.filters.ReplaceTokens,
tokens: loadGroovyConfig()
)
}
}

ÉÏÃæÕâÖÖ×ö·¨ÓÃÀ´´¦Àí×ÓÏîÄ¿src/main/resourcesÎļþ¼ÐϵÄ×ÊÔ´Îļþ£¬ËùÒÔÐèÒª½«Õâ¶Î´úÂë·ÅÔÚ×ÓÏîÄ¿µÄ¶ÀÁ¢ÅäÖÃÎļþÀï¡£

ÔÚһЩ¸´ÔÓµÄÏîÄ¿ÖУ¬¾­³£»á°ÑÅäÖÃÎļþ·ÅÖõ½Ò»¸öĿ¼½øÐÐͳһ¹ÜÀí¡£±ÈÈçÔÚÎÒËùÔÚµÄÏîÄ¿£¬¾ÍרÃÅÌṩÁËÒ»¸öconfig×ÓĿ¼£¬ÀïÃæ´æ·ÅÁËËùÓеÄÅäÖÃÐÅÏ¢¡£ÔÚ´¦ÀíÕâЩ×ÊÔ´Îļþʱ£¬ GradleĬÈÏÌṩµÄprocessResources¾Í²»¹»ÓÃÁË£¬ÎÒÃÇÐèÒªÔÚGradle½Å±¾Öж¨ÒåÒ»¸öTaskÈ¥Ìæ»»ÕâЩ°üº¬Õ¼Î»·ûµÄÅäÖÃÎļþ£¬È»ºóÈÃpackage»òÕßdeployµÄTaskÒÀÀµÕâ¸öTask¡£¸ÃTaskµÄ´úÂëÈçÏ£º

task replace(type: Sync) {
            def configHome = "${project.rootDir}/config"

    from(configHome) {
        include '**/*.properties'
        include '**/*.xml'
        filter org.apache.tools.ant.filters.ReplaceTokens, 
tokens: loadGroovyConfig()
    }
    into "${buildDir}/resources/main"
}

ÕâÀﶨÒåÁËÒ»¸öSyncÀàÐ͵ÄTask£¬»á½«¸¸ÏîÄ¿µÄ¸ùĿ¼ÏµÄconfigÎļþ¼ÐµÄËùÓÐpropertiesºÍxmlÎļþʹÓôÓloadGroovyConfig()·½·¨ÖмÓÔØ³öÀ´µÄÅäÖÃÌæ»»£¬²¢½«Ìæ»»Ö®ºóµÄÎļþ·Åµ½buildÎļþ¼ÐϵÄresource/mainĿ¼ÖС£ÔÙÈôò°üµÄTaskÒÀÀµÕâ¸öTask£¬¾Í»á°ÑÌæ»»Ö®ºóµÄÅäÖÃÎļþ´òµ½°üÖС£

2.3 ¸ü¸´ÔÓµÄÇé¿ö

ÉÏÃæ½éÉÜÁËÔÚÏîÄ¿ÖÐÈçºÎʹÓÃGradle´¦Àí propertiesºÍxmlÎļþÖоßÓÐÏàͬÅäÖ㬵«ÆäÖеÄһЩֵ²¢²»ÏàͬµÄÇé¿ö ¡£È»¶ø£¬ÔÚÓÐЩÏîÄ¿Öв»Í¬µÄ»·¾³ÅäÖÃÖ®¼ä±ä»¯µÄ²»½öÊÇÖµ£¬ºÜÓпÉÄÜÕû¸öÅäÖÃÎļþ¶¼²»Ïàͬ£»ÄÇô£¬Ê¹ÓÃÉÏÃæÌæ»»µÄ´¦Àí·½Ê½¾ÍÎÞ·¨Âú×ãÒªÇóÁË¡£

ÔÚÎÒËùÔÚµÄÏîÄ¿ÖУ¬ÎÒÃÇÐèÒªÒÀÀµÒ»¸öÍⲿµÄWeb Service¡£ÔÚ¿ª·¢»·¾³ÉÏ£¬ÎÒÃÇʹÓÃÁËStubÀ´Ä£ÄâºÍWeb ServiceÖ®¼äµÄ½»»¥£¬Îª¿ª·¢»·¾³Ìṩ²âÊÔÊý¾Ý£¬ÕâЩÊý¾Ý¶¼·ÅÖÃÔÚÒ»¸öSpringµÄÅäÖÃÎļþÖУ»¶øÔÚ²âÊԺͲúÆ·»·¾³ÉÏ£¬ÓÖҪʹÓöÔÓ¦µÄ²âÊԺͲúÆ·»·¾³µÄWeb Service¡£Õâʱ£¬¿ª·¢¡¢²âÊÔÓë²úÆ·»·¾³µÄÅäÖÃÍêÈ«²»Í¬¡£¶ÔÓÚÕâÖÖ¸´ÔÓµÄÇé¿ö£¬Gradle¿ÉÒÔÔÚ¹¹½¨¹ý³ÌÖÐΪ²»Í¬µÄ»·¾³Ö¸¶¨²»Í¬µÄ×ÊÔ´Îļþ¼Ð£¬ÔÚ²»Í¬µÄ×ÊÔ´Îļþ¼ÐÖаüº¬²»Í¬µÄÅäÖÃÎļþ¡£

ÀýÈ磬ÔÚÎÒÃÇÏîÄ¿µÄconfigĿ¼Ï°üº¬ÁËapplicationÎļþ¼Ð£¬¶¨ÒåÁ˲»Í¬»·¾³ËùÐèµÄ²»Í¬ÅäÖÃÎļþ£¬ÆäĿ¼½á¹¹ÈçÏÂͼËùʾ£º

ÔÚ¹¹½¨½Å±¾ÖУ¬¸ù¾Ý´ÓÃüÁîÐжÁÈëµÄ-P²ÎÊý£¬Ê¹Óò»Í¬µÄ×ÊÔ´Îļþ¼Ð£¬Æä´úÂëÈçÏ£º

sourceSets {
    main {
        resources {
            srcDir "config/application/spring/${profile}", 
                        "config/application/properties/${profile}"
        }
    }
}

ÕâÑùÔÚ´ò°üµÄ¹ý³ÌÖУ¬¾Í¿ÉÒÔʹÓÃ-P´«ÈëµÄ²ÎÊýµÄ×ÊÔ´Îļþ¼ÐÏÂÃæµÄpropertiesºÍxmlÎļþ×÷ΪÏîÄ¿µÄÅäÖÃÎļþ¡£

2.4 ³õʼ»¯Êý¾Ý¿â

ÔÚÏîÄ¿¿ª·¢¹ý³ÌÖУ¬ÎªÁË·½±ãΪ²»Í¬»·¾³¹¹½¨ÏàͬµÄÊý¾Ý¿â¼°Êý¾Ý£¬ÎÒÃÇͨ³£Ðè´´½¨Êý¾Ý¿âµÄ±íÒÔ¼°²åÈëһЩ³õʼ»¯Êý¾Ý¡£GradleĿǰûÓÐÌṩÏà¹ØµÄTask»òÕßPlugin£¬µ«ÊÇÎÒÃÇ¿ÉÒÔ×Ô¼º´´½¨TaskÈ¥ÔËÐÐSQLÀ´³õʼ»¯¸÷¸ö»·¾³ÉϵÄÊý¾Ý¿â¡£

Ç°ÃæÒ²Ìáµ½GradleÊÇGroovy¶¨ÒåµÄDSL£¬ËùÒÔÎÒÃÇ¿ÉÒÔÔÚGradleÖÐʹÓÃGroovyµÄ´úÂëÀ´Ö´ÐÐSQL½Å±¾Îļþ¡£ÔÚGradle½Å±¾ÖУ¬Ê¹ÓÃGroovy¼ÓÔØÊý¾Ý¿âµÄDriverÖ®ºó£¬¾Í¿ÉÒÔʹÓÃGroovyÌṩµÄSqlÀàÈ¥Ö´ÐÐSQLÀ´³õʼ»¯Êý¾Ý¿âÁË¡£´úÂëÈçÏ£º

groovy.sql.Sql oracleSql = 
	Sql.newInstance(props.getProperty('database.connection.url'),
                props.getProperty('database.userid'),
                props.getProperty('database.password'),
                props.getProperty('database.connection.driver'))

try {
        new File(script).text.split(";").each {
            logger.info it
            oracleSql.execute(it)
        }
    } catch (Exception e) { }

Õâ¶Î´úÂë»á³õʼ»¯Ö´ÐÐSQLµÄgroovy.sql.Sql¶ÔÏó£¬È»ºó°´Õշֺţ¨;£©·Ö¸îSQL½Å±¾ÎļþÀïµÄÿһÌõSQL²¢Ö´ÐС£¶ÔÓÚһЩ±ØÐëÔËÐгɹ¦µÄSQLÎļþ£¬¿ÉÒÔÔÚcatch¿éÀïͨ¹ýÅ׳öÒì³£À´ÖÐÖ¹Êý¾Ý¿âµÄ³õʼ»¯¡£ÐèҪעÒâµÄÊÇÐèÒª½«Êý¾Ý¿âµÄDriver¼ÓÔØµ½ClassPathÀï²Å¿ÉÒÔÕýÈ·µØÖ´ÐС£

ÒòΪÔÚGradleÖаüº¬ÁËAnt£¬ËùÒÔÎÒÃdzýÁËʹÓÃGroovyÌṩµÄAPIÀ´Ö´ÐÐSQLÖ®Í⣬»¹¿ÉÒÔʹÓÃAntµÄsqlÈÎÎñÀ´Ö´ÐÐSQL½Å±¾Îļþ¡£µ«Èô·ÇÌØÊâÇé¿ö£¬ÎÒ²¢²»ÍƼöʹÓÃAntÈÎÎñ£¬Õⲿ·ÖÄÚÈÝÓë±¾ÎÄÎ޹أ¬ÕâÀï²»ÔÙϸÊö ¡£

3. ´úÂëÖÊÁ¿

´úÂëÖÊÁ¿ÊÇÈí¼þ¿ª·¢ÖÊÁ¿µÄÒ»²¿·Ö£¬³ýÁËÈ˹¤´úÂëÆÀÉóÖ®Í⣬ÔÚ°Ñ´úÂëÌá½»µ½´úÂë¿â֮ǰ£¬»¹Ó¦¸ÃʹÓÃ×Ô¶¯¼ì²é¹¤¾ßÀ´×Ô¶¯¼ì²é´úÂ룬À´±£Ö¤ÏîÄ¿µÄ´úÂëÖÊÁ¿¡£ÏÂÃæ½éÉÜÒ»ÏÂGradleÌṩµÄÖ§³Ö´úÂë¼ì²éµÄ²å¼þ ¡£

3.1 CheckStyle

CheckStyleÊÇSourceForgeϵÄÒ»¸öÏîÄ¿£¬ÌṩÁËÒ»¸ö°ïÖúJAVA¿ª·¢ÈËÔ±×ñÊØÄ³Ð©±àÂë¹æ·¶µÄ¹¤¾ß¡£ËüÄܹ»×Ô¶¯»¯´úÂë¹æ·¶¼ì²é¹ý³Ì£¬´Ó¶øÊ¹µÃ¿ª·¢ÈËÔ±´ÓÕâÏîÖØÒªÈ´¿ÝÔïµÄÈÎÎñÖнâÍѳöÀ´¡£Gradle¹Ù·½ÌṩÁËCheckStyleµÄ²å¼þ£¬ÔÚGradleµÄ¹¹½¨½Å±¾ÖÐÖ»ÐèÒªÓ¦Óøòå¼þ£º

apply plugin: 'checkstyle'

ĬÈÏÇé¿öÏ£¬¸Ã²å¼þ»áÕÒ/config/checkstyle/checkstyle.xml×÷ΪCheckStyleµÄÅäÖÃÎļþ£¬¿ÉÒÔÔÚcheckstyle²å¼þµÄÅäÖý׶Σ¨Configuration£© ÉèÖÃCheckStyleµÄÅäÖÃÎļþ£º

checkstyle{
configFile = file('config/checkstyle/checkstyle-main.xml')
}

»¹¿ÉÒÔͨ¹ýcheckstyleÉèÖÃCheckStyle²å¼þµÄÆäËûÅäÖá£

3.2 FindBugs

FindBugs ÊÇÒ»¸ö¾²Ì¬·ÖÎö¹¤¾ß£¬Ëü¼ì²éÀà»òÕß JAR Îļþ£¬½«×Ö½ÚÂëÓëÒ»×éȱÏÝģʽ½øÐжԱÈÒÔ·¢ÏÖ¿ÉÄܵÄÎÊÌâ¡£GradleʹÓÃÈçϵĴúÂëΪÏîÄ¿µÄ¹¹½¨½Å±¾Ìí¼ÓFindBugsµÄ²å¼þ£º

apply plugin: 'findbugs'

ͬÑùÒ²¿ÉÒÔÔÚFindBugsµÄÅäÖý׶Σ¨Configuration£©ÉèÖÃÆäÏà¹ØµÄÊôÐÔ£¬±ÈÈçReportµÄÊä³öĿ¼¡¢¼ì²éÄÄЩsourceSetµÈ¡£

3.3 JDepend

ÔÚ¿ª·¢JavaÏîĿʱ¾­³£»áÓöµ½¹ØÓÚ°ü»ìÂÒµÄÎÊÌ⣬ JDepend¹¤¾ß¿ÉÒÔ°ïÖúÄãÔÚ¿ª·¢¹ý³ÌÖÐËæÊ±¸ú×Ùÿ¸ö°üµÄÒÀÀµÐÔ£¨ÒýÓÃ/±»ÒýÓã©£¬´Ó¶øÉè¼Æ¸ßά»¤ÐԵļܹ¹£¬²»ÂÛÊÇÔÚ´ò°ü·¢²¼»¹Êǰ汾Éý¼¶¶¼»á¸ü¼ÓÇáËÉ¡£ÔÚ¹¹½¨½Å±¾ÖмÓÈëÈçÏ´úÂë¼´¿É£º

apply plugin: 'jdepend'

3.4 PMD

PMDÊÇÒ»ÖÖ¿ªÔ´·ÖÎöJava´úÂë´íÎóµÄ¹¤¾ß¡£ÓëÆäËû·ÖÎö¹¤¾ß²»Í¬µÄÊÇ£¬PMDͨ¹ý¾²Ì¬·ÖÎö»ñÖª´úÂë´íÎ󣬼´ÔÚ²»ÔËÐÐJava³ÌÐòµÄÇé¿öϱ¨¸æ´íÎó¡£PMD¸½´øÁËÐí¶à¿ÉÒÔÖ±½ÓʹÓõĹæÔò£¬ÀûÓÃÕâЩ¹æÔò¿ÉÒÔÕÒ³öJavaÔ´³ÌÐòµÄÐí¶àÎÊÌâ¡£´ËÍ⣬Óû§»¹¿ÉÒÔ×Ô¼º¶¨Ò广Ôò£¬¼ì²éJava´úÂëÊÇ·ñ·ûºÏÄ³Ð©ÌØ¶¨µÄ±àÂë¹æ·¶¡£ÔÚ¹¹½¨½Å±¾ÖмÓÈëÈçÏ´úÂ룺

apply plugin: 'pmd'

3.5 С½á

ÉÏÃæÌáµ½µÄ¼¸ÖÖ´úÂë¼ì²é²å¼þapplyµ½¹¹½¨½Å±¾Ö®ºó£¬¿ÉÒÔÔËÐУº

gradle check

À´Ö´ÐдúÂëÖÊÁ¿¼ì²é¡£¸üÏêϸµÄÐÅÏ¢Çë²éÔÄGradleµÄ¹Ù·½Îĵµ¡£ÔËÐнáÊøºó»áÔÚ¶ÔÓ¦µÄÏîĿĿ¼ÏµÄbuildÎļþ¼ÐÏÂÉú³Éreport¡£

¶ÔÓÚGradleûÓÐÌṩµÄ´úÂë¼ì²é¹¤¾ß£¬ÎÒÃÇ¿ÉÒÔÓÐÁ½ÖÖÑ¡Ôñ£ºµÚÒ»¾ÍÊÇ×Ô¼ºÊµÏÖÒ»¸öGradle²å¼þ£¬µÚ¶þ¾ÍÊǵ÷ÓÃAntÈÎÎñ£¬ÈÃAnt×÷Ϊһ¸öý½éÈ¥µ÷ÓÃÔÚAntÖÐÒѾ­ÓеĴúÂë¼ì²é¹¤¾ß£¬±ÈÈç²âÊÔ¸²¸ÇÂʵÄCobertura¡£ÎÒÃǵÄÏîĿʹÓÃÁËAntÀ´µ÷ÓÃCobertura£¬µ«ÊÇΪÁËʹÓ÷½±ã£¬ÎÒÃǽ«Ëü·âװΪһ¸öGradle²å¼þ£¬ÕâÑù¾Í¿ÉÒÔÔÚ²»Í¬µÄÏîÄ¿ÀïÖØÓá£

4. ÒÀÀµ

¼¸ºõÿ¸öJavaÏîÄ¿¶¼»áÓõ½¿ªÔ´¿ò¼Ü¡£Í¬Ê±£¬¶ÔÓÚ¾ßÓжà¸ö×ÓÄ£¿éµÄÏîÄ¿À´Ëµ£¬ÏîĿ֮¼äÒ²»áÓÐËùÒÀÀµ¡£ËùÒÔ£¬¹ÜÀíÏîÄ¿ÖжԿªÔ´¿ò¼ÜºÍÆäËûÄ£¿éµÄÒÀÀµÊÇÿ¸öÏîÄ¿±ØÐëÃæ¶ÔµÄÎÊÌ⡣ͬʱ£¬GradleҲʹÓÃRepositoryÀ´¹ÜÀíÒÀÀµ¡£

4.1 Jar°üÒÀÀµ¹ÜÀí

MavenÌá³öÁËʹÓÃRepositoryÀ´¹ÜÀíJar°ü£¬AntÒ²ÌṩÁËʹÓÃIvyÀ´¹ÜÀíjar°ü¡£GradleÌṩÁ˶ÔËùÓÐÕâЩRespositoryµÄÖ§³Ö£¬¿ÉÒÔ´ÓGradleµÄ¹Ù·½ÎĵµÉÏÁ˽â¸üÏêϸµÄÐÅÏ¢¡£

GradleÑØÓÃMavenµÄÒÀÀµ¹ÜÀí·½·¨£¬Í¨¹ýgroupId¡¢nameºÍversionµ½ÅäÖõÄRepositoryÀïѰÕÒÖ¸¶¨µÄJar°ü¡£Í¬Ñù£¬ËüÒ²ÌṩÁ˺ÍMavenÒ»ÑùµÄ¹¹½¨ÉúÃüÖÜÆÚ£¬compile¡¢runtime¡¢testCompileºÍtestRuntime·Ö±ð¶ÔÓ¦ÏîÄ¿²»Í¬½×¶ÎµÄÒÀÀµ¡£Í¨¹ýÈçÏ·½Ê½Îª¹¹½¨½Å±¾Ö¸¶¨ÒÀÀµ£º

dependencies {
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
testCompile group:'junit', name: 'junit', version '4.11'
}

ÕâÀï·Ö±ðÖ¸¶¨group¡¢nameÒÔ¼°version£¬µ«ÊÇGradleÌṩÁËÒ»ÖÖ¸ü¼òµ¥µÄ·½Ê½À´Ö¸¶¨ÒÀÀµ£º

dependencies {
compile 'org.hibernate:hibernate-core:3.6.7.Final'
testCompile 'junit:junit:4.11'
}

ÕâÑù±ÈMavenʹÓÃXMLÀ´¹ÜÀíÒÀÀµ¼òµ¥¶àÁË£¬µ«ÊÇ»¹¿ÉÒÔ¸ü¼òµ¥Ò»µã¡£Êµ¼ÊÉÏÕâÀïµÄcompileºÍtestCompileÊÇGroovyΪGradleÌṩµÄ·½·¨£¬¿ÉÒÔΪÆä´«Èë¶à¸ö²ÎÊý£¬ËùÒÔµ±compileÓжà¸öJar°üÒÀÀµµÄʱºò£¬¿ÉÒÔͬʱָ¶¨µ½compileÀïÈ¥£¬´úÂëÈçÏ£º

compile(
'org.hibernate:hibernate-core:3.6.7.Final',
'org.springframework:spring-context:3.1.4.RELEASE'
)

ÁíÍ⣬µ±ÔÚRespositoryÎÞ·¨ÕÒµ½Jar°üʱ£¨ÈçÊý¾Ý¿âµÄdriver£©£¬¾Í¿ÉÒÔ½«ÕâЩJar°ü·ÅÔÚÏîÄ¿µÄÒ»¸ö×ÓĿ¼ÖУ¬È»ºóÈÃÏîÄ¿¹ÜÀíÒÀÀµ¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔÔÚÏîÄ¿µÄ¸ùĿ¼Ï´´½¨Ò»¸ölibÎļþ¼Ð£¬ÓÃÒÔ´æ·ÅÕâЩJar°ü¡£Ê¹ÓÃÈçÏ´úÂë¿ÉÒÔ½«ÆäÌí¼Óµ½ÏîÄ¿ÒÀÀµÖУº

dependencies {
compile(
'org.hibernate:hibernate-core:3.6.7.Final',
'org.springframework:spring-context:3.1.4.RELEASE',
fileTree(dir: "${rootProject.projectDir}/lib", include: '*.jar')
)
}

4.2 ×ÓÏîĿ֮¼äµÄÒÀÀµ

¶ÔÓÚ¶àÄ£¿éµÄÏîÄ¿£¬ÏîÄ¿ÖеÄijЩģ¿éÐèÒªÒÀÀµÓÚÆäËûÄ£¿é£¬Ç°ÃæÌáµ½ÔÚ³õʼ»¯½×¶Î£¬GradleΪÿ¸öÄ£¿é¶¼´´½¨ÁËÒ»¸öProject¶ÔÏ󣬲¢ÇÒ¿ÉÒÔͨ¹ýÄ£¿éµÄÃû×ÖÒýÓõ½¸Ã¶ÔÏó¡£ÔÚÅäÖÃÄ£¿éÖ®¼äµÄÒÀÀµÊ±£¬Ê¹ÓÃÕâÖÖ·½Ê½¿ÉÒÔ¸æËßGradleµ±Ç°Ä£¿éÒÀÀµÁËÄÄЩ×ÓÄ£¿é¡£ÀýÈ磬ÔÚÎÒÃǵÄÏîÄ¿ÖУ¬cis-war»áÒÀÀµcore×ÓÏîÄ¿£¬¾Í¿ÉÒÔÔÚcis-warµÄ¹¹½¨½Å±¾ÖмÓÉÏÈçÏ´úÂ룺

dependencies {
compile(
'org.hibernate:hibernate-core:3.6.7.Final',
project(':core')
)
}

ͨ¹ýproject(':core')À´ÒýÓÃcore×ÓÏîÄ¿£¬ÔÚ¹¹½¨cis-warʱ£¬Gradle»á°Ñcore¼Óµ½ClassPathÖС£

4.3 ¹¹½¨½Å±¾µÄÒÀÀµ

³ýÁËÏîÄ¿ÐèÒªÒÀÀµÖ®Í⣬¹¹½¨½Å±¾±¾ÉíÒ²¿ÉÒÔÓÐ×Ô¼ºµÄÒÀÀµ¡£µ±Ê¹ÓÃÒ»¸ö·ÇGradle¹Ù·½ÌṩµÄ²å¼þʱ£¬¾ÍÐèÒªÔÚ¹¹½¨½Å±¾ÀïÖ¸¶¨ÆäÒÀÀµ£¬µ±È»»¹ÐèÒªÖ¸¶¨¸Ã²å¼þµÄRepository¡£ÔÚGradleÖУ¬Ê¹ÓÃbuildscript¿éΪ¹¹½¨½Å±¾ÅäÖÃÒÀÀµ¡£

±ÈÈçÔÚÏîÄ¿ÖÐʹÓÃcucumber-JVM×÷ΪÏîÄ¿BDD¹¤¾ß£¬¶øGradle¹Ù·½Ã»ÓÐÌṩËüµÄ²å¼þ£¬ºÃÔÚ¿ªÔ´ÉçÇøÓÐÈËÌṩcucumberµÄ²å¼þ¡£ÔÚ¹¹½¨½Å±¾ÖÐÌí¼ÓÈçÏ´úÂ룺

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "gradle-cucumber-plugin:gradle-cucumber-plugin:0.2"
    }
}
apply plugin: com.excella.gradle.cucumber.CucumberPlugin

5. ÆäËû

5.1 applyÆäËûGradleÎļþ

µ±Ò»¸öÏîÄ¿ºÜ¸´ÔÓµÄʱºò£¬Gradle½Å±¾Ò²»áºÜ¸´ÔÓ£¬³ýÁ˽«×ÓÏîÄ¿µÄÅäÖÃÒÆµ½¶ÔÓ¦ÏîÄ¿µÄ¹¹½¨½Å±¾Ö®Í⣬»¹¿ÉÒÔ¿ÉÒÔ°´ÕÕ²»Í¬µÄ¹¦Äܽ«¸´ÔӵĹ¹½¨½Å±¾²ð·Ö³ÉСµÄ¹¹½¨½Å±¾£¬È»ºóÔÚbuild.gradleÀïʹÓÃapply from£¬½«ÕâЩСµÄ¹¹½¨½Å±¾ÒýÈëµ½ÕûÌåµÄ¹¹½¨½Å±¾ÖÐÈ¥¡£±ÈÈçÔÚÒ»¸öÏîÄ¿ÖмÈʹÓÃÁËJetty£¬ÓÖʹÓÃÁËCargo²å¼þÆô¶¯JBoss£¬¾Í¿ÉÒÔ°ÑËûÃÇ·Ö±ðÌáµ½jetty.gradleºÍjboss.gradle£¬È»ºóÔÚbuild.gradleÀïʹÓÃÈçϵĴúÂ뽫ËûÃÇÒýÈë½øÀ´£º

apply from: "jetty.gradle"
apply from: "jboss.gradle"

5.2 projectµÄĿ¼

Ôڽű¾ÎļþÖУ¬ÐèÒª·ÃÎÊÏîÄ¿Öеĸ÷¼¶Ä¿Â¼½á¹¹¡£GradleΪProject¶ÔÏó¶¨ÒåÁËһЩÊôÐÔÖ¸ÏòÏîÄ¿µÄ¸ùĿ¼£¬·½±ãÔڽű¾ÖÐÒýÓá£

rootDir£ºÔÚ×ÓÏîÄ¿µÄ½Å±¾ÎļþÖпÉÒÔͨ¹ý¸ÃÊôÐÔ·ÃÎʵ½¸ùÏîĿ·¾¶¡£

rootProject£ºÔÚ×ÓÏîÄ¿ÖУ¬¿ÉÒÔͨ¹ý¸ÃÊôÐÔ»ñÈ¡¸¸ÏîÄ¿µÄProject¶ÔÏó¡£

5.3 ʹÓÃWrapperÖ¸¶¨GradleµÄ°æ±¾

ΪÁËͳһÏîÄ¿ÖÐGradleµÄ°æ±¾£¬¿ÉÒÔÔÚ¹¹½¨½Å±¾ÖÐͨ¹ý¶¨ÒåÒ»¸öwrapperµÄTask£¬²¢ÔÚ¸ÃTaskÖÐÖ¸¶¨GradleµÄ°æ±¾ÒÔ¼°´æ·ÅGradleµÄλÖá£

task wrapper(type: Wrapper) {
gradleVersion = '1.0'
archiveBase = 'PROJECT'
archivePath = 'gradle/dists'
}

ÔËÐÐgradle wrapper£¬ ¾Í»áÔÚ¸ùÏîĿĿ¼Ï´´½¨Ò»¸öwrapperµÄÎļþ¼Ð£¬»á°üº¬wrapperµÄJar°üºÍpropertiesÎļþ¡£Ö®ºó¾Í¿ÉÒÔʹÓÃgradlewÀ´ÔËÐÐtask¡£µÚÒ»´ÎʹÓÃgradlewÖ´ÐÐtaskµÄʱºò£¬»áÔÚÏîÄ¿¸ùĿ¼ÏµÄgradle/distsÏÂÏÂÔØÄãÖ¸¶¨µÄGradle°æ±¾ ¡£ÕâÑùÔÚÏîÄ¿¹¹½¨µÄʱºò£¬¾Í»áʹÓøÃĿ¼ÏµÄGradle£¬±£Ö¤Õû¸öÍŶÓʹÓÃÁËÏàͬµÄGradle°æ±¾¡£

5.4 ʹÓÃgradle.propertiesÎļþ

Gradle¹¹½¨½Å±¾»á×Ô¶¯ÕÒͬ¼¶Ä¿Â¼ÏµÄgradle.propertiesÎļþ£¬ÔÚÕâ¸öÎļþÖпÉÒÔ¶¨ÒåһЩproperty£¬ÒÔ¹©¹¹½¨½Å±¾Ê¹Óá£ÀýÈ磬ÎÒÃÇҪʹÓõÄRepositoryÐèÒªÌṩÓû§ÃûºÍÃÜÂ룬¾Í¿ÉÒÔ½«ÆäÅäÖÃÔÚgradle.propertiesÖС£ÕâÑù£¬Ã¿¸öÍŶӳÉÔ±¶¼¿ÉÒÔÐ޸ĸÃÅäÖÃÎļþ£¬È´²»ÓÃÉÏ´«µ½´úÂë¿âÖжÔÍŶӯäËû³ÉÔ±Ôì³ÉÓ°Ïì¡£¿ÉÒÔʹÓÃÈçϵĴúÂ붨Ò壺

username=user
password=password

ÔÚ¹¹½¨½Å±¾ÖÐʹÓÃ"${username} "¾Í¿ÉÒÔ·ÃÎʸÃÎļþÖж¨ÒåµÄÏà¹ØÖµ¡£

ÓÉÓÚÆª·ùÓÐÏÞ£¬±¾ÎÄÖ»ÊÇÎÒÔÚÒ»¸ö´óÐÍJavaÏîÄ¿ÉÏʹÓÃGradleµÄ²¿·Ö¾­Ñ飬²¢Î´º­¸ÇËùÓÐGradleÏà¹ØµÄ֪ʶ£¬°üÀ¨ÈçºÎ±àдGradle²å¼þÒÔ¼°Gradle¶ÔÆäËûÓïÑԵĹ¹½¨£¬¶ÁÕß¿ÉÒÔͨ¹ýÔĶÁGradleµÄ¹Ù·½Îĵµ£¨±ÈÆðÆäËû¿ªÔ´Èí¼þ£¬GradleµÄÁíÒ»ÌØµã¾ÍÊÇÎĵµÏêϸ£©À´Á˽⡣ÁíÍ⣬GradleÊÇ»ùÓÚGroovyµÄ¹¹½¨¹¤¾ß£¬ÔÚʹÓÃGradleµÄʱºòÒ²ÐèÒªÁ˽âºÍʹÓÃGroovy¡£ËùÒÔ£¬ÔÚѧϰGradle²å¼þµÄ¹ý³ÌÖУ¬Ò²ÄÜѧ»áGroovyÏà¹ØµÄÓ÷¨£¬¿Éνһ¾ÙÁ½µÃ¡£

   
3832 ´Îä¯ÀÀ       33
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
ÏîÄ¿¹ÜÀí:MavenÈÃÊÂÇé±äµÃ¼òµ¥
³ÖÐø¼¯³É¹¤¾ßhudson
³ÖÐø¼¯³É
MavenȨÍþÖ¸ÄÏ
³ÌÐò¼¯(UMLÖеİü)Ö®¼äÑ­»·


²úÆ··¢²¼¹ÜÀí
ÅäÖùÜÀí·½·¨¡¢Êµ¼ù¡¢¹¤¾ß
¶à²ã´Î¼¯³ÉÅäÖùÜÀí
ʹÓÃCCÓëCQ½øÐÐÏîĿʵ¼ù
CVSÓëÅäÖùÜÀí
Subversion¹ÜÀíÔ±


º£º½¹É·Ý ÖØ¹¹¼°³ÖÐø¼¯³É
µçÑлªÔ´ Éè¼ÆÔ­Àí¡¢½¨Ä£ÓëÖØ¹¹
Èí¼þÅäÖùÜÀíÈÕ¹¹½¨¼°³ÖÐø¼¯³É
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
ÖйúÈí¼þÑз¢ÖÐÐÄ µ¥Ôª²âÊÔÓëÖØ¹¹
µ¥Ôª²âÊÔ¡¢Öع¹ºÍ³ÖÐø¼¯³Éʵ¼ù
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ+ÖØ¹¹+Gtest