02 maven.txt

UP 返回
1.简介
	Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
	Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理

	安装:下载bin.zip,解压,配置环境:
			系统变量:MAVEN_HOME = C:\Users\guoyongfeng\apache-maven-3.5.0
			系统变量:path = %MAVEN_HOME%\bin
	mvn -version查看版本

2.阿里云仓库(直接全部复制到mirrors就可以了)
	<!-- 阿里云仓库 -->
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </mirror>

        <!-- 中央仓库1 -->
        <mirror>
            <id>repo1</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo1.maven.org/maven2/</url>
        </mirror>
    
        <!-- 中央仓库2 -->
        <mirror>
            <id>repo2</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo2.maven.org/maven2/</url>
        </mirror>

3.Maven项目结构:
ProjectName
	|-src
	|	|-main
	|	|	|-java				项目源码
	|	|	|-resources		项目资源文件,比如各种配置
	|	|-test
	|		|-java				测试代码,如Junit
	|		|-resources		测试资源文件
	|-target						目标文件输出位置(如.class .jar .war文件)
	|-pom.xml					maven核心配置文件

4.maven的一些命令
	mvn help:system	会自动从官网下载一些必须包
	mvn compile		完成编译操作。执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。
	mvn clean			执行完毕后,会将target目录删除。
	mvn test			完成单元测试操作。执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)
	mvn package		完成打包操作。执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war
	mvn install			执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作。执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用
    mvn 组合命令
	mvn clean compile
	mvn clean test
	mvn clean package
	mvn clean install

5.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.dm</groupId>			<!-- 组id -->
	  <artifactId>maventest2</artifactId>		<!-- 项目id -->
	  <version>0.0.1-SNAPSHOT</version>	<!-- 版本 -->
	  <!-- ◀以上是自动生成的(GAV:maven的坐标) -->
	  
	  <dependencies>
		  <dependency>
		  		<groupId>junit</groupId>			<!-- ◀普通的引包 -->
		  		<artifactId>junit</artifactId>
		  		<version>4.10</version>
				<scope>compile</scope>			<!-- ◀依赖范围,可以不写 -->
		  	</dependency>
		  	<dependency>
		  		<groupId>com.dm</groupId>		<!-- ◀引用本地其他的maven项目。其中的参数就是被引用的项目的各个属性 -->
		  		<artifactId>maventest1</artifactId>
		  		<version>0.0.1-SNAPSHOT</version>
		  	</dependency>
	  
	  </dependencies>
	</project>


6.一些问题汇总
   6.1 eclipse默认是运行在jre上的,但是maven的插件需要使用jdk(jre没有编译功能),使用maven install会报错,需要点击Windows→Preferences→Java→Installed JREs,Add选择Standard VM,选择jdk所在目录
   6.2 jar坐标查找地址:
	http://www.mvnrepository.com
	http://search.maven.org/
   6.3 依赖范围(和依赖传递有关):
	maven配置中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
		compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
		test:测试依赖范围。只对于测试classpath有效
		provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
		runtime:运行时提供。例如:jdbc驱动
   6.4 依赖传递:
	项目test2的pom中引用test1,就是直接依赖;test3中引用了test2,那test3和test1就是间接依赖,test1和tset2是第一直接依赖,test3和test2是第二直接依赖。
	test2中的依赖范围如果是compile的,其依赖就可以被传递给test3;如果依赖范围是test,就无法传递过去,test3需要自己导入依赖
   6.5 依赖冲突:(就近引用)
		假如test1使用junit4.10依赖,并且scope是compile,那test2,test3都可以使用test1的junit4.10,因为传递下来了
		假如test2使用junit4.9依赖,那test3会使用【就近的一个依赖】,也就是使用junit4.9
   6.6 可选依赖
		<optional> true/false<optional> 是否可选,也可以理解为是否向下传递。如果是true则不传递,如果是false就传递,默认为false
		<dependency>
	  		<groupId>junit</groupId>			
	  		<artifactId>junit</artifactId>
	  		<version>4.10</version>
			<optional>true</optional>			
	  	</dependency>
   6.7 排除依赖:(test3引用test2,同时希望test2中的部分包不要被传递进来)
		exclusions可用于排除依赖,注意exclusions是写在dependency中
		<dependency>
	  		<groupId>com.dm</groupId>
	  		<artifactId>test2</artifactId>
	  		<version>0.0.1-SNAPSHOT</version>
	  		<exclusions>							<!-- ▶如果有多个可以继续添加exclusion -->
	  			<exclusion>
	  				<groupId>com.dm</groupId>	<!-- 组id -->
	  				<artifactId>test1</artifactId>	<!-- 项目id(在test2中被引用的依赖。即test3不希望test2引用的test1被传递过来)-->
	  			</exclusion>
	  		</exclusions>
	  	</dependency>
   6.8 可以通过pom.xml配置插件来更改项目编译compile的jdk版本(放在project标签里):
	<build>
	  	<plugins>
	  		<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>		<!-- maven项目的编译器默认是1.5的,这里可以指定jdk版本 -->
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
	  	</plugins>
	  </build>
   6.9 eclipse创建maven项目时可以选择jar或者war来创建普通项目后者web项目。maven的web项目目录结构比简单项目多了个webapp目录,需要在webapp项目中自己添加WEB-INF目录和web.xml文件
	这些文件可以自己先在eclipse中创建一个web工程(Dynamic Web Project,注意创建的时候要点击next勾选生成web.xml,否则没有该文件。如果eclipse无法创建这种工程,参https://blog.csdn.net/maihilton/article/details/82499923),然后把WebContent下的WEB-INF整个复制到maven项目的webapp下就可以了




7 maven生命周期(不重要)
   7.1 在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是: 
		Clean Lifecycle: 在进行真正的构建之前进行一些清理工作。 
		Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等。 
		Site Lifecycle: 生成项目报告,站点,发布站点。
   7.2 Clean生命周期:清理项目
		Clean生命周期一共包含了三个阶段: 
	pre-clean 执行一些需要在clean之前完成的工作 
	clean 移除所有上一次构建生成的文件 
	post-clean 执行一些需要在clean之后立刻完成的工作 
	
		也就是说,mvn clean 等同于 mvn pre-clean clean 
		如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。
		这是Maven很重要的一个规则,可以大大简化命令行的输入。
   7.3 Default生命周期:构造项目
		Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段
	validate 
		generate-sources 
		process-sources 
		generate-resources 
		process-resources 复制并处理资源文件,至目标目录,准备打包。 
	compile 编译项目的源代码。 
		process-classes 
		generate-test-sources 
		process-test-sources 
		generate-test-resources 
		process-test-resources 复制并处理资源文件,至目标测试目录。 
		test-compile 编译测试源代码。 
		process-test-classes 
	test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 
		prepare-package 
	package 接受编译好的代码,打包成可发布的格式,如 JAR 。 
		pre-integration-test 
		integration-test 
		post-integration-test 
		verify 
	install 将包安装至本地仓库,以让其它项目依赖。 
	deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享

		运行任何一个阶段的时候,它前面的所有阶段都会被运行
		这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包,安装到本地仓库
		此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。
   7.4 Sit生命周期:生成项目站点
		这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能
		Manager比较喜欢,文档及统计数据自动生成,很好看。我们就不用学,以后自己研究

	pre-site 执行一些需要在生成站点文档之前完成的工作 
	site 生成项目的站点文档 
	post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 
	site-deploy 将生成的站点文档部署到特定的服务器上 












DOWN 返回