參考文檔:gradle的官方userguide.pdf文檔的chapter 55和chapter 56.
gradle的多模塊或項目開發一定不會比maven差,在我看來!大的項目分成多個模塊來開發是常事.下文就介紹一下怎么用gradle開發多模塊項目.對於gradle,在Eclipse和IDEA開者之間,毫無疑問選擇IDEA作為IDE.
testweb是一個簡單例子,項目只分成了core和web兩個模塊.其中core模塊是放一些基本的或公共的java類,web模塊放的是web Controller,配置,頁面.所以最終打包項目時,core應打成一個jar包,而web模塊引用(依賴)core模塊,對於web的java類也打起一個jar包,這兩個jar包最后是放在lib包下面再打成war包.項目的主要結構如下:
testweb
core
src
main
java
test
java
resources
build.gradle
web
src
main
java
resources
test
java
build.gradle
build.gradle
settings.gradle
core主要使用spring+spring data jpa(hibernate實現)+mysql
一.根據上面的項目結構,新建必要的目錄和文件.
1.settings.gradle.只有一個模塊來說,此文件是可選的.對於多模塊,此文件是必須的.
- include 'core','web'
2.這里將core和web模塊的gradle配置也放到了頂層的build.gradle
build.gradle
- allprojects {
- apply plugin: 'java'
- group = 'org.exam'
- version = '1.0'
- sourceCompatibility = 1.8
- targetCompatibility = 1.8
- }
- subprojects {
- ext {
- slf4jVersion = '1.7.7'
- springVersion = '4.2.1.RELEASE'
- hibernateVersion = '4.3.1.Final'
- }
- [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
- repositories {
- mavenCentral()
- }
- configurations {
- //compile.exclude module: 'commons-logging'
- all*.exclude module: 'commons-logging'
- }
- dependencies {
- compile(
- "org.slf4j:jcl-over-slf4j:${slf4jVersion}",
- "org.slf4j:slf4j-log4j12:${slf4jVersion}",
- "org.springframework:spring-context:$springVersion",
- "org.springframework:spring-orm:$springVersion",
- "org.springframework:spring-tx:$springVersion",
- "org.springframework.data:spring-data-jpa:1.5.2.RELEASE",
- "org.hibernate:hibernate-entitymanager:$hibernateVersion",
- "c3p0:c3p0:0.9.1.2",
- "mysql:mysql-connector-java:5.1.26",
- "commons-fileupload:commons-fileupload:1.3.1",
- "com.fasterxml.jackson.core:jackson-databind:2.3.1"
- )
- testCompile(
- "org.springframework:spring-test:$springVersion",
- "junit:junit:4.11"
- )
- }
- }
- project(':core') {
- }
- project(':web') {
- apply plugin: "war"
- dependencies {
- compile project(":core")
- compile(
- "org.springframework:spring-webmvc:$springVersion",
- "org.apache.taglibs:taglibs-standard-impl:1.2.1"
- )
- providedCompile(
- "javax.servlet:javax.servlet-api:3.1.0",
- "javax.servlet.jsp:jsp-api:2.2.1-b03",
- "javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:1.2.1"
- )
- }
- processResources{
- /* 從'$projectDir/src/main/product'目錄下復制文件到'WEB-INF/classes'目錄下覆蓋原有同名文件*/
- from("$projectDir/src/main/product")
- }
- /*自定義任務用於將當前子項目的java類打成jar包,此jar包不包含resources下的文件*/
- def jarArchiveName="${project.name}-${version}.jar"
- task jarWithoutResources(type: Jar) {
- from sourceSets.main.output.classesDir
- archiveName jarArchiveName
- }
- /*重寫war任務:*/
- war {
- dependsOn jarWithoutResources
- /* classpath排除sourceSets.main.output.classesDir目錄,加入jarWithoutResources打出來的jar包 */
- classpath = classpath.minus(files(sourceSets.main.output.classesDir)).plus(files("$buildDir/$libsDirName/$jarArchiveName"))
- }
- /*打印編譯運行類路徑*/
- task jarPath << {
- println configurations.compile.asPath
- }
- }
- /*從子項目拷貝War任務生成的壓縮包到根項目的build/explodedDist目錄*/
- task explodedDist(type: Copy) {
- into "$buildDir/explodedDist"
- subprojects {
- from tasks.withType(War)
- }
- }
此項目包括core和web兩個模塊,其中core為普通java模塊,web為web模塊,並且web依賴core.
a.打包web時,會先將web\src\main\resources下的文件復制到web\build\resources\main目錄,然后復制web\src\main\product下的文件到web\build\resources\main目錄來覆蓋同名文件.
b.編譯web\src\main\java下的java文件到web\build\classes\main目錄,然后將web\build\classes\main的文件打成jar包.
c.將所需依賴,包括core-${version}.jar和web-${version}.jar復制到war包下的\WEB-INF\lib目錄.將web\src\main\product下的文件復制到WEB-INF\classes目錄
二.將項目導入IDEA去開發
三.測試.
1.先測試core模塊.主要參考core\src\test\java\com\exam\repository\UserRepositoryTest.java.
2.再測試web模塊.
a.先用junit測試controller.主要參考web\src\test\java\com\exam\web\UserControllerTest.java,
b.參考<<配置簡單的嵌入式jetty>>測試(可選)
c.打再成war包,部署到tomcat或jetty測試.
源碼:http://download.csdn.net/detail/xiejx618/7736387
http://blog.csdn.net/xiejx618/article/details/38469865