Gradle入门到精通(五)- Gradle工程的拆分与聚合
接上一篇 Gradle入门到精通(四)- IDEA创建JavaSE、JavaWeb工程
这里我们基于MVC思想(web-->service-->dao),做一个简单例子。
1、创建父工程:gradle-parent
与之前创建Gradle工程的步骤一样
1.1 New Project --> 选择Gradle
1.2 输入GroupId、ArtifactId、Version
1.3 配置Gralde本地路径等
1.4 点击 Next
1.5 点击Finish完成。
2、创建子模块:gradle-dao
选中刚才创建的父工程gradle-parent,并且右键,选择 New --> Module
出现如下图:
点击 Next,输入ArtifactId,这里为gradle-dao,
点击 Next,输入模块名,如下图:
最后,点击 Finish,完成。如下图
这里有一个奇怪的问题,添加的子模块gradle-dao没有生成src相关包配置(在第一步中我们已经选择了java)
怎么解决?
我们只需要在gradle-dao这个子模块中的build.gradle文件的末尾添加一个task即可:
//解决gradle项目不会自动生成src及其相关配置的问题
task "create-dirs" {
sourceSets*.java.srcDirs*.each {
it.mkdirs()
}
sourceSets*.resources.srcDirs*.each{
it.mkdirs()
}
}
如下图所示:
因为我们创建工程时选择了自动导入,会自动生成。如果没有可以双击Gradle projects中的create-dirs生成即可。
3、创建子模块:gradle-service
创建步骤与创建子模块gradle-dao一样
4、创建子模块:gradle-web
创建步骤与创建子模块gradle-dao一样;
javase工程转为javaweb工程(与前几篇内容一样):
第一步:添加目录及文件:
src/main/webapp
src/main/webapp/WEB-INF
src/main/webapp/WEB-INF/web.xml
web.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> </web-app>
效果如下图:
第二步:在build.gradle文件添加war支持,如下:
apply plugin: 'war'
如下图:
5、配置模块之间的依赖关系
所有模块需要的jar等都放在父工程中
现在观察父工程gradle-parent下的settings.gradle文件的内容,发现该父工程包含了web、service、dao这三个子模块的信息,如下图所示:
根据上一篇的小例子,我们需要引入spring相关的jar包,这些jar包应该放在哪里?每一个子模块都放吗?显然不合理。
我们把spring相关的jar包放到父工程gradle-parent下面,如下图所示:
这样,其他子模块能直接使用这些内容吗?答案是还不行(这个与maven有区别),还需要把这些内容放到allprojects里面,如下内容:
allprojects {
group 'com.etbird'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.springframework', name: 'spring-context', version: '5.0.2.RELEASE'
compile group: 'org.springframework', name: 'spring-web', version: '5.0.2.RELEASE'
compile group: 'org.springframework', name: 'spring-webmvc', version: '5.0.2.RELEASE'
//注意以下两行需要在web工程中,并且provided作用域改为providedCompile
provided group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
provided group: 'javax.servlet', name: 'jsp-api', version: '2.0'
}
}
此时,allprojects里面的所有内容,子模块都能使用。
如下图所示:
接下来,我们就可以修改子模块的内容,
gradle-dao、gradle-service子模块的build.gradle的内容都去掉;
gradle-web子模块的内容只保留以下内容:
apply plugin: 'war'
其余删掉,因为都从父工程继承而来。
最后,我们子模块有以下依赖关系:gradle-web依赖gradle-service,gradle-service依赖gradle-dao,这些子模块依赖关系如何配置呢?
我们打开gradle-service的build.gradle文件,内容如下:
dependencies {
compile project(":gradle-dao")
}
其中,gradle-dao就是模块名。
如下图:
同理,打开gradle-web的build.gradle文件,内容如下:
apply plugin: 'war'
dependencies {
compile project(":gradle-service")
}
如下图:
6、小例子
开发dao层(gradle-dao模块)
UserDao.java
package com.etbird.dao; public interface UserDao { public String save(); }
UserDaoImpl.java
package com.etbird.dao.impl; import com.etbird.dao.UserDao; import org.springframework.stereotype.Repository; @Repository public class UserDaoImpl implements UserDao { @Override public String save() { return "save..ok.."; } }
build.gradle内容为空
开发service层(gradle-service模块)
UserService.java
package com.etbird.service; public interface UserService { public String save(); }
UserServiceImpl.java
package com.etbird.service.impl; import com.etbird.dao.UserDao; import com.etbird.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public String save() { return userDao.save(); } }
build.gradle
dependencies { compile project(":gradle-dao") }
开发web层(gradle-web模块)
UserController.java
package com.etbird.controller; import com.etbird.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping("/save") public String save(Model model){ model.addAttribute("msg", userService.save()); return "ok"; } }
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/sping-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置组件扫描--> <context:component-scan base-package="com.etbird.*"/> <!--处理器映射器、处理器解析器--> <mvc:annotation-driven/> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> <!--释放静态资源--> <mvc:default-servlet-handler/> </beans>
ok.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${ msg } </body> </html>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!--配置springmvc核心servlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>index</title> </head> <body> index... </body> </html>
build.gradle
apply plugin: 'war' dependencies { providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' providedCompile group: 'javax.servlet', name: 'jsp-api', version: '2.0' compile project(":gradle-service") }
部署到本地tomcat
浏览器地址栏访问地址:http://localhost:8080/user/save
效果如下:
至此,这个Gradle从入门到精通小系列就结束了,还有许多小问题需要完善~~
期待下一个Gradle系列~~