Maven模块化开发

多人协同开发时,特别是规模较大的项目,为方便日后代码维护管理会将每个人的工作细分到具体的功能和模块上。随着项目的不断扩大,模块会越来越多,后续更加难以维护和扩展,为应对这种情况后期会采用微服务的架构的方式进行开发。

商城模块划分范例

  • 统一的依赖管理(dependencies)
  • 通用的工具类(commons)
  • 领域模型(domain)
  • 管理后台(admin)
  • 商城前端(ui)
  • 接口模块(api)

利用Maven的依赖机制,实现模块化开发,使协同开发更简单

创建根项目(工程)

创建一个名为 my-shop 的工程,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.funtl</groupId>
<artifactId>my-shop</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging> <modules> </modules>
</project>

aaarticlea/jpeg;base64,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AADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABghhDaAAAAAAAAAADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABghhDaAAAAAAAAAADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABghhDaAAAAAAAAAADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABghhDaAAAAAAAAAADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABghhDaAAAAAAAAAADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABghhDaAAAAAAAAAADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABghhDaAAAAAAAAAADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABghhDaAAAAAAAAAADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABghhDaAAAAAAAAAADMEEIbAAAAAAAAAIAZQmgDAAAAAAAAADBDCG0AAAAAAAAAAGYIoQ0AAAAAAAAAwAwhtAEAAAAAAAAAmCGENgAAAAAAAAAAM4TQBgAAAAAAAABgdhTF/wfK7JqJnhbhJgAAAABJRU5ErkJggg==" alt="" data-src="https%3A%2F%2Fnote.youdao.com%2Fyws%2Fpublic%2Fresource%2F855f0d021135a40a5523c8dc81729461%2Fxmlnote%2F4560006BAABB4DD6BBF5FCDBBCD014B4%2F12171" data-processed="https%3A%2F%2Fnote.youdao.com%2Fyws%2Fpublic%2Fresource%2F855f0d021135a40a5523c8dc81729461%2Fxmlnote%2F4560006BAABB4DD6BBF5FCDBBCD014B4%2F12171" />该项目称之为 Root 项目,主要作用是管理整个工程的全部模块,当有新模块加入时需要在 modules 元素下配置对应的模块目录

创建统一的依赖

创建一个名为 my-shop-dependencies 的项目,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> <parent>
<groupId>com.funtl</groupId>
<artifactId>my-shop</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent> <artifactId>my-shop-dependencies</artifactId>
<packaging>pom</packaging> <name>my-shop-dependencies</name>
<description></description> <properties>
<!-- 环境配置 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> <!-- 统一的依赖管理 -->
<commons-lang3.version>3.5</commons-lang3.version>
<jstl.version>1.2</jstl.version>
<log4j.version>1.2.17</log4j.version>
<servlet-api.version>3.1.0</servlet-api.version>
<slf4j.version>1.7.25</slf4j.version>
<spring.version>4.3.17.RELEASE</spring.version>
</properties> <dependencyManagement>
<dependencies>
<!-- Spring Begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring End --> <!-- Servlet Begin -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- Servlet End --> <!-- Log Begin -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- Log End --> <!-- Commons Begin -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<!-- Commons End -->
</dependencies>
</dependencyManagement> <build>
<plugins>
<!-- Compiler 插件, 设定 JDK 版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins> <!-- 资源文件配置 -->
<resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project>

PS:别忘记在 my-shop 工程的 pom.xml 中增加 <module>my-shop-dependencies</module>配置

创建通用的工具类

一个创建名为my-shop-commons的项目,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> <parent>
<groupId>com.funtl</groupId>
<artifactId>my-shop-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../my-shop-dependencies/pom.xml</relativePath>
</parent> <artifactId>my-shop-commons</artifactId>
<packaging>jar</packaging> <name>my-shop-commons</name>
<description></description> </project>

PS:忘记别在my-shop工程的pom.xml中增加<module>my-shop-commons</module>配置

创建领域模型

创建一个名为my-shop-domain的项目,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> <parent>
<groupId>com.funtl</groupId>
<artifactId>my-shop-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../my-shop-dependencies/pom.xml</relativePath>
</parent> <artifactId>my-shop-domain</artifactId>
<packaging>jar</packaging> <name>my-shop-domain</name>
<description></description> </project>

PS:别忘记在my-shop工程的pom.xml中增加<module>my-shop-domain</module>配置

创建管理后台

创建一个名为my-shop-web-admin的项目,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> <parent>
<groupId>com.funtl</groupId>
<artifactId>my-shop-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../my-shop-dependencies/pom.xml</relativePath>
</parent> <artifactId>my-shop-web-admin</artifactId>
<packaging>war</packaging> <name>my-shop-web-admin</name>
<description></description> <dependencies>
<dependency>
<groupId>com.funtl</groupId>
<artifactId>my-shop-commons</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>com.funtl</groupId>
<artifactId>my-shop-domain</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies> </project>

PS:别忘记在my-shop工程的pom.xml中增加<module>my-shop-web-admin</module>配置

创建商城前端

创建一个名为my-shop-web-ui的项目,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> <parent>
<groupId>com.funtl</groupId>
<artifactId>my-shop-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../my-shop-dependencies/pom.xml</relativePath>
</parent> <artifactId>my-shop-web-ui</artifactId>
<packaging>war</packaging> <name>my-shop-web-ui</name>
<description></description> <dependencies>
<dependency>
<groupId>com.funtl</groupId>
<artifactId>my-shop-commons</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies> </project>

