01.Maven入门基础

项目管理工具:

构建项目使用
	Ant--->Maven--->Gradle

	ANT:build.xml

	Maven:pom.xml

	Gradle:

1:Maven的安装

  • A:解压压缩包到某一目录中。

  • B:配置环境变量

     M2_HOME:D:\WorkSpace_Eclipse\apache-maven-3.2.5(类似Java_Home)
    
     path:    加入D:\WorkSpace_Eclipse\apache-maven-3.2.5\bin
    
  • C:cmd窗口:输出mvn -version:如果有提示信息,表示安装成功。

2:目录结构:

bin

conf目录:setting.xml:Maven的配置文件。


	A:更改Maven的本地仓库的路径:

	本地仓库:Maven用于存放从网络中下载的jar与插件的存放目录。
	<localRepository>D:/WorkSpace_Eclipse/apache-maven-repository</localRepository>

3:Maven与IDE(MyEclipse)结合:

A:更改MyElipse的默认Maven。Preferences---->MyEclipse---->Maven--->Installing
	添加本地的Maven的安装目录。

B:更改MyElipse的默认Maven。Preferences---->MyEclipse---->Maven4--->User Setting File:
	更改为Maven目录的settting.xml的路径。

4:可以MyEclipse创建一个简单的Maven工程。

Java工程/WEB工程的约定:

Maven 提倡“约定优于配置”(Convention Over Configuration),这是 Maven最核心的设计理念之一。

原因之一就是使用约定可以大量减少配置。

a) 源码目录为 src/main/java/

b) 源码资源目录(配置文件)为 src/main/resources/

c) 测试目录为 src/test/java/

d) 测试资源目录为 src/test/resources/

e) 编译输出目录为 target/classes/

f) 打包方式为 jar/war

g) 包输出目录为 target/

h) 超级 pom

    超级 pom 定义以上的目录结构、核心插件设定版本。Maven 设定核心插件的原因,

    是防止由于插件版本的变化而造成构建的不稳定。

    遵循约定虽然损失了一定的灵活性,用户不能随意安排目录结构,但是却能减少配置。

    更重要的是,遵循约定能够帮用户遵循构建标准。个性往往意味着牺牲通用性,

    意味着增加无谓的复杂度。

工程目录(main中的java/resource与test中的java/resource是源文件夹,不是文件夹。)

	src
		main
			java:			放java的源文件
			resources		放配置文件。
			webapp
				WEB-INF
				web.xml
		test
			java			放测试javar的源文件
			resources		放测试的的配置文件。


		pom.xml				工程模型配置文件。

			
	target或者target-eclipse	
		classes

5:用MyEclipse来创建Maven工程。

骨架(模板)

GAV(坐标)
	Group Id


	

Java工程
	1:新建一个Java Maven Project,设定相应的坐标(坐标一开始可以默认)

	2:新建Maven工程时,Maven第一次会从中央仓库中下载所需要用到的jar包与插件。

	中央仓库:提供Maven构建java工程所需要用到的依赖与插件。
	
	3:Maven默认只会创建2个源文件夹。
	   
	   新建Source Folder的操作,创建src/main/resources和src/test/resource两个文件夹。

	4:在src/main/java下面新建包和java

	5:配置文件放在src/main/resources

	6:测试Java类是否正确读取配置文件。

6:镜像的设置

Maven中默认都是从中央仓库下载依赖jar包的。

更改镜像地址:setting.xml中配置镜像,加快下载的速度
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>			central不能改动。
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror> 	

Maven的依赖搜索:
https://mvnrepository.com/

7:pom.xml

坐标定义:(GAV):通过一个坐标定位到唯一的依赖。

	<groupId>com.dfrz</groupId>				G	公司或者组的定义。	
	<artifactId>Maven_01</artifactId>			A	项目或者模块名称定义
	<version>0.0.1-SNAPSHOT</version>			V:	版本定义

GAV:坐标


SNAPSHOT--->Alpha--->Beta--->Release----GA

SNAPSHOT:内部开发版本

Alpha:   内部公测版本

Beta:    对外公开的测试版本

Release: 可以使用的版本

GA:	 稳定版本

<packaging>jar</packaging>				运行maven的package命令时,该工程会打包为一个java

maven中通过GAV形成坐标。

8:坐标和依赖

//Maven工程中的依赖:从本地仓库中寻找。如果本地仓库中寻找不到,再找网络仓库(中央仓库)中寻找。
<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>3.8.1</version>
		<scope>test</scope>
	</dependency>
</dependencies>

