轉載自:
https://blog.csdn.net/u010425776/article/details/52027706
什么是Maven激况?
如今我們構建一個項目需要用到很多第三方的類庫,如寫一個使用Spring的Web項目就需要引入大量的jar包唱较。一個項目Jar包的數(shù)量之多往往讓我們瞠目結舌天梧,并且Jar包之間的關系錯綜復雜戚丸,一個Jar包往往又會引用其他Jar包,缺少任何一個Jar包都會導致項目編譯失敗裸违。
以往開發(fā)項目時掖桦,程序員往往需要花較多的精力在引用Jar包搭建項目環(huán)境上,而這一項工作尤為艱難累颂,少一個Jar包滞详、多一個Jar包往往會報一些讓人摸不著頭腦的異常。
而Maven就是一款幫助程序員構建項目的工具紊馏,我們只需要告訴Maven需要哪些Jar 包料饥,它會幫助我們下載所有的Jar,極大提升開發(fā)效率朱监。
安裝Maven 和 Maven的Eclipse插件
http://blog.csdn.net/qjyong/article/details/9098213
Maven規(guī)定的目錄結構
若要使用Maven岸啡,那么項目的目錄結構必須符合Maven的規(guī)范,其目錄結構如下:
Maven基本命令
-v:查詢Maven版本
本命令用于檢查maven是否安裝成功赫编。
Maven安裝完成之后巡蘸,在命令行輸入mvn -v,若出現(xiàn)maven信息擂送,則說明安裝成功悦荒。
compile:編譯
將java源文件編譯成class文件
test:測試項目
執(zhí)行test目錄下的測試用例
package:打包
將項目打成jar包
clean:刪除target文件夾
install:安裝
將當前項目放到Maven的本地倉庫中。供其他項目使用
什么是Maven倉庫嘹吨?
Maven倉庫用來存放Maven管理的所有Jar包搬味。分為:本地倉庫 和 中央倉庫。
本地倉庫
Maven本地的Jar包倉庫。
中央倉庫
Maven官方提供的遠程倉庫碰纬。
當項目編譯時萍聊,Maven首先從本地倉庫中尋找項目所需的Jar包,若本地倉庫沒有悦析,再到Maven的中央倉庫下載所需Jar包寿桨。
什么是“坐標”?
在Maven中强戴,坐標是Jar包的唯一標識亭螟,Maven通過坐標在倉庫中找到項目所需的Jar包。
如下代碼中骑歹,groupId和artifactId構成了一個Jar包的坐標媒佣。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>
1
2
3
4
5
groupId:所需Jar包的項目名
artifactId:所需Jar包的模塊名
version:所需Jar包的版本號
傳遞依賴 與 排除依賴
傳遞依賴:如果我們的項目引用了一個Jar包,而該Jar包又引用了其他Jar包陵刹,那么在默認情況下項目編譯時,Maven會把直接引用和簡潔引用的Jar包都下載到本地欢嘿。
排除依賴:如果我們只想下載直接引用的Jar包衰琐,那么需要在pom.xml中做如下配置:(將需要排除的Jar包的坐標寫在中)
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
1
2
3
4
5
6
依賴沖突
若項目中多個Jar同時引用了相同的Jar時,會產生依賴沖突炼蹦,但Maven采用了兩種避免沖突的策略羡宙,因此在Maven中是不存在依賴沖突的。
短路優(yōu)先
本項目——>A.jar——>B.jar——>X.jar
本項目——>C.jar——>X.jar
1
2
若本項目引用了A.jar掐隐,A.jar又引用了B.jar狗热,B.jar又引用了X.jar,并且C.jar也引用了X.jar虑省。
在此時匿刮,Maven只會引用引用路徑最短的Jar。
聲明優(yōu)先
若引用路徑長度相同時探颈,在pom.xml中誰先被聲明熟丸,就使用誰。
聚合
什么是聚合伪节?
將多個項目同時運行就稱為聚合光羞。
如何實現(xiàn)聚合?
只需在pom中作如下配置即可實現(xiàn)聚合:
<modules>
<module>../模塊1</module>
<module>../模塊2</module>
<module>../模塊3</module>
</modules>
1
2
3
4
5
繼承
什么是繼承怀大?
在聚合多個項目時纱兑,如果這些被聚合的項目中需要引入相同的Jar,那么可以將這些Jar寫入父pom中化借,各個子項目繼承該pom即可潜慎。
如何實現(xiàn)繼承?
父pom配置:將需要繼承的Jar包的坐標放入標簽即可。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
</dependencyManagement>
1
2
3
4
5
6
7
8
9
子pom配置:
<parent>
<groupId>父pom所在項目的groupId</groupId>
<artifactId>父pom所在項目的artifactId</artifactId>
<version>父pom所在項目的版本號</version>
</parent>
1
2
3
4
5
使用Maven構建Web項目
New Maven項目:選擇WebApp:
若使用JSP勘纯,需添加Servlet依賴:
注:Servlet依賴只在編譯和測試時使用局服!
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
1
2
3
4
5
6
7
在Bulid Path中設置resource輸出目錄:
勾選:Dynamic Web Module
刪掉測試目錄
在pom中加入jetty的插件,并設置JDK版本:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.10.v20160621</version>
<executions>
<execution>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
運行項目:
輸入:jetty:run
訪問127.0.0.1:8080
若出現(xiàn)如下界面驳遵,表示成功淫奔!
pom.xml詳解
pom.xml是Maven的核心,你的項目需要什么Jar包就在pom.xml里面配置堤结。當編譯項目時Maven讀取該文件唆迁,并從倉庫中下載相應的Jar包。
<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.0http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId/>
<groupId/>
<version/>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>cn.erhuowang</groupId>
<artifactId>erhuowang-maven2</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>erhuo-maven</name>
<url>http://erhuowang.cn</url>
<description>A maven project to study maven.</description>
<prerequisites>
<maven/>
</prerequisites>
<issueManagement>
<system>erhuowang</system>
<url>http://erhuowang.cn</url>
</issueManagement>
<ciManagement>
<system/>
<url/>
<notifiers>
<notifier>
<type/>
<sendOnError/>
<sendOnFailure/>
<sendOnSuccess/>
<sendOnWarning/>
<address/>
<configuration/>
</notifier>
</notifiers>
</ciManagement>
<inceptionYear/>
<mailingLists>
<mailingList>
<name>Demo</name>
<post>chaibozhou@163.com</post>
<subscribe>chaibozhou@163.com</subscribe>
<unsubscribe>chaibozhou@163.com</unsubscribe>
<archive>chaibozhou@163.com</archive>
</mailingList>
</mailingLists>
<developers>
<developer>
<id>HELLO WORLD</id>
<name>chaimm</name>
<email>chaibozhou@163.com</email>
<url/>
<roles>
<role>Project Manager</role>
<role>Architect</role>
</roles>
<organization>demo</organization>
<organizationUrl>http://erhuowang.cn</organizationUrl>
<properties>
<dept>No</dept>
</properties>
<timezone>-5</timezone>
</developer>
</developers>
<contributors>
<contributor>
<name/><email/><url/><organization/><organizationUrl/><roles/><timezone/><properties/>
</contributor>
</contributors>
<licenses>
<license>
<name>Apache 2</name>
<url>http://www.baidu.com/erhuwoang/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
<scm>
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
</connection>
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
</developerConnection>
<tag/>
<url>http://svn.baidu.com/banseon</url>
</scm>
<organization>
<name>demo</name>
<url>http://www.erhuowang.cn</url>
</organization>
<build>
<sourceDirectory/>
<scriptSourceDirectory/>
<testSourceDirectory/>
<outputDirectory/>
<testOutputDirectory/>
<extensions>
<extension>
<groupId/>
<artifactId/>
<version/>
</extension>
</extensions>
<defaultGoal/>
<resources>
<resource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
</resource>
</resources>
<testResources>
<testResource>
<targetPath/><filtering/><directory/><includes/><excludes/>
</testResource>
</testResources>
<directory/>
<finalName/>
<filters/>
<pluginManagement>
<plugins>
<plugin>
<groupId/>
<artifactId/>
<version/>
<extensions/>
<executions>
<execution>
<id/>
<phase/>
<goals/>
<inherited/>
<configuration/>
</execution>
</executions>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<inherited/>
<configuration/>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
</execution>
</executions>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<goals/><inherited/><configuration/>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id/>
<activation>
<activeByDefault/>
<jdk/>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<name>mavenVersion</name>
<value>2.0.3</value>
</property>
<file>
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
</file>
</activation>
<build>
<defaultGoal/>
<resources>
<resource>
<targetPath/><filtering/><directory/><includes/><excludes/>
</resource>
</resources>
<testResources>
<testResource>
<targetPath/><filtering/><directory/><includes/><excludes/>
</testResource>
</testResources>
<directory/><finalName/><filters/>
<pluginManagement>
<plugins>
<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
</execution>
</executions>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<goals/><inherited/><configuration/>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
</execution>
</executions>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<goals/><inherited/><configuration/>
</plugin>
</plugins>
</build>
<modules/>
<repositories>
<repository>
<releases>
<enabled/><updatePolicy/><checksumPolicy/>
</releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
</snapshots>
<id/><name/><url/><layout/>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<enabled/><updatePolicy/><checksumPolicy/>
</releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
</snapshots>
<id/><name/><url/><layout/>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<reports/>
<reporting>
......
</reporting>
<dependencyManagement>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<distributionManagement>
......
</distributionManagement>
<properties/>
</profile>
</profiles>
<modules/>
<repositories>
<repository>
<releases>
<enabled/>
<updatePolicy/>
<checksumPolicy/>
</releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
</snapshots>
<id>banseon-repository-proxy</id>
<name>banseon-repository-proxy</name>
<url>http://192.168.1.169:9999/repository/</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
......
</pluginRepository>
</pluginRepositories>
<!--該元素描述了項目相關的所有依賴竞穷。 這些依賴組成了項目構建過程中的一個個環(huán)節(jié)唐责。它們自動從項目定義的倉庫中下載。要獲取更多信息瘾带,請看項目依賴機制鼠哥。-->
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>3.8.1</version>
<type>jar</type>
<classifier></classifier>
<scope>test</scope>
<systemPath></systemPath>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<optional>true</optional>
</dependency>
</dependencies>
<reports></reports>
<reporting>
<excludeDefaults/>
<outputDirectory/>
<plugins>
<plugin>
<groupId/>
<artifactId/>
<version/>
<inherited/>
<configuration/>
<reportSets>
<reportSet>
<id/>
<configuration/>
<inherited/>
<reports/>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
<dependencyManagement>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<distributionManagement>
<repository>
<uniqueVersion/>
<id>banseon-maven2</id>
<name>banseon maven2</name>
<url>file://${basedir}/target/deploy</url>
<layout/>
</repository>
<snapshotRepository>
<uniqueVersion/>
<id>banseon-maven2</id>
<name>Banseon-maven2 Snapshot Repository</name>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url>
<layout/>
</snapshotRepository>
<site>
<id>banseon-site</id>
<name>business api website</name>
<url>
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
</url>
</site>
<downloadUrl/>
<relocation>
<groupId/>
<artifactId/>
<version/>
<message/>
</relocation>
<status/>
</distributionManagement>
<properties/>
</project>