文档章节

基于多个maven module搭建的Spring boot web项目

尾生
 尾生
发布于 2016/12/07 12:23
字数 2343
阅读 1477
收藏 7

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做了一遍,结果顺利成功了!

也许是第一次研究的时候,并没有理清头绪,正所谓「一通百通」,其他类似的方法也能触类旁通了。

 

 

本篇已获源作者独家转载,转贴请注意保留原著

本文转载自:http://note.youdao.com/noteshare?id=589999e5dbc54b99e2f2214f7863fde8

共有 人打赏支持
尾生
粉丝 15
博文 138
码字总数 54708
作品 0
杭州
程序员
加载中

评论(2)

20170302
20170302
使用阿里云镜像,下载飞快。配置maven setting
vvtf
vvtf
可以使用阿里云的maven镜像. http://maven.aliyun.com/
基于Spring Boot的登录demo

原文首发于我的博客 本项目基于Spring Boot框架,搭建了一个简单的登录微服务。 Spring Boot相对于传统的SSM(Spring MVC + Mybatis + Spring)框架用起来更加简单,不需要进行复杂的配置,方便...

tikyle
05/14
0
0
SpringBoot 学习:(一)快速搭建项目

一、简介 从 Spring Boot 项目名称中的 Boot 可以看出来,Spring Boot 的作用在于创建和启动新的基于 Spring 框架的项目。它的目的是帮助开发人员很容易的创建出独立运行和产品级别的基于 Sp...

Element0506
2015/07/25
0
0
聊聊Spring boot2.X开发环境搭建和基本开发

对Spring Boot的开发环境进行搭建,并对它的特点做进一步的了解,才能更好地对Spring Boot有更深入的介绍。但是无论如何都需要先来搭建Spring Boot的工程。 搭建Spring Boot开发环境 使用Spr...

异步社区
08/06
0
0
spring boot与spring mvc的区别是什么?

spring boot与spring mvc的区别是什么? 转载:https://blog.csdn.net/u014590757/article/details/79602309 spring boot只是一个配置工具,整合工具,辅助工具. springmvc是框架,项目中实际运...

Elsa晓冰
09/29
0
0
给spring-boot测试提供unitils支持的开源项目

一、unitils测试框架优缺点介绍 在unitils的支持下,xml配置的spring项目在测试时,有如下好处: 1、利用注解@DataSet、@ExpectedDataSet来准备数据和校验结果数据,每次运行测试用例不用重新...

yangjianzhou
07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
10
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
3
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
20
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部