4.1:scope取值

	maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,
	所以maven中的依赖关系有作用域(scope)的限制。在maven中,scope包含如下的取值:

	compile(编译范围)
		compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。
		编译范围依赖在所有的classpath中可用,同时它们也会被打包。

	provided(已提供范围)
		provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。
		例如,如果你开发了一个web应用,
		你可能在编译classpath中需要可用 的Servlet API来编译一个servlet,
		但是你不会想要在打包好的WAR中包含这个Servlet API;
		这个Servlet API JAR由你的应用服务器或者servlet容器提供。
		已提供范围的依赖在编译classpath(不是运行时)可用。
		它们不是传递性的,也不会被打包。

	runtime(运行时范围)
		runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。
		比如,你可能在编译的时候只需要JDBC API JAR,
		而只有在运行的时候才需要JDBC驱动实现。

	test(测试范围)
		test范围依赖 在一般的 编译和运行时都不需要,
		它们只有在测试编译和测试运行阶段可用。
		测试范围依赖在之前的中介绍过。

	
	重要点:
		compile/runtime/system:会进行依赖传递

		provided/test:	 不进行依赖传递。

	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.17</version>
		<scope>compile</scope>
	</dependency>


	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>servlet-api</artifactId>
		<version>2.5</version>
		<scope>provided</scope>
	</dependency>

	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.38</version>
		<scope>runtime</scope>
	</dependency>

	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.10</version>
		<scope>test</scope>
	</dependency>


	<dependency>
		<groupId>p6spy</groupId>
		<artifactId>p6spy</artifactId>
		<version>2.1.3</version>
		<scope>system</scope>
		<systemPath>${basedir}/lib/p6spy-2.1.3.jar</systemPath>
	</dependency>

	尽量少用system.

4.1:使用dependency来下载中央仓库中存在的jar

	从中央仓库下载的jar,在本地仓库中存放是按照GAV的组合方式创建文件夹目录来存放。

	jar包命名:artifactId + version.jar的命名方式。

4.2:中央仓库中不存在的jar,可以通过手工安装到本地仓库,然后再进行引用。

	A:手工安装:
		按照GAV的方式在仓库中建立对应的文件夹。
		
		jar文件的命名:A-V.jar

	B:使用命令安装。
		
mvn install:install-file -Dfile=D:\SoftWare_勿删\common_lib\SQLServer\sqljdbc_2005.jar -DgroupId=com.dfrz -DartifactId=sqlserver -Dversion=2005 -Dpackaging=jar  -DgeneratePom=true -DcreateChecksum=true

mvn install:install-file -Dfile=C:\Users\study\Downloads\ph-bdve-5.2.7.jar -DgroupId=com.dfrz.java1903 -DartifactId=ph-bdve -Dversion=5.2.7 -Dpackaging=jar  -DgeneratePom=true -DcreateChecksum=true

该命令放到cmd控制台中执行。

4.3:Maven对于工程的命令的操作。

	compile
	
	test

	package:对工程打包。默认存放工程的taget目录下。
		jar包的命名:artifactId-version.jar

	install:将jar安装到本地仓库中。

	deploy:将jar或者war包,部署到容器(Tomcat)中。

	clean:清空target目录下的class

	命令可以组合一起使用 package install

	clean package
	package install


	<?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>com.dfrz.java1809</groupId>
		<artifactId>Maven_Java_02</artifactId>
		<version>0.0.2</version>
		<packaging>jar</packaging>


		<name>Maven_Java_02</name>
		<!-- FIXME change it to the project's website -->
		<url>http://www.example.com</url>

		<properties>
			<project.build.sourceEncoding>
				UTF-8
			</project.build.sourceEncoding>
			<maven.compiler.source>1.7</maven.compiler.source>
			<maven.compiler.target>1.7</maven.compiler.target>
			<maven.compiler.compilerVersion>
				1.7
			</maven.compiler.compilerVersion>
		</properties>
		<!-- 配置依赖jar包。 -->
		<dependencies>
			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>4.11</version>
				<scope>test</scope>
			</dependency>

			<dependency>
				<groupId>com.google.code.gson</groupId>
				<artifactId>gson</artifactId>
				<version>2.3.1</version>
			</dependency>

			<dependency>
				<groupId>jstl</groupId>
				<artifactId>jstl</artifactId>
				<version>1.2</version>
			</dependency>

			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>servlet-api</artifactId>
				<version>2.5</version>
				<scope>provided</scope>
			</dependency>

			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>5.1.38</version>
				<scope>runtime</scope>
			</dependency>

			<!-- 这是原始使用system的方式 
				<dependency>
				<groupId>p6spy</groupId>
				<artifactId>p6spy</artifactId>
				<version>2.1.3</version>
				<scope>system</scope>
				<systemPath>
				D:/SoftWare_勿删/common_lib/p6spy/p6spy-2.1.3.jar
				</systemPath>
				</dependency>
			-->

			<!-- 将p6spy安装到本地仓库的写法 -->
			<dependency>
				<groupId>com.dfrz</groupId>
				<artifactId>p6spy</artifactId>
				<version>2.1.3</version>
			</dependency>

			<dependency>
				<groupId>com.dfrz</groupId>
				<artifactId>sqlserver</artifactId>
				<version>2005</version>
			</dependency>
		</dependencies>


		<build>
			<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
				<plugins>
					<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
					<plugin>
						<artifactId>maven-clean-plugin</artifactId>
						<version>3.1.0</version>
					</plugin>
					<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
					<plugin>
						<artifactId>maven-resources-plugin</artifactId>
						<version>3.0.2</version>
					</plugin>
					<plugin>
						<artifactId>maven-compiler-plugin</artifactId>
						<version>3.8.0</version>
					</plugin>
					<plugin>
						<artifactId>maven-surefire-plugin</artifactId>
						<version>2.22.1</version>
					</plugin>
					<plugin>
						<artifactId>maven-jar-plugin</artifactId>
						<version>3.0.2</version>
					</plugin>
					<plugin>
						<artifactId>maven-install-plugin</artifactId>
						<version>2.5.2</version>
					</plugin>
					<plugin>
						<artifactId>maven-deploy-plugin</artifactId>
						<version>2.8.2</version>
					</plugin>
					<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
					<plugin>
						<artifactId>maven-site-plugin</artifactId>
						<version>3.7.1</version>
					</plugin>
					<plugin>
						<artifactId>
							maven-project-info-reports-plugin
						</artifactId>
						<version>3.0.0</version>
					</plugin>
				</plugins>
			</pluginManagement>
		</build>
	</project>

