基于多个maven module搭建的Spring boot web项目
2017-01-16 13:02
1301 查看
摘要: Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention over configuration and is designed to get you up and running as quickly as possible.
1、为什么是多个 maven module?
这个问题可以拆成两部分,为什么是多个和为什么是maven module。
多个是因为实际开发过程中,绝大多数的企业级项目都是存在多个功能模块的;
用maven module是因为一开始想用多个maven project,结果几经折腾,没有运行成功。后来是看了别人的demo,用的是多个maven module,按照此法,成功了。或许我要把运行成功的maven module里的代码拷回到当初搭建的maven project中试试。
2、项目结构是怎么样的?
maven module不能独立于maven project存在,因此需要有一个parent project来承载下面所有的module。看到这个结构,有人不禁要吐槽了,这个跟单工程有啥分别,反而不利于协同开发了。
莫慌,在IDE(我用的是myeclipse)里,最终呈现的视图如下:
这样看起来就比较亲切了,每个module可以分开来单独开发。
再补充一点,如果是web开发,应该会需要一个web项目,如上图的machine-web,作为站点的入口,依赖其他的module。
3、Spring boot运行环境要求有哪些?
maven 3.x(Gradle 2.3+) + JDK 1.7 + Tomcat 7.x
Spring boot默认用的是JDK1.6,但是个人推荐maven 3.x + JDK 1.8 + Tomcat 8.x。
4、Spring boot要怎么配置?
这一步是非常关键,也是我踩坑最多的地方。
起初想到的只要按照spring boot 官网的tutorial步骤来做,应该就没问题的。
然并卵。
最直接的原因是我想基于spring boot,将项目以war包的形式发布,而spring boot推崇的是fat jar(富jar,不依赖任何Servlet运行容器,独立运行部署),虽然spring boot也想到了开发中有打war包的需求,但是还是要费一些周折的。下面重点介绍如何打出一个war包(Hello World的示例工程就不讲了):
以我给的项目结构截图为例,先不考虑与mybatis,hibernate等第三方组件的结合,这就意味着,如果想基于spring boot开发web站点,我给出的是最小的maven依赖集合。
创建一个maven项目,命名为:machine-parent,这个是所有module的父工程,只有一个pom.xml,打包方式设置成pom,即:
完整的pom.xml如下:
接下来就是在parent项目下面创建若干个maven module。
5、科普以下怎么创建maven module呗?!
右键一个maven project-->New-->others(如果菜单有maven module就跳过这步)-->maven module。
后续的操作类似于maven project的创建,这里放几张截图:
6、然后呢???
接下来的重点转移到machine-web上来。细心的童鞋看到machine-parent有一行注释:
如果使用Servlet3.0以下版本,需要此jar
在web项目中,web.xml当属一个非常重要的配置文件之一,可以通过在头部指定用哪个版本的Servlet,我发现公司大多数用的是V2.5,顺带给出2.5和3.0版的XML头部声明:
web.xml v2.5
web.xml v3.0
</web-app>
官方推荐3.0版,这样就不需要额外的配置了。
web.xml配置好后,在machine-web的pom.xml文件里添加其他业务module的依赖。
7、接下来呢?怎么运行?
别急,同学。配置还没完呢!!
一般,我会把共用的配置文件(properties,xml,yml等)放在web项目的src/main/resources目录下。spring boot需要一个叫做application.properties的配置文件,而且它只认这个,这充分体现了javaconfig的一个理念:约定由于配置。
这个文件里头的配置项倒是挺多的,我列举几个常用的:
接下来的一步是spring boot的特殊之处——main method entrance(main方法入口).
这也就是能解释为什么一个jar就能启动一个站点了,一切的入口都是这个main方法。
那么要将此main方法写在哪里呢?官方给出了 best practice,如下图所示:
也就是放在一级包目录下,切忌放在(default package)下面,即没有包名的那种情况。
但是,我想来想去,在多个maven module的情况下,好像这个入口只能放在web所在的module下面,放在其他的业务模块下并不太合适,于是就有了如下的结构:
MachineApplication里面的内容很简单:
当然,以上是为了打war包才会这样写,实际上,如果只需要jar包,这里面的内容就更简单了:
到此,你可以放心大胆的run as一下这个main方法了,如果没有报错,那么恭喜你,你有80%的成功率了!
8、卧槽!~还有完没完呐?!~
快了……
一旦运行起来,总得有东西显示你已经搭建成功了吧!我们可以在任意一个module里面写一个controller,用来测试。比如,在machine-common里面有如下代码:
好了,我们终于可以运行一把了,爆发你的洪荒之力吧!
9、求德玛得!!~怎么部署??
如果有开发经验的童鞋,可以直接跳过。
部署流程简单说一下,和普通的web工程部署没有区别,以部署到tomcat为例:
接下来,你会在console看到一大堆的log...
blablablabla.....
几条关键的log注意一下:
打开浏览器,如果能访问到上述写好的controller,说明就搭建成功啦!
接下来的事情就简单了,如果想生成一个war包部署到服务器上的tomcat,只需要使用maven的package命令即可。
至此,项目的搭建算是告一段落了,
写在最后:
不可否认,maven是个好东西,但是通过研究spring boot的过程,我发现了一件令人吐血的问题——下载jar包。
简直是不要太慢!!!
我一般都是通宵挂机,下载jar包。有的时候,第二天早上发现还是卡在那里,心里千万头草泥马奔腾而过呀!所以,请童鞋们务必拿出你们对技术的十分耐心和热情来对待!
推广一下以下订阅号:「技术汇」,每日为你呈上热腾腾的技术干货。
2016.12.07更新
第二天试了一下,使用以上的思路,用多个maven project做了一遍,结果顺利成功了!
也许是第一次研究的时候,并没有理清头绪,正所谓「一通百通」,其他类似的方法也能触类旁通了。
本篇已获源作者独家转载,转贴请注意保留原著
1、为什么是多个 maven module?
这个问题可以拆成两部分,为什么是多个和为什么是maven module。
多个是因为实际开发过程中,绝大多数的企业级项目都是存在多个功能模块的;
用maven module是因为一开始想用多个maven project,结果几经折腾,没有运行成功。后来是看了别人的demo,用的是多个maven module,按照此法,成功了。或许我要把运行成功的maven module里的代码拷回到当初搭建的maven project中试试。
2、项目结构是怎么样的?
maven module不能独立于maven project存在,因此需要有一个parent project来承载下面所有的module。看到这个结构,有人不禁要吐槽了,这个跟单工程有啥分别,反而不利于协同开发了。
莫慌,在IDE(我用的是myeclipse)里,最终呈现的视图如下:
这样看起来就比较亲切了,每个module可以分开来单独开发。
再补充一点,如果是web开发,应该会需要一个web项目,如上图的machine-web,作为站点的入口,依赖其他的module。
3、Spring boot运行环境要求有哪些?
maven 3.x(Gradle 2.3+) + JDK 1.7 + Tomcat 7.x
Spring boot默认用的是JDK1.6,但是个人推荐maven 3.x + JDK 1.8 + Tomcat 8.x。
4、Spring boot要怎么配置?
这一步是非常关键,也是我踩坑最多的地方。
起初想到的只要按照spring boot 官网的tutorial步骤来做,应该就没问题的。
然并卵。
最直接的原因是我想基于spring boot,将项目以war包的形式发布,而spring boot推崇的是fat jar(富jar,不依赖任何Servlet运行容器,独立运行部署),虽然spring boot也想到了开发中有打war包的需求,但是还是要费一些周折的。下面重点介绍如何打出一个war包(Hello World的示例工程就不讲了):
以我给的项目结构截图为例,先不考虑与mybatis,hibernate等第三方组件的结合,这就意味着,如果想基于spring boot开发web站点,我给出的是最小的maven依赖集合。
创建一个maven项目,命名为:machine-parent,这个是所有module的父工程,只有一个pom.xml,打包方式设置成pom,即:
完整的pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tsou.machine</groupId> <artifactId>machine-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>machine-parent</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.2.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!--申明依赖关系 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 移除内嵌的tomcat运行容器 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- @Configuration注解建议引入 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!-- 将内嵌的tomcat容器标记为provided(来自官网) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- 如果使用Servlet3.0以下版本,需要此jar --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-legacy</artifactId> <version>1.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!-- servlet 依赖. --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> </dependencies> <build> <defaultGoal>package</defaultGoal> <resources> <!-- 导入的资源文件,该目录下的文件会copy到classpath根目录下 --> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/java</directory> <includes> <include>*.properties</include> <include>*.xml</include> <include>*.dtd</include> <include>*.yml</include> </includes> <filtering>false</filtering> </resource> </resources> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
接下来就是在parent项目下面创建若干个maven module。
5、科普以下怎么创建maven module呗?!
右键一个maven project-->New-->others(如果菜单有maven module就跳过这步)-->maven module。
后续的操作类似于maven project的创建,这里放几张截图:
6、然后呢???
接下来的重点转移到machine-web上来。细心的童鞋看到machine-parent有一行注释:
如果使用Servlet3.0以下版本,需要此jar
在web项目中,web.xml当属一个非常重要的配置文件之一,可以通过在头部指定用哪个版本的Servlet,我发现公司大多数用的是V2.5,顺带给出2.5和3.0版的XML头部声明:
web.xml v2.5
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> </web-app>
web.xml v3.0
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
</web-app>
官方推荐3.0版,这样就不需要额外的配置了。
web.xml配置好后,在machine-web的pom.xml文件里添加其他业务module的依赖。
7、接下来呢?怎么运行?
别急,同学。配置还没完呢!!
一般,我会把共用的配置文件(properties,xml,yml等)放在web项目的src/main/resources目录下。spring boot需要一个叫做application.properties的配置文件,而且它只认这个,这充分体现了javaconfig的一个理念:约定由于配置。
这个文件里头的配置项倒是挺多的,我列举几个常用的:
spring.profiles.active=dev //后文详谈 server.port=8100 //启动内嵌tomcat,设置其端口号 server.contextPath=/machine //项目在tomcat中的contextPath spring.mvc.view.prefix=/view/ //spring mvc返回视图的前缀 spring.mvc.view.suffix=.jsp //spring mvc返回视图的后缀 logging.path=/var/logs //日志文件目录 logging.file=myapp.log //日志文件名 //以下是jdbc,jpa(hibernate),mybatis的常见配置,就不一一说明了 spring.datasource.name=basehome spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://127.0.0.1:3306/basehome spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.minIdle=1 spring.datasource.maxActive=20 spring.datasource.initialSize=1 spring.datasource.timeBetweenEvictionRunsMillis=3000 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 'TEST' FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false spring.jpa.hibernate.ddl-auto=none spring.jpa.generate-ddl=true spring.jpa.properties.hibernate.show_sql=true spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect mybatis.mapperLocations=classpath*:mapper/*.xml
接下来的一步是spring boot的特殊之处——main method entrance(main方法入口).
这也就是能解释为什么一个jar就能启动一个站点了,一切的入口都是这个main方法。
那么要将此main方法写在哪里呢?官方给出了 best practice,如下图所示:
也就是放在一级包目录下,切忌放在(default package)下面,即没有包名的那种情况。
但是,我想来想去,在多个maven module的情况下,好像这个入口只能放在web所在的module下面,放在其他的业务模块下并不太合适,于是就有了如下的结构:
MachineApplication里面的内容很简单:
import org.springframework.boot.Banner; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.support.SpringBootServletInitializer; import com.tsou.machine.common.config.DevelopmentConfigs; //扫描注解,不配置默认扫描启动类的classpath @SpringBootApplication(scanBasePackages={"com.tsou.machine"}) //注入属性配置,下文详解 @EnableConfigurationProperties(value={DevelopmentConfigs.class}) public class MachineApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return configureApplication(builder); } public static void main(String[] args) { configureApplication(new SpringApplicationBuilder()).run(args); } private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) { return builder.sources(MachineApplication.class).bannerMode(Banner.Mode.OFF); } }
当然,以上是为了打war包才会这样写,实际上,如果只需要jar包,这里面的内容就更简单了:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import com.tsou.machine.common.config.DevelopmentConfigs; //扫描注解,不配置默认扫描启动类的classpath @SpringBootApplication(scanBasePackages={"com.tsou.machine"}) //注入属性配置,下文详解 @EnableConfigurationProperties(value={DevelopmentConfigs.class}) public class MachineApplication { public static void main(String[] args) { SpringApplication.run(MachineApplication.class, args); } }
到此,你可以放心大胆的run as一下这个main方法了,如果没有报错,那么恭喜你,你有80%的成功率了!
8、卧槽!~还有完没完呐?!~
快了……
一旦运行起来,总得有东西显示你已经搭建成功了吧!我们可以在任意一个module里面写一个controller,用来测试。比如,在machine-common里面有如下代码:
好了,我们终于可以运行一把了,爆发你的洪荒之力吧!
9、求德玛得!!~怎么部署??
如果有开发经验的童鞋,可以直接跳过。
部署流程简单说一下,和普通的web工程部署没有区别,以部署到tomcat为例:
接下来,你会在console看到一大堆的log...
blablablabla.....
几条关键的log注意一下:
打开浏览器,如果能访问到上述写好的controller,说明就搭建成功啦!
接下来的事情就简单了,如果想生成一个war包部署到服务器上的tomcat,只需要使用maven的package命令即可。
至此,项目的搭建算是告一段落了,
写在最后:
不可否认,maven是个好东西,但是通过研究spring boot的过程,我发现了一件令人吐血的问题——下载jar包。
简直是不要太慢!!!
我一般都是通宵挂机,下载jar包。有的时候,第二天早上发现还是卡在那里,心里千万头草泥马奔腾而过呀!所以,请童鞋们务必拿出你们对技术的十分耐心和热情来对待!
推广一下以下订阅号:「技术汇」,每日为你呈上热腾腾的技术干货。
2016.12.07更新
第二天试了一下,使用以上的思路,用多个maven project做了一遍,结果顺利成功了!
也许是第一次研究的时候,并没有理清头绪,正所谓「一通百通」,其他类似的方法也能触类旁通了。
本篇已获源作者独家转载,转贴请注意保留原著
相关文章推荐
- 快速搭建基于Maven的通用Web项目(Spring-Mybatis-JSF-Jersey-Boostrap)
- 基于Maven的Springboot项目搭建学习笔记
- java 搭建基于springboot的ssm(spring + springmvc + mybatis)的maven项目
- idea+maven+springboot搭建web简单项目经历小计(RestController)
- IDEA搭建SpringBoot+Maven+Mybatis+MySQL-Web项目流程
- IDEA web项目搭建(基于spring+maven);tomcat引入
- java 搭建基于springboot的ssm(spring + springmvc + mybatis)的maven项目
- 搭建基于springmvc+freemarker+maven的web项目
- 搭建基于SpringMVC+MyBatis+Maven的web项目
- 基于Maven项目,搭建Spring+SpringMVC+MyBatis的WEB项目(待更新)
- java搭建基于springboot的ssm(spring + springmvc + mybatis)的maven项目
- java 搭建基于springboot的ssm(spring + springmvc + mybatis)的maven项目
- IDEA上面搭建一个SpringBoot的web-mvc项目
- 从零开始搭建maven+springmvc+mybatis web项目(2)---springmvc配置文件编写
- 基于maven+dubbo+spring+zookeeper的简单项目搭建
- 基于spring-mvc模式下的maven-web项目的环境配置
- 基于SpringBoot + Mybatis实现SpringMVC Web项目
- Spring Boot 用maven搭建RESTful项目
- 基于maven的spring boot项目 部署到tomcat出现js文件失效处理思路总结
- 手把手带你搭建 SpringMVC + Zookeeper +Dubbo(一)【Maven 创建 Web项目】