JavaWeb從新手到入門(一)Intellj Idea 2017下的Maven聚合工程體系
參考:傳智播客《電商專案-淘淘商城》
一、說明
本系列部落格是對JavaWeb後臺實戰專案的一個總結和記錄,專案來自於傳智播客的《淘淘商城》專案,網上已經有不少部落格介紹專案的情況,港真,這是一個比較容易獲得的、貼近生產場景的例子,所以學習一下還是很有價值的,在學習過程中還可以作為自己的練手專案,在閒暇時光進行重構和升級(就是不知道多少程式設計師能夠有不加班重構一份學習程式碼的時間~),如是。
二、Intellj Idea 2017
Intellj Idea是java語言開發的整合環境,IntelliJ在業界被公認為最好的java開發工具之一,尤其在智慧程式碼助手、程式碼自動提示、重構、各類版本工具(git、svn、github等)、JUnit、CVS整合等方面超越了常用的Eclipse和Myeclipse這兩個常用的Java IDE。作為一個份額遠遠低於Eclipse和Myeclipse的“小眾軟體”,具備強大高階特性和相對繁雜的快捷鍵的同時,Intellj Idea這個IDE卻一直佔據了IDE鄙視鏈的高階席位(當然這肯定不是此次選擇Intellj Idea作為IDE的理由)。
經過一段時間的使用羅列一下Eclipse與Intellj Idea在使用中的差異(主要集中在這個專案中):
1. 多工程設定:Eclipse可以很方便建立和開啟多個專案,在多個專案之間的跳轉並無障礙,而Idea在設計上採用的是單工程設計,也就是說新建立一個工程的時候會關閉當前專案,開啟一個新的專案(這一點並非不可規避,可以採用Module或者建立後開啟為新視窗的方式達到開啟多個專案的目的,這也是這篇部落格的一個部分)。
2. 外掛支援:Idea對外掛的支援更加直觀易用,簡單說就是讓一個新手更容易按照自己的設想找到工具應該在的地方,比如Maven、Tomcat和Git等,有些可以免除學習成本(這個只是主觀感受)。
3. Project Structure:Project Structure是Idea獨有的設定項,可以設定SDK、工程的原始碼目錄和依賴庫等,邏輯抽象也更清晰了。
三、Maven聚合和繼承
Maven用於工程管理時,一般用於管理程式碼和依賴的版本,按照Maven的集中管理的思想,有時難以勝任分散式JavaWeb的需要,此時需要使用Maven的聚合和繼承特性。
Maven的聚合工程指專案的打包方式為pom,它有如下特點:
- 1. 聚合工程本身是一個帶pom檔案的完整工程,它不包含src/main/java、src/test/java等目錄,因為它只是用來幫助其它模組構建的工具,本身並沒有實質的內容。
- 2. 聚合工程的打包方式為“pom”。
- 3. 引入了新的元素:modules---module。
- 4. 版本:聚合模組的版本和被聚合模組版本一致。
- 5. 通常將聚合模組放在專案目錄層的最頂層,其它聚合模組作為子目錄存在。這樣當我們開啟專案的時候,第一個看到的就是聚合模組的POM。
<modules>
<module>../alitycommon</module>
<module>../alitymanager</module>
</modules>
<modules>模組定義了聚合塊,在建立子module時自動新增,但是在子module刪除時不會跟隨自動刪除。Maven的繼承可以類比於面向物件程式設計範疇的繼承,主要目的是為了使子工程與父工程具備相同的模組版本和預設屬性。在一般Java原始碼中可以得到佐證,本專案採用的parent標識類即為所有工程的父工程,確保所有的子工程使用相同的依賴版本。
<parent>
<artifactId>ality-parent</artifactId>
<groupId>priv.zenhobby</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../alityparent/pom.xml</relativePath>
</parent>
如上程式碼是子工程中的定義,<parent>定義了父工程,其中<relativePath>即是父工程POM檔案的路徑四、技術選型和開發環境
技術選項:
- 資料庫:mysql
- Dao層:mybatis、資料庫連線池(alibaba-druid)
- 快取: redis
- 搜尋: solr
- Service層:spring
- 表現層: springmvc、jstl、EasyUI、jsp、freemaker
- 圖片伺服器:FastDFS(分散式檔案系統)
- 反向代理伺服器:nginx
- 定時器:Quartz
- Web伺服器:tomcat
- 工程管理:maven
開發環境:
- Intellj Idea 2017.3 Ultimate。
- Maven 3.5.0
- Tomcat 7.0.82
- JDK 1.8.0_152
- Mysql 5.7
- Nginx 1.8.0
- Redis 3.0.0
- Windows 10 x64
- Git
五、工程目錄
1. 父工程
在此專案中父工程用於實現模組版本控制,專案名稱為ality-parent,建立時選擇Maven工程,可以不選擇任何archetype。
生成工程如下:
建立alityparent父工程之後在pom檔案中定義模組版本,引入依賴:
<?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>priv.zenhobby</groupId>
<artifactId>ality-parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!-- 集中定義依賴版本號 -->
<properties>
<junit.version>4.12</junit.version>
<spring.version>4.1.3.RELEASE</spring.version>
<mybatis.version>3.2.8</mybatis.version>
<mybatis.spring.version>1.2.2</mybatis.spring.version>
<mybatis.paginator.version>1.2.15</mybatis.paginator.version>
<mysql.version>5.1.6</mysql.version>
<slf4j.version>1.6.4</slf4j.version>
<jackson.version>2.4.2</jackson.version>
<druid.version>1.0.9</druid.version>
<httpclient.version>4.3.5</httpclient.version>
<jstl.version>1.2</jstl.version>
<servlet-api.version>2.5</servlet-api.version>
<jsp-api.version>2.0</jsp-api.version>
<joda-time.version>2.5</joda-time.version>
<commons-lang3.version>3.7</commons-lang3.version>
<commons-io.version>1.3.2</commons-io.version>
<commons-net.version>3.3</commons-net.version>
<pagehelper.version>3.2.1</pagehelper.version>
<jsqlparser.version>0.9.1</jsqlparser.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<jedis.version>2.7.2</jedis.version>
<solrj.version>4.10.3</solrj.version>
<freemarker.version>2.3.23</freemarker.version>
<quartz.version>2.2.2</quartz.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 時間操作元件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<!-- Apache工具元件 -->
<dependency>
<groupId>org.apache.commcommons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>${commons-net.version}</version>
</dependency>
<!-- Jackson Json處理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 日誌處理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>${mybatis.paginator.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 連線池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JSP相關 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- 檔案上傳元件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<!-- Redis客戶端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- solr客戶端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solrj.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 資原始檔拷貝外掛 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java編譯外掛 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!-- 配置Tomcat外掛 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2. 聚合工程
此工程先建立一個後臺管理工程,用於管理購物網站的後臺,工程名稱為ality-manager,使用Idea的Module建立:
專案名稱為ality-manager,建立時選擇Maven工程,可以不選擇任何archetype。建立完畢後ality-manager的pom檔案中顯示如下:
<?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">
<parent>
<artifactId>ality-parent</artifactId>
<groupId>priv.zenhobby</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../alityparent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ality-manager</artifactId>
<packaging>pom</packaging>
</project>
此時已經指定父工程為ality-parent,併成功繼承父工程中關於模組的定義。父工程ality-parent工程中自動添加了如下程式碼:
<modules>
<module>../alitymanager</module>
</modules>
即parent工程已經將alitymanager視作聚合的一部分。3. 元件工程
元件工程主要兩類,
3.1 工具元件
工具元件與ality-manager同級,繼承自ality-parent的ality-common工程,用於容納專案中常用的工具元件:
alitycommon的pom檔案如下所示:
<?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">
<parent>
<artifactId>ality-parent</artifactId>
<groupId>priv.zenhobby</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../alityparent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ality-common</artifactId>
<properties>
<commons-lang3.version>3.7</commons-lang3.version>
</properties>
<!-- 新增依賴 -->
<dependencies>
<!-- 時間操作元件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
</dependency>
<!-- Jackson Json處理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 日誌處理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
</project>
建立common工程之後將common作為ality-manager的依賴項加入ality-manager的POM檔案中:
<dependencies>
<dependency>
<groupId>priv.zenhobby</groupId>
<artifactId>ality-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
3.2 功能元件
功能元件是ality-manager中包含的元件工程,按照MVC的分類,可以將JavaWeb後臺進行功能分層,分為如下層次:|--ality-common(工具元件)
|--ality-manager(父工程)
|-ality-manager-pojo(資料結構)
|-ality-manager-dao(資料庫訪問)
|-ality-manager-service(業務邏輯)
|-ality-manager-web(頁面互動)
其中pojo承載資料結構,dao包含資料庫訪問方法,service工程承載業務邏輯,web類包含頁面和互動(web可以使用archetype)。
ality-manager-pojo建立使用普通maven工程:pojo類的POM中加入mybatis-generator依賴項,以便於後面做逆向:
<?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">
<parent>
<artifactId>ality-manager</artifactId>
<groupId>priv.zenhobby</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ality-manager-pojo</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
ality-manager-dao工程建立普通Maven工程
dao工程需要在pom檔案中加入資料庫訪問相關依賴項:
<?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">
<parent>
<artifactId>ality-manager</artifactId>
<groupId>priv.zenhobby</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ality-manager-dao</artifactId>
<dependencies>
<dependency>
<groupId>priv.zenhobby</groupId>
<artifactId>ality-manager-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 連線池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
</dependencies>
</project>
ality-manager-service工程建立普通Maven工程service工程需要在pom檔案中加入spring相關的依賴項:
<?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">
<parent>
<artifactId>ality-manager</artifactId>
<groupId>priv.zenhobby</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ality-manager-service</artifactId>
<dependencies>
<dependency>
<groupId>priv.zenhobby</groupId>
<artifactId>ality-manager-dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
</dependencies>
</project>
ality-manager-service工程建立Maven工程生成的工程中已經存在了WEB-INF目錄:
web工程需要在pom檔案中加入servlet和jstl等依賴項:
<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/maven-v4_0_0.xsd">
<parent>
<artifactId>ality-manager</artifactId>
<groupId>priv.zenhobby</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ality-manager-web</artifactId>
<packaging>war</packaging>
<name>ality-manager-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>priv.zenhobby</groupId>
<artifactId>ality-manager-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- JSP相關 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- 檔案上傳元件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
</dependencies>
<build>
<finalName>ality-manager-web</finalName>
</build>
</project>
4. 成品結構
本部落格說到的Maven聚合工程體系成品結構如下:
5. 需要注意的問題
1. Idea的Maven命令:
Idea中的Maven命令被包含在名為"Maven Projects"的Tool window中:
該視窗下每個Maven專案均包含三個型別的Maven命令:
其中:
- lifecycle: 包含了工程的主要maven命令,install和package均使用lifecycle中的命令
- plugins: 包含由外掛和POM中的命令列提供的maven命令
- Dependecies: 包含了maven正確識別出來的依賴項,如果存在失誤會顯示紅色波浪線。
2. 安裝順序
Maven的工程需要滿足依賴次序,即被依賴的專案要首先被編譯和安裝,之後依賴該專案的專案才可以正確編譯。
Maven compile: 編譯原始碼,一般編譯src/main/java目錄,生成.class檔案
Maven clean:清理專案,一般是清理專案的target資料夾。
Maven test: 測試專案,一般執行src/test下的測試用例。
Maven package:打包到本專案,一般是在專案target目錄下。如果a專案依賴於b專案,打包b專案時,只會打包到b專案下target下,編譯a專案時就會報錯,因為找不到所依賴的b專案,說明a專案在本地倉庫是沒有找到它所依賴的b專案。
Maven install:打包會安裝到本地的maven倉庫中,如果沒有設定過maven本地倉庫,一般在使用者/.m2目錄下。如果a專案依賴於b專案,那麼install b專案時,會在本地倉庫同時生成pom檔案和jar檔案。
Maven deploy: 將打包的檔案釋出到遠端參考,提供其他人員進行下載依賴。