5:工程中间Jar的引用

依赖冲突的问题











工程不同版本的引用
	
	使用GVA来引用工程。/通过版本的控制

A(02)				B:(03)			C:(04)
log4j-1.2.11(compile)		log4j-1.2.12		|
							|
							A
							|
							log4j-1.2.11




D:引入了A与B两个工程。
	由于A与B都拥有log4j的版本。谁先依赖,就引入相应的jar包。

   引入了B与C两个工程
	根据层级来判断。B寻找到log4j只需要一级,C找到Log4j需要2级。

	所以引入是B依赖的log4j的版本。


	


Maven自动判断

	不同深度:路径优先级

	相同深度:按依赖的先后顺序



手工判断(推荐):

	A:排除依赖管理
		<dependency>
			<groupId>com.test</groupId>
			<artifactId>maven_02</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<exclusions>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	
	B:在pom.xml中指定具体引用的版本。
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>

	C:通过继承的方式。在父类的pom中统一所有jar包的版本。子maven工程从父工程继承。

常用的jar引用

javax.servlet
servlet-api
2.5
provided

	<dependency>
		<groupId>javax.servlet.jsp</groupId>
		<artifactId>jsp-api</artifactId>
		<version>2.1</version>
	</dependency>

	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>jstl</artifactId>
		<version>1.2</version>
	</dependency>

	<!-- commons相关的jar包 -->
	<dependency>
		<groupId>commons-beanutils</groupId>
		<artifactId>commons-beanutils</artifactId>
		<version>1.9.3</version>
	</dependency>

	<dependency>
		<groupId>commons-dbutils</groupId>
		<artifactId>commons-dbutils</artifactId>
		<version>1.3</version>
	</dependency>


	<dependency>
		<groupId>commons-fileupload</groupId>
		<artifactId>commons-fileupload</artifactId>
		<version>1.3.2</version>
	</dependency>

	<dependency>
		<groupId>com.google.code.gson</groupId>
		<artifactId>gson</artifactId>
		<version>2.3.1</version>
	</dependency>


	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.38</version>
	</dependency>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.18</version>
	</dependency>


	<dependency>
		<groupId>dom4j</groupId>
		<artifactId>dom4j</artifactId>
		<version>1.6.1</version>
	</dependency>

	<dependency>
		<groupId>jaxen</groupId>
		<artifactId>jaxen</artifactId>
		<version>1.1.6</version>
	</dependency>

	<dependency>
		<groupId>org.apache.struts</groupId>
		<artifactId>struts2-core</artifactId>
		<version>2.3.31</version>
		<exclusions>
			<exclusion>
				<artifactId>javassist</artifactId>
				<groupId>javassist</groupId>
			</exclusion>
		</exclusions>

	</dependency>

	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-core</artifactId>
		<version>4.3.11.Final</version>
	</dependency>


	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aop</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aspects</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-beans</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context-support</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-expression</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-orm</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-tx</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>

	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>4.3.6.RELEASE</version>
	</dependency>


	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.4.6</version>
	</dependency>

	<dependency>
		<groupId>org.apache.openjpa</groupId>
		<artifactId>openjpa-all</artifactId>
		<version>2.2.0</version>
	</dependency>


	
	小知识点:
	可以将Spring的版本定义为一个变量。然后在dependency中引用变量的值。
	<properties>
		<spring-version>4.3.0.RELEASE</spring-version>
	</properties>

openjpa
	<dependencies>
		<dependency>
			<groupId>org.apache.openjpa</groupId>
			<artifactId>openjpa-all</artifactId>
			<version>2.2.0</version>
		</dependency>
	</dependencies>	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值