Maven 简单介绍

Maven 简单介绍

1.Maven以pom作为项目对象模型。


一个最简单的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/maven-v4_0_0.xsd">
	<!--
	//使用的maven的版本号
	-->
	<modelVersion>4.0.0</modelVersion>

	<!--
	//Mavem私服的配置,设定仓库,按设定顺序进行查找.
	//指定这个项目从那些仓库中进行下载,在settings.xml中写入是对所有maven项目
	-->
	<repositories>
		<!--
		//这里一般是仓库的镜像
		-->
		<repository>
			<id>public</id>
			<name>Team Nexus Repository</name>
			<url>http://localhost:8081/nexus/content/groups/public</url>
			<snapshots>
				<!--
				//snapshot版本构件下载的支持
				-->
				<enabled>true</enabled>
				<!--
				//maven的更新策略,always表示总是,never表示从不。daily(默认)表示每天,interval:X表示X分钟。
				-->
				<updatePolicy>always</updatePolicy>
			</snapshots>
			<releases>
				<enabled>true</enabled>
				<updatePolicy>always</updatePolicy>
			</releases>
		</repository>
	</repositories>
	<pluginRepositories>
		<!--
		//这里一般是仓库的镜像
		-->
		<pluginRepository>
			<id>public</id>
			<name>Team Nexus Repository</name>
			<url>http://localhost:8081/nexus/content/groups/public</url>
			<snapshots>
				<enabled>true</enabled>
				<updatePolicy>always</updatePolicy>
			</snapshots>
			<releases>
				<enabled>true</enabled>
				<updatePolicy>always</updatePolicy>
			</releases>
		</pluginRepository>
	</pluginRepositories>

	<!-- //项目发布到私服配置,在工程中进行包发布到服务器配置 -->
	<distributionManagement>
		<repository>
			<!--
			//这里ID要与settings.xml中server里的ID一致
			-->
			<id>nexus-releases</id>
			<name>Team Nexus Release Repository</name>
			<!--
			//这里URL不是镜像的URL,是仓库的URL
			-->
			<url>http://localhost:8081/nexus/content/repositories/releases</url>
		</repository>
		<snapshotRepository>
			<id>nexus-snapshots</id>
			<name>Team Nexus Snapshot Repository</name>
			<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
			<!-- <uniqueVersion>false</uniqueVersion> -->
		</snapshotRepository>
	</distributionManagement>
	<!-- //Mavem私服的配置,设定仓库,按设定顺序进行查找. -->

	<!--
	//定义变量
	-->
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<!--
		//定义spring.version变量,下面使用是用"${spring.version}"就可以了
		-->
		<spring.version>1.2.6</spring.version>
		<developer.organization><![CDATA[xy公司]]></developer.organization>
	</properties>


	<!--
	//这个项目的maven坐标定义
	//groupId,组织标识,例如:org.codehaus.mojo,在M2_REPO目录下,将是: org/codehaus/mojo目录。就是项目坐标
	//artifactId,项目名称,例如:my-project,在M2_REPO目录下,将是:org/codehaus/mojo/my-project目录。就是项目模块坐标
	//packaging,打包的格式,可以为:pom (就是pom.xml的复制(可能会进行编码转码)), jar , maven-plugin , ejb , war , ear , rar , par
	//version,版本号,例如:1.0,在M2_REPO目录下,将是:org/codehaus/mojo/my-project/1.0目录。格式为:主版本.次版本.增量版本-限定版本号。
	//加SNAPSHOT发布时会放到SNAPSHOT版本管理处(版本后会有时间戳),加RELEASE或不加会入到RELEASE版本管理处
	//name,这个项目的名称,项目的名称, Maven产生的文档用
	//url,这个项目url,项目主页的URL, Maven产生的文档用
	-->
	<groupId>com.proserver</groupId>
	<artifactId>CESmart</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>CESmart</name>
	<url>http://www.midea.com.cn</url>

	<!--
	//项目开发者所属组织
	-->
	<organization> demo </organization>

	<!--
	//项目开发者所属组织的URL
	-->
	<organizationUrl> http://hi.baidu.com/banseon </organizationUrl>

	<!--
	//项目描述
	-->
	<description></description>

	<!--
	//项目开发者描述,参见developers/developer元素
	-->
	<developers></developers>

	<!--
	//项目的其他贡献者描述,参见developers/developer元素
	-->
	<contributor></contributor>

	<!--
	//项目license描述
	-->
	<licenses></licenses>

	<!--
	//这个项目依赖那些maven项目(就是别人放到仓库中的jar包(它也是一个maven项目,有它们的maven坐标))
	//要用到别人那些项目就引用它的maven坐标
	//maven会读取它们(jar包)里面的pom.xml文件,把它们项目依赖那些maven项目那会加载进来,这样你就可以引用别人的maven坐标就可以了,不用管它们的jar包
	//scope,compile(default),provided,runtime,test,system,import,就是这个jar只能在那里使用
	//1.compile,缺省值,适用于所有阶段,会随着项目一起发布。
	//2.provided,类似compile,期望JDK、容器或使用者会提供这个依赖。
	//3.runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
	//4.test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
	//5.system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
	//6.import,实现多继承(因为每个项目都只能申明唯一的一个父项目),用在<dependencyManagement>中实现引入多个父项目
	//exclusions,就是把那些包除外,不包含到本项目中,用于多版本的管理上
	//type,指定依赖项的类型
	//optional,依赖是否可选(默认false),当为true的时候,引入这个项目(A)的项目(B)是不会引入这个项目(A)引入的这个包(C)的,如果B要引入C就要求pom中自己引入了
	//1.假设以上配置是项目A的配置,即:Project-A --> Project-B。在编译项目A时,是可以正常通过的。
	//2.如果有一个新的项目X依赖A,即:Project-X -> Project-A。此时项目X就不会依赖项目B了。如果项目X用到了涉及项目B的功能,那么就需要在pom.xml中重新配置对项目B的依赖。
	//3.配置可选依赖的原因:1、节约磁盘、内存等空间;2、避免license许可问题;3、避免类路径问题,等等。
	//4.举例来说,一个类似hibernate的项目,它支持对mysql、oracle等各种数据库的支持,但是在引用这个项目时,我们可能只用到其对mysql的支持,此时就可以在这个项目中配置可选依赖。
	-->
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
			<type></type> //使用maven什么插件来处理依赖
			<optional></optional>
			<exclusions>
	                     <exclusion>
	                            <groupId>groupC</groupId>
	                            <artifactId>artifactC</artifactId>
	                     </exclusion>
              		</exclusions>
		</dependency>
	</dependencies>

	<!--
	//定义构建行为(就是如何构建项目(定义如何生成你想要的东西,如jar包、war包))
	-->
	<build>
		<!--
		-->
		<!--
		//进行打包时在工程目录下的生成文件的文件名,install时会更改为项目坐标定义时的文件名,它们两个内容一样,名字不一样
		-->
		<finalName>redis</finalName>
	</build>
