Maven
Struts Spring MyBatis
做一個項目,首先需要各個jar包的下載,先到Struts 2官網下載Struts 2 jar包,在到Spring官網下載Spring jar包,還有MyBatis jar包,以及第三方的jar包。在項目還沒有開始的時候就已經有了很多的jar包,有用的,沒用的,版本衝突的,所以在這個時候出現了優秀的開源的項目管理。
Maven, Ant, gradle優秀的項目管理
Maven快速入門————介紹及環境搭建
Maven是基於項目對象模型(POM),可以通過一小段描述信息來管理項目的構建、報告和文檔的軟件項目管理工具。
登錄官網https://maven.apache.org/,下載maven.bin的壓縮文件,下載後解壓打開。打開apache-maven-3.5.4下的bin文件夾,裏面有可以運行的mvn腳本,boot目錄包含了一個類加載器的框架,conf下是配置文件的目錄,lib下有所有的類庫。接下來配置環境變量。
右鍵我的電腦,屬性,選擇“高級系統設置”,點擊環境變量。在“系統變量”中新創建一個,名爲“M3_HOME”,變量值爲apache-maven-3.5.4的路徑。點擊Path,編輯“%M3_HOME%\bin”。點擊確定。打開終端,輸入“mvn -v”,即可查看電腦所有的信息,配置成功的話就可以看到maven的版本信息。
目錄結構
常用的構建命令介紹:
mvn -v 查看maven版本
compile 編譯
test 測試
package 打包項目
clean 刪除target
install 安裝jar包到我們的目錄
自動創建目錄骨架:
archetype插件:用於創建符合maven規定的目錄骨架
maven規定:
src
-main
-java
-主代碼(com.sycu.項目名.作者.包名)
src
-test
-測試代碼(用來進行測試)
創建目錄的兩種方式:
1、archetype:generate 按照提示進行選擇
2、archetype:generate -DgroupId=組織名,公司網址反寫+項目名
-DartifactId=項目名-模塊名
-Dversion=版本號
-Dpackage=代碼所存在的包名
maven中的座標和倉庫
座標 構建
所有的構建均通過座標作爲其唯一標識
其中groupId、artifactId、version都是組成項目基本的座標
倉庫:用來管理依賴,分成 本地倉庫 和 遠程倉庫 兩種
maven爲我們提供了一個超級pom,在lib下maven-model-builder.XXX.jar中,這裏面的pom-XXX.XML,是所有的pom都會繼承這個pom
maven全球中央倉庫的地址 url:https://repo.maven.apache.org/maven2
鏡像倉庫:maven/conf/settings.xml
第152行可以看到有mirror
<mirror>
<id>maven.net.cn</id>
<mirrorOf>central</mirrorOf>//這裏可以指定倉庫名,也可以使用通配符 * 來匹配所有的鏡像,一旦配置鏡像,所有針對原倉庫的訪問都會轉到鏡像倉庫,那麼原倉庫就不能再繼續訪問
<name>central mirror in china</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>
更改倉庫位置:
maven從遠程倉庫下載 構建,默認是存放在當前的用戶目錄中 C:\Users\Administrator\.m2
最好是不要存放在C盤中,要是重做系統,那麼這些數據就會消失
在別的盤下創建一個文件夾repo,然後打開conf下的settings.xml文件,
在53行出找到<localRepository>/path/to/local/repo</localRepository>,把他複製粘貼出來,修改成剛纔repo的文件夾路徑,同時把\替換成/,
例如:<localRepository>D:/mavenworkspace/repo</localRepository>
修改成功之後,把settings.xml文件複製到repo文件夾下,然後打開終端,進入到一個項目中,再次輸入mvn clean compile,敲回車就OK了。
在Eclipse中安裝maven插件以及創建maven項目
到網站上下載插件,m2e https://download.csdn.net/download/zk461759809/8817869
下載好後放在安裝eclipse目錄下的dropins目錄下即可。
然後打開安裝eclipse的文件夾,下面有一個eclipse.ini的文件,打開,在第11行下(也不一定),添加行輸入:
-vm
C:\Java\jdkXXXXXXX(安裝jdk的jdk下的bin文件夾路徑)\javaw.exe
隨後打開eclipse->windows->Preferences
點擊Java->Installed JREs。 在這裏要選擇jdk的安裝路徑
點擊Maven->Installations。 點擊Add,選擇maven的安裝路徑,勾選中,ok
點擊Maven->UserSettings。 User Settings下選擇repo下的settings.xml文件
隨後創建一個maven項目,創建完成之後,打開pom.xml,可以發現跟我們之前寫的是一樣的。
接着在pom.xml文件上右鍵,Run As -> Maven build... 再Goals中寫入compile就可以編譯,在控制檯上就可以看到有BUILD SUCCESS,這就完成搭建了。
如果出現錯誤:-Dmaven.multiModuleProjectDirectory system propery is not set. XXXXXXXXXXXXXXXXXXXXXX,
那麼打開eclipse->windows->Preferences->Java->Installed JREs,點擊jdk,edit,在Default VM arguments中寫入:-Dmaven.multiModuleProjectDirectory=$M3_HOME(自己配置的環境變量的名)
Maven的生命週期和插件
之前使用過clean、compile、test、package、install
一個項目完整的構建過程包括:
清理、編譯、測試、打包、集成測試、驗證、部署
maven和插件密不可分:maven抽象出一套項目構建的生命週期。而插件是對抽象進行實現。
maven中定義了三套生命週期:1、clean 清理項目
2、default 構建項目
3、site 生成項目站點
這三套生命週期是相互獨立的,每個生命週期都包含一些階段,各個生命週期中的階段都是有順序的,且後面的階段依賴於前面的階段,執行某一個階段時,其前面的階段會順序執行,但不會觸發另外兩套生命週期的任何階段。
clean清理項目
pre-clean 執行清理前的工作
clean 清理上一次構建生成的所有文件
post-clean 執行清理後的文件
default構建項目(最核心)
compile test package install(最爲常用,不常用的還有很多)
site生成項目站點
pre-site 在生成項目站點前要完成的工作
site 生成項目的站點文檔
post-site 在生成項目站點後要完成的工作
site-deploy 發佈生成的站點到服務器上 使用source插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
打包的時候系統會自動的進行測試以及打包
pom.xml是項目的核心管理文件,用於描述、組織管理、依賴管理、構建信息的管理
pom.xml包含了很多的標籤
!!!pom.xml常用的標籤!!! |
<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">
<!-- 指定了當前pom的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 項目標識,反寫的公司網址+項目名 -->
<groupId>com.imooc.hi</groupId>
<!-- 項目名+模塊名 -->
<artifactId>hi</artifactId>
<!-- 第一個0表示大版本號
第二個0表示分支版本號
第三個0表示小版本號
0.0.1
snapshot 快照
alpha 內部測試
beta 公測
Release 穩定
GA 正式發佈 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 打包方式,默認是jar。
還有 war zip pom-->
<packaging>jar</packaging>
<!-- 項目描述 -->
<name>hi</name>
<!-- 項目地址 -->
<url>http://maven.apache.org</url>
<!--
項目描述
<description></description>
開發人員信息
<developers></developers>
許可證的信息
<licenses></licenses>
組織信息
<organization></organization>
-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依賴列表 -->
<dependencies>
<!-- 依賴項 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!-- 依賴範圍
test是只有在test測試的範圍內有用-->
<scope>test</scope>
<!-- 設置依賴是否可選
裏面有true和false
默認是false
子項目如果默認是false,子項目默認是繼承的
如果是true,子項目必須寫入引用給依賴
<optional></optional>
排除依賴傳遞的列表
<exclusions>
<exclusion>
</exclusion>
</exclusions>
<
-->
</dependency>
</dependencies>
<!--
依賴的管理
<dependencyManagement>
<dependencies>
裏面有很多的依賴類表,但是並不會被運行,不會被引入到實際的依賴中。
這個標籤一般是被定義在父模塊中的,供子模塊所繼承用的
</dependencies>
</dependencyManagement>
-->
<build>
<!-- 插件的列表,可以包含多個plugin -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 通常用於子模塊在父模塊中的pom的繼承
<parent></parent> -->
<!-- 用來聚合多個的maven項,可以在module中指定多個模塊進行編譯
<modules>
<module>
</module>
</modules> -->
</project>
依賴範圍
<scope>test</scope>
三種classpath:1、編譯 2、測試 3、運行
6種scopes
1、compile:如果沒有指定,那麼就默認的範圍,編譯測試運行都有效
2、provided:在編譯和測試時有效,在最後運行的時候不會被加入
3、runtime:在測試和運行時有效
4、test:只在測試範圍內有效
5、system:在編譯和測試時有效,因爲與本地相關聯,所以有很大的不可移植性
可能將項目移動到別的電腦上,會因爲路徑不一致,而導致錯誤
6、import:導入的範圍,他只是用在dependencyManagement中,表示從其他的pom中導入dependency的配置
依賴的傳遞
在依賴列表中加入一個dependency
<dependencies>
<!-- 依賴項 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
添加上要依賴的標識
<groupId>com.imooc.XXX</groupId>
<artifactId>XXX-XXX</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
排除依賴
如果C依賴於B,B依賴於A,那麼C就間接性的依賴於A
但是現在不想讓C依賴於A,那麼就需要排除依賴
在dependency依賴項中加入exclusions
<dependencies>
<!-- 依賴項 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
添加上要依賴的標識
<groupId>com.imooc.XXX</groupId>
<artifactId>XXX-XXX</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.imooc.A</groupId>
<artifactId>XXX-A</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
這樣就不會依賴於A了
另:想要每新建的項目JRE都是固定的版本號,那麼比較簡單的方法就是打開maven安裝路徑下的settings文件,在182行左右,可以看到有profiles,然後輸入一段代碼:
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
這樣在新建項目的時候就會都變成1.8
依賴衝突:有A和B依賴了一個不同版本的相同構建,對於依賴A B 和 C來說,他究竟依賴的是A和B的哪一種構建?
用來搜索新的依賴下載
https://www.mvnrepository.com
這裏有兩條原則:1、短路優先(它會優先解析這個路徑短的版本)
例子:A->B->C->X(jar)
A->D->X(jar) √
那麼它會優先解析下面路徑短的版本
2、先聲明先優先(如果路徑長度相同,則誰先聲明,先解析誰)
聚合和繼承
聚合是將多個項目整合在一起進行,比如install,避免了分開式的操作,那麼在pom.xml中寫入: |
<modules>
<module>../hongxing-bg</module>
<module>../hongxing-ng</module>
<module>../hongxing-sj</module>
</modules>
繼承
要使用繼承需要有一個父類的項目,在這個項目中是不需要有main和test的,所以可以將其刪除掉,打開pom,在依賴項的外層加一個dependencyManagement,這樣就可以被繼承了。
其中dependency下的version可以放在properties下
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>3.8.1</junit.version>
</properties>
然後在dependency下的version中修改成<version>${junit.version}</version>
最終是以下代碼:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>3.8.1</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
隨後在子類中dependency下的version和scope去掉,在上面加入parent的標籤,parent下是繼承的座標粘貼過來:
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
最終子類的代碼就是:
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
使用maven構建web項目
在最開始創建的web項目中,index.jsp是錯誤的,因爲沒有Servlet API的緣故,現在在網站中(https://www.mvnrepository.com)搜索servlet。
啓動服務有兩種形式:1、jetty 2、Tomcat
1、在https://www.mvnrepository.com中搜索jetty maven plugin字樣進行搜索,然後選取版本號進行粘貼
好用的內容如下:
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
在啓動服務的時候輸入:jetty:run,同時也可以在打包的時候啓動服務,那麼需要在build下添加plugins、plugin、executions、execution標籤。代碼爲:
<plugins>
<plugin>
<!-- jetty服務進行啓動 <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version> -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<!-- 在打包成功後使用jetty:run來運行jetty服務 -->
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
添加好之後就可以輸入clean package進行打包並啓動服務了。
2、在https://tomcat.apache.org中,左側有一個Maven Plugin,點擊進去選擇一個版本粘貼,內容如下:
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>