[技术] 用 Maven 搭建多项目 Project

在平时的Java web项目开发中为了便于后期的维护,我们一般会进行分模块开发,每个模块都对应着一个pom.xml。它们之间通过继承和聚合相互关联。这样各层之间的职责会比较明确,也方便后期的维护。

今天我们是使用 Maven 来构建以上的各个层。

文字内容只涉及工程搭建的基本流程,请主要参照文章末尾的源代码。

项目目录:
mavenweb-parent
  |----pom.xml
mavenweb-service
  |----pom.xml
mavenweb-web
  |----pom.xml

创建主模块:mavenweb-parent

  • 在 Eclipse 中新建工程:
    New -> Other -> Maven Project -> 填写配置信息 -> Finish
Mavenweb Parent New Proj.png
  • 在 Eclipse 中,设置 目标JDK 版本:
    在工程中,点击右键 -> Build Path -> Configure Build Path -> Java Build Path -> 在 Libraries 选项卡中选择 JDK1.7 或以上版本
Mavenweb Parent JDK Setting.png
  • 在硬盘上,删除 src 文件夹;并在 Eclpse 中刷新该工程。


    Mavenweb Parent Delete Folders.png
  • 设置 pom 文件:
    务必设置 packaging 为 pom

<project ...>
    ...
    <packaging>pom</packaging>
    
    <properties>
        <springversion>3.1.1.RELEASE</springversion>
        <junitversion>4.10</junitversion>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <!-- junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junitversion}</version>
                <scope>test</scope>
            </dependency>
            ...         
    </dependencyManagement>
</project>

创建子模块:mavenweb-server

  • 使用类似的方式创建 maven 工程
  • 修改 pom:
    设置 packaging 为 jar,并添加 parent 与 dependencies 节点。
<project>
    ...
    <packaging>jar</packaging>
    
    <parent>
        ...
        <relativePath>../mavenweb-parent/pom.xml</relativePath>
    </parent>
    ...
</project>
  • 添加 spring 配置
    设置 component-scan 以便令代码中注解能被读取与解析,并使用 propertyConfigurer 读取配置文件。
<beans>
    <!-- 扫描包 -->
    <context:component-scan base-package="com.stevexie" />
    
    <bean id="propertyConfigurer" >
        <property name="location">
            <value>file:/.../configInfo.properties</value>
        </property>
    </bean>
    
    <!-- 这个包负责读取配置文件信息 -->
    <!-- 若使用注解初始化这个类,编译后的 jar 包无法正确地读取配置,原因未知 -->
    <!-- 所以仅这个类实例需要在 xml 中定义 -->
    <bean id="configInfo" class="com.stevexie.util.ConfigInfo">
        <property name="name" value="${prop.name}"></property>
    </bean>
</beans>

创建子模块:mavenweb-client

  • 首先,同样使用类似的方式创建 maven 工程,但与 Server 工程相比多了以下几部
  • 转换项目类型
    项目右键 -> properties -> Project Facets -> 勾选 Dynamic Web Module 和 Java -> OK
Mavenweb Client Proj Facets Setting.png
  • 修正编译设置与输出目录
    项目右键 -> properties -> Deployment Assembly,如下图设置:


    Mavenweb Client Deployment Assembly Setting.png
  • 设置 JDK 1.8

  • 设置 web.xml
    因为我们的 url 会使用 restful 风格,所以需要改变两个文件:1) 在web.xml中,修改 servlet-mapping;2) 在client-spring-mvc.xml中,添加 <mvc:default-servlet-handler />

web.xml:

<web-app >
...
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <!-- 使用 resful 风格的 url 前 -->
    <!-- <url-pattern>/</url-pattern> -->
    <!-- 使用 resful 风格的 url 后 -->
    <url-pattern>/login</url-pattern>
</servlet-mapping>
...
</web-app>

client-spring-mvc.xml:

<beans ">
    ...
    <mvc:default-servlet-handler />
    <!-- Enables the Spring MVC @Controller programming model -->
    <mvc:annotation-driven />
    ...
</beans>

项目 mavenweb-client 中的表单验证:

  • pom.xml 中添加 hibernate-validator.jar
<!-- spring mvc validator -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>4.3.1.Final</version>
   </dependency>
  • 在 UserVo.java 中添加验证条件
@NotEmpty(message = "用户名不能为空")
private String name;
    
@Size(min=6 ,max= 20 ,message = "密码长度不符合标准")
private String pwd;
  • 修正 Controller
public class UserController {
    @RequestMapping(value="/login", method = {RequestMethod.GET})
    public String test(Model model) {
        if(!model.containsAttribute("userVo")){
            model.addAttribute("userVo", new UserVo());
        }
        return "login";
    }
    
    @RequestMapping(value="/login", method = {RequestMethod.POST})
    public ModelAndView test(ModelMap model, @Valid @ModelAttribute("userVo") UserVo userVo, BindingResult result) 
            throws NoSuchAlgorithmException {
        MsgVo msgVo = new MsgVo();
        msgVo.setMsg("Hi " + userVo.getName() + ", " + helloService.sayHello());
        
        if (result.hasErrors()) {
            return new ModelAndView("/login", null);
        }
        model.addAttribute("msgVo", msgVo);
        
        return new ModelAndView("/login_success", model);
    }
} 

再次配置 mavenweb-parent 项目

在 pom 文件中,添加两个子模块:

<modules>
    <module>../mavenweb-client</module>
    <module>../mavenweb-server</module>
</modules>

至此,工程基本设置完毕了。

编译

使用命令行:

cd ../mavenweb-proj/
mvn clean install -DskipTests=true

运行

可以使用命令把 war 包发布到 tomcat 中,并启动 tomcat 服务;或直接在 Eclipse 中运行。
为节省篇幅,这里只介绍后者;命令行的启动则会放到下一篇博文中讨论,

在 Eclipse 中运行:

  • 编译后,刷新 Eclipse 工程
  • 右键点击工程 -> Run as -> Run on Server -> 选择 Tomcat 9.0(注意 Tomcat 与 JDK 的兼容性问题)
  • 浏览器中输入:http://localhost:8080/mavenweb-client/
Login.png
Login Validation.png
Login Success.png

完整源码下载:

请移步到百度网盘下载源码,并导入到 Eclipse 中。下载地址:
https://pan.baidu.com/s/1pLo0Ynx

下一篇预告

在本文基础上,添加并完善一些 web 项目的基本功能,包括:

  • 完善 Login 页面,添加 css 与 js 事件。
  • 添加日志功能及 hibernate 模块。

P.S. 如有介绍不准确之处或者在运行源代码遇到问题,请在请留下您评论留言。您的鼓励永远是我前进的动力。

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容