</project>




Maven聚合
1.聚合,对多个项目进行聚合,每个子项目就会变成一个模块(各个模块为一个Maven项目),在总的项目pom中可以用<modules>进行聚合在一起,总的项目输出为pom,当进行打包是就不用一个个打包了,在总项目打包就会为每个模块打包(当然也可以一个个进行构建)
2.就是一个Maven项目里包含多个Maven子项目(嵌套),以下为主体的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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.youzhibing.account</groupId>
  <artifactId>account-aggregator</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>		//输出设置为POM

  <name>Account Aggrregator</name>
  <url>http://maven.apache.org</url>

  <modules>				//要聚合的模块
    <!-- 
      //模块都写在此处 
      //项目所在的目录路径,如:"../task-sla"
      -->
      <module>account-register</module>
      <module>account-persist</module>
  </modules>

</project>




Maven继承
1.继承,父项目把依赖放到<dependencyManagement>,这样子项目依赖就不用再写版本号和作用范围了(写groupId、artifactId就可以了),用<parent>引入父项目就可以了,它会往上找到第一个<dependencyManagement>中的版本号,保证版本号的一致。
父项目pom.xml中
<dependencyManagement>   //依赖管理,不会引入到项目中,提供了一种管理依赖版本号的方式
	<dependencies>
		<dependency>
		</dependency>
	</dependencies>
</dependencyManagement>

子项目pom.xml中
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>1.4.1.RELEASE</version>
</parent>




依赖传递
1.A依赖B,B依赖C,那么A就依赖C了(就是会加入C包)
2.A可用在引入B时用<exclusion>排除依赖C(就是不加入C包)



依赖冲突
1.就是同时引入了多个版本的同一个包
2.短路优先,就是可以最先加入到项目中的版本
3.同样路径,先声明先优先