PS:别忘记在my-shop工程的pom.xml中增加<module>my-shop-web-ui</module>配置

创建接口模块

创建一个名为my-shop-web-api 的项目,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> <parent>
<groupId>com.funtl</groupId>
<artifactId>my-shop-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../my-shop-dependencies/pom.xml</relativePath>
</parent> <artifactId>my-shop-web-api</artifactId>
<packaging>war</packaging> <name>my-shop-web-api</name>
<description></description> <dependencies>
<dependency>
<groupId>com.funtl</groupId>
<artifactId>my-shop-commons</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies> </project>

PS:别忘记在my-shop 工程的 pom.xml中增加 <module>my-shop-web-api</module>配置

http://localhost:8080/user/info?id=1可以看成一个接口,称之为API

Maven模块化开发的更多相关文章

  1. 基于maven的javaweb项目模块化开发

    转自:https://my.oschina.net/kingfire/blog/273381 基于maven的javaweb项目模块化开发 引言 考虑团队拥有多个类似项目的情况,比如一些功能差异不大的 ...

  2. Android模块化开发实践

    一.前言 随着业务的快速发展,现在的互联网App越来越大,为了提高团队开发效率,模块化开发已经成为主流的开发模式.正好最近完成了vivo官网App业务模块化改造的工作,所以本文就对模块化开发模式进行一 ...

  3. 初学seaJs模块化开发,利用grunt打包,减少http请求

    原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...

  4. JS模块化开发:使用SeaJs高效构建页面

    一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...

  5. iOS关于模块化开发解决方案(纯干货)

    关于iOS模块化开发解决方案网上也有一些介绍,但真正落实在在具体的实例却很少看到,计划编写系统文章来介绍关于我对模块化解决方案的理解,里面会有包含到一些关于解耦.路由.封装.私有Pod管理等内容:并编 ...

  6. Angular 结合RequireJs实现模块化开发

    angular的指令是模块化很好的一个体现,下面我将只使用指令(不用控制器),结合requirejs,实现模块化开发. 模块化关系图:

  7. .NET/ASP.NET MVC(模块化开发AraeRegistration)

    阅读目录: 1.开篇介绍 2.AreaRegistration注册路由(传递路由上下文进行模块化注册) 1]开篇介绍 ASP.NET Routing 路由功能非常强大,设计的也很巧妙:如果说ASP.N ...

  8. Mvc 模块化开发

    在Mvc中,标准的模块化开发方式是使用Areas,每一个Area都可以注册自己的路由,使用自己的控件器与视图.但是在具体使用上它有如下两个限制 1.必须把视图文件放到主项目的Areas文件夹下才能生效 ...

  9. 模块化开发--sea.js

    当你的网站开发越来越复杂的时候,会经常遇到一下问题吗?1.冲突2.性能3.依赖如果在多人开发或者是复杂的开发过程中会经常遇到这些问 题,就可以用模块化开发来解决.以上问题是如何产生的?1.冲突:如果你 ...

随机推荐

  1. 报错:Exception in thread "main" java.lang.NoClassDefFoundError: Lorg/apache/hadoop/fs/FileSystem

    报错现象: Exception in thread "main" java.lang.NoClassDefFoundError: Lorg/apache/hadoop/fs/Fil ...

  2. scrapyd和scrapyd-client使用教程

    原文地址:http://blog.wiseturtles.com/posts/scrapyd.html Tags scrapyd scrapy scrapyd-client By crazygit O ...

  3. Google SketchUp Cookbook: (Chapter 2) Following Paths with Follow Me

    软件环境 SketchUp Pro 2018 参考书籍 Google SketchUp Cookbook Follow Me工具 Follow Me工具,将2D图形沿着一条路径挤出生成3D物体. 使用 ...

  4. linux下查看已安装的软件与卸载

    转自:https://blog.csdn.net/qq_22075041/article/details/78855849 因为linux安装软件的方式比较多,所以没有一个通用的办法能查到某些软件是否 ...

  5. 学习MeteoInfo二次开发教程(十一)

    1.新添加状态栏ToolStrip,可能名称为toolStripStatusLabel2 这时需要把TSSL_Coord改为toolStripStatusLabel2 2.SetMapView();语 ...

  6. 地下产链——创建安装包捆绑软件(Bundled software)

    Bundled_Software 首先,因为个人知识不足的情况下,无法进行EXE文件捆绑机的制作说明,所以有需要请转至http://www.cnblogs.com/qintangtao/archive ...

  7. oracle自治事务(PRAGMA AUTONOMOUS_TRANSACTION)

    这段时间遇到一个问题,程序里明明插入了一条记录,但在后边的一段Procedure中却查不到刚刚插入的记录,最后发现这个Procedure的定义中加入了PRAGMA AUTONOMOUS_TRANSAC ...

  8. springboot 问题总结

    一:返回格式化日期 如果我们是用fastjson处理成jsonString,可以通过下面两种方式处理 1,在接受实体上@JSONField(format="yyyy-MM-dd HH:mm: ...

  9. Linux java进程无故被kill

    这两天,演示环境的java应用无端端就被停止了.在这里记录一下原因和排查过程: 发现应用挂掉以后,第一时间登陆centos,发现进程没有了.于是重新启动应用. 但是启动不起来,去看业务日志,没有找到任 ...

  10. 关于全局变量,static,define和const

        其实按照现在主流的观点,应该尽量少用全局变量和define,尽量多用临时变量,并且用const替换值define,用短小精悍的函数替换函数define.     对这些我倒是也没有什么意见,只 ...