(1)Maven 模塊化開發
在多人協同開發時,特別是規模較大的項目,為了方便日后的代碼維護和管理,我們會將每個開發人員的工作細分到具體的功能和模塊上。隨着項目的不斷擴大,模塊也會越來越多,后續會更加難以維護和擴展,為了應對這種情況可以采用微服務架構的方式進行開發。
以商城為例,我們可以將模塊划分為如下形式:
- 統一的依賴管理(dependencies)
- 通用的工具類(commons)
- 領域模型(domain)
- 管理后台(admin)
- 商城前端(ui)
- 接口模塊(api)
整個模塊化開發過程主要是在開發思想上稍作了一些轉變,只需要按照下面的流程操作即可。
創建根項目(工程)
把之前的my-shop項目修改成my-shop-bak,然后重新創建一個名 my-shop 的工程(在e盤某個目錄下創建一個叫my-shop的文件夾,在IDEA打開該文件夾),現在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.xue</groupId> <artifactId>my-shop</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> </modules> </project>
該項目稱之為 Root 項目,主要作用是管理整個工程的全部模塊,當有新模塊加入時需要在 modules 元素下配置對應的模塊目錄
創建統一的依賴管理
在my-shop工程下創建一個名為 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> <!--父類是my-shop工程,之后的項目都依賴當前項目(之后創建的項目都繼承當前的項目) --> <parent> <groupId>com.xue</groupId> <artifactId>my-shop</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <!--當前項目繼承工程的所有屬性和行為,這里繼承artifactId、packaging--> <artifactId>my-shop-dependencies</artifactId> <packaging>pom</packaging> <name>my-shop-dependencies</name> <description></description> <properties> <!-- 環境配置的統一管理,告訴Maven 源碼、報告及jdk版本指定為utf-8的 --> <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是構建,編譯打包時想干嘛--> <build> <!--plugins是插件,編譯時想用插件來完成想做的事情--> <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> <!--配置src/main/java目錄下的--> <directory>src/main/java</directory> <!--排除以java結尾的文件--> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> <!--配置src/main/resources目錄下的資源文件--> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> </project>
PS:別忘記在 my-shop 工程的 pom.xml 中增加 <module>my-shop-dependencies</module> 配置
<!--項目/模塊--> <modules> <module>my-shop-dependencies</module> </modules>
創建通用的工具類
在my-shop工程下創建一個名為 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> <!--父類是my-shop-dependencies項目 --> <parent> <groupId>com.xue</groupId> <artifactId>my-shop-dependencies</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../my-shop-dependencies/pom.xml</relativePath> </parent> <!--當前項目繼承my-shop-dependencies項目的所有屬性和行為,這里packaging是一個jar包,因為當前項目是一個類庫--> <artifactId>my-shop-commons</artifactId> <packaging>jar</packaging> <name>my-shop-commons</name> <description></description> <dependencies> <!--當前項目只需要依賴commons-lang3,這里不需要版本號了,因為父項目已經幫管理版本號了--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <!--日志依賴,這里不需要版本號了,因為父項目已經幫管理版本號了--> <!-- Log Begin --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> <!-- Log End --> </dependencies> </dependencies> </project>
PS:別忘記在 my-shop 工程的 pom.xml 中增加 <module>my-shop-commons</module> 配置
<!--項目/模塊--> <modules> <module>my-shop-dependencies</module> <module>my-shop-commons</module> </modules>
創建領域模型
在my-shop工程下創建一個名為 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> <!--父類是my-shop-dependencies項目 --> <parent> <groupId>com.xue</groupId> <artifactId>my-shop-dependencies</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../my-shop-dependencies/pom.xml</relativePath> </parent> <!--當前項目繼承my-shop-dependencies項目的所有屬性和行為,這里packaging是一個jar包,因為當前項目是一個類庫--> <artifactId>my-shop-domain</artifactId> <packaging>jar</packaging> <name>my-shop-domain</name> <description></description> </project>
PS:別忘記在 my-shop 工程的 pom.xml 中增加 <module>my-shop-web-admin</module> 配置
<!--項目/模塊--> <modules> <module>my-shop-dependencies</module> <module>my-shop-commons</module> <module>my-shop-domain</module> </modules>
創建管理后台
在my-shop工程下創建一個名為 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> <!--父類是my-shop-dependencies項目 --> <parent> <groupId>com.xue</groupId> <artifactId>my-shop-dependencies</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../my-shop-dependencies/pom.xml</relativePath> </parent> <!--當前項目繼承my-shop-dependencies項目的所有屬性和行為,這里packaging是一個war包--> <artifactId>my-shop-web-admin</artifactId> <packaging>war</packaging> <name>my-shop-web-admin</name> <description></description> <dependencies> <!--因為后台會有實體類,所以要依賴領域模型(my-shop-domain)--> <dependency> <groupId>com.xue</groupId> <artifactId>my-shop-domain</artifactId> <!--引用項目父類的版本號--> <version>${project.parent.version}</version> </dependency> <!--依賴工具類--> <dependency> <groupId>com.xue</groupId> <artifactId>my-shop-commons</artifactId> <version>${project.parent.version}</version> </dependency> <!--依賴spring,不需要版本號了,因為工程的pom已經統一管理版本號了--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <!--依賴Spring MVC,不需要版本號了,因為工程的pom已經統一管理版本號了--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <!--Servlet 的依賴 Begin--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!--Servlet End--> </dependencies> </project>
PS:別忘記在 my-shop 工程的 pom.xml 中增加 <module>my-shop-web-admin</module> 配置
<!--項目/模塊--> <modules> <!--統一依賴管理的項目--> <module>my-shop-dependencies</module> <!--通用的工具類的項目--> <module>my-shop-commons</module> <!--領域模型(實體類)的項目--> <module>my-shop-domain</module> <!--管理后台的項目--> <module>my-shop-web-admin</module> </modules>
注意
由於我們用的快照版,當工程或者某個項目的某個版本號更改了,這時候我們需要總是更新快照版,修改setting的maven
創建商城前端
在my-shop工程下創建一個名為 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> <!--父類是my-shop-dependencies項目 --> <parent> <groupId>com.xue</groupId> <artifactId>my-shop-dependencies</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../my-shop-dependencies/pom.xml</relativePath> </parent> <!--當前項目繼承my-shop-dependencies項目的所有屬性和行為,這里packaging是一個war包--> <artifactId>my-shop-web-ui</artifactId> <packaging>war</packaging> <name>my-shop-web-ui</name> <description></description> <!--可能會依賴工具類--> <dependencies> <dependency> <groupId>com.xue</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> 配置
<!--項目/模塊--> <modules> <!--統一依賴管理的項目--> <module>my-shop-dependencies</module> <!--通用的工具類的項目--> <module>my-shop-commons</module> <!--領域模型(實體類)的項目--> <module>my-shop-domain</module> <!--管理后台的項目--> <module>my-shop-web-admin</module> <!--管理前台的項目--> <module>my-shop-web-ui</module> </modules>
創建接口模塊
在my-shop工程下創建一個名為 my-shop-web-api 的項目,用於存放用到的應用程序接口及api的,並不是我們創建的interface,在其項目下創建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> <!--父類是my-shop-dependencies項目 --> <parent> <groupId>com.xue</groupId> <artifactId>my-shop-dependencies</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../my-shop-dependencies/pom.xml</relativePath> </parent> <!--當前項目繼承my-shop-dependencies項目的所有屬性和行為,這里packaging是一個war包--> <artifactId>my-shop-web-api</artifactId> <packaging>war</packaging> <name>my-shop-web-api</name> <description></description> <!--可能會依賴工具類--> <dependencies> <dependency> <groupId>com.xue</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> 配置
<!--項目/模塊--> <modules> <!--統一依賴管理的項目--> <module>my-shop-dependencies</module> <!--通用的工具類的項目--> <module>my-shop-commons</module> <!--領域模型(實體類)的項目--> <module>my-shop-domain</module> <!--管理后台的項目--> <module>my-shop-web-admin</module> <!--管理前台的項目--> <module>my-shop-web-ui</module> <!--管理應用程序接口的項目--> <module>my-shop-web-api</module> </modules>
好了,到此基本的架構已經搭建好了