maven 打包源代码
1.需要使用到插件,因为maven本身没有这个功能,但package,compile,install是有的,但也可以用指定的版本来完成
<plugins>
	<plugin>
		<!--
		//插件坐标
		-->
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-source-plugin</artifactId>
		<version>2.2.1</version>
		<executions>
			<!--
			//执行行为控制
			-->
			<execution>
				<!--
				//定义一个任务的ID
				-->
				<id>attach-sources</id>
				<!--
				//定义工作在那个阶段进行
				-->
				<phase>package</phase>
				<goals>
					<!--
					//类似执行mvn source:jar,就是要执行的命令
					-->
					<goal>jar-no-fork</goal>
				</goals>
			</execution>
		</executions>
	</plugin>
</plugins>




Maven相关命令(Eclipse中不用mvn)
mvn -v 查看maven版本
mvn compile 编译,编译项目.java文作
mvn test 测试,运行测试用例,生成测试报告
mvn package 打包,生成jar、编译好的.class、测试报告放到target目录中,生成工程目录的jar包
mvn clean 删除target目录和里面和文件(.class)
mvn install 安装jar包到本地仓库中,复制pom.xml,xxx.jar到本地maven仓库中,更改为项目指定的名字xxx.pom,xxx.jar,当然jar里面是有原来pom.xml文件的
mvn deploy 将jar包上传安装到服务器仓库中


maven生命周期(就是各功能(命令)会经历了那些阶段工作)
maven阶段描述
清理、编译(compile)、测试(test)、打包(package)、集成测试、验证、部署(install)

clean,清理项目生命周期
1.pre-clean,执行清理前的工作
2.clean,清理上一次构建生成的所有文件
3.post-clean,执行清理后的文件

default,构建项目生命周期
1.compile,编译
2.test,测试
3.package,打包
4.install,部署

site,生成项目站点生命周期
1.pre-site,在生成项目站点前要完成的工作
2.site,生成项目的站点文件
3.post-site,在生成项目站点后要完成的工作
4.site-deploy,发布生成的站点到服务器上



maven插件
1.maven执行的命令都是通过执行插件来完成的,插件也是一个maven项目,也是通过指定坐标来得到的
2.当然大多数命令Maven已经自带,没有的才要指定插件来完成

<build>
	<plugs>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>//对原码进行打包的插件
			<artifactId>maven-source-plugin</artifactId>
			<version>2.4</version>
			<executions>	//执行参数设置
			    <execution>
			        <id>add-resource</id>
			        <phase>package</phase> //执行package阶段时执行
			        <goals>				//生成目标
			            <goal>jar-no-fork</goal> //生成目标命令
			        </goals>
			        <configuration>	//配置参数
			            <resources>	//这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。
			                <resource>	//这个元素描述了项目相关或测试相关的所有资源路径
			                    <directory>src/main/java</directory>//描述存放资源的目录,该路径相对POM路径
			                    <includes>	//包含的模式列表,例如**/*.xml.(就是用于进行匹配那些文件要打到包里的)
			                        <include>**/*.xml</include>
			                    </includes>
			                </resource>
			            </resources>
			        </configuration>
			    </execution>
			</executions>
		</plugin>
	<plugs>
</build>



参考原文(pom.xml 配置详解): http://blog.csdn.net/longeremmy/article/details/9670619
参考原文(pom.xml详解): http://blog.csdn.net/adeyi/article/details/17259479
参考原文(maven可选依赖): http://www.tuicool.com/articles/yaeIV3
参考原文(Dependency介绍): http://elim.iteye.com/blog/2057317
参考原文(pom.xml 配置详解): http://www.cnblogs.com/skyme/archive/2011/08/19/2146145.html
参考原文(源码打包插件): http://www.tuicool.com/articles/NFvAbm
参考原文(源码打包插件): https://my.oschina.net/xiaokaceng/blog/210498
参考原文(源码打包插件): http://blog.csdn.net/chs_jdmdr/article/details/42419191
参考原文(modules、parent、properties以及import): http://www.cnblogs.com/youzhibing/p/5427130.html
参考原文(pom.xml 配置详解): http://www.cnblogs.com/yangxia-test/p/4409736.html
参考原文(deploy出错处理): http://www.javatang.com/archives/2010/01/23/4518375.html
参考原文(Maven仓库): http://juvenshun.iteye.com/blog/359256
参考原文(Maven module): http://www.cnblogs.com/xdp-gacl/p/4242221.html
参考原文(Maven最佳实践:划分模块): http://juvenshun.iteye.com/blog/305865

猜你喜欢

转载自huangyongxing310.iteye.com/blog/2331969
今日推荐