maven的学习:
优势:
1.可以添加依赖,避免了自己下载导入jar包 注意:maven 添加了核心jar包 其依赖包也将被添加。
2.热编译 热部署 意思就是,在你web项目已经运行的时候,修改代码的能直接被web服务器所接受,
就不需要你 重启服务器了,或者重新部署代码了。
3.你可以直接通过maven 打包war或者jar项目。
4.可以实现项目的拆分和聚合。
格式:
公司名称+项目名称+版本+范围(可加可不加)
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<scope></scope>
一,maven的命令
mvn xx
1.clean清理 (将根目录的target目录清理掉 内容为.class文件)
2.compile 编译 将.java文件编译为.class文件
3.test 测试 将src/test/java 目录下的所有单元测试类都进行编译并执行 注:类名必须为xxTest结尾
4.package 打包 web项目打包成war包 java项目打包为jar包 目录为target目录
5.install 安装 解决多个项目共用一个jar包 将jar包存入本地仓库
二,maven的生命周期
三套生命周期 每套生命周期相互独立 互不影响。执行后面的命令前面的命令都执行
1.cleanLifeCycle:清理生命周期
clean
2.deafaultLifeCecle:默认生命周期
compile test package install deploy
3.siteLifeCycle:站点生命周期
site
三,依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.7</version>
</dependency>
</dependencies>
其中,<groupId> </groupId>和<artifactId></artifactId>被称为“坐标”,是为了保证maven仓库的唯一性而定义的。<groupId> </groupId>一般由两部分组成,域(com,cn,org)加公司名。<artifactId></artifactId>项目名,version为版本号。
Dependency Scope
在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:
* compile,缺省值,适用于所有阶段,会随着项目一起发布。
* provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
* runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
* test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
* system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中。让我们详细看一下每一种范围:
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范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
system (系统范围)
system范围依赖与provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。
依赖继承和依赖传递
1.继承:在Maven中,子项目是可以继承父项目中的依赖的,比如说我们有一个父项目maven-parent,该父项目拥有一个子项目A,如果在父项目中依赖了junit,
那么在子项目A中即便是没有引入junit,在子项目中仍然能够使用junit,因为子项目天然继承了父项目中的junit依赖。
2.传递:?在Maven中,依赖是可以传递的,就是说假设存在三个项目,分别是项目A,项目B以及项目C,假设C依赖于B,B依赖于A,那么我们可以根据Maven项目依赖的特征不难推出项目C也依赖于A。
3.4依赖排除
依赖由于可以传递,假设有三个项目,分别是项目A,项目B依赖于项目A,项目C依赖于项目B,则在项目B的依赖中会有项目A,为了只依赖
项目B,不依赖项目A,就需要排除依赖。例如
<dependency>
<groupId>B</groupId>
<artifactId>**</artifactId>
<version>**</version>
<exclusions>
<exclusion>
<groupId>A</groupId>
<artifactId>**</artifactId>
</exclusion>
</exclusions>
</dependency>
四,项目拆分和聚合
父工程:也是一个pom工程,项目需要的依赖信息(控制maven依赖的版本信息),在父工程上定义,子模块来继承父工程。将各个子模块聚合在一起。
子工程:moudel工程,和字面意思差不多,就是父工程的模块。
下面演示一下。
创建父工程
new maven工程。选择Create a simple project
打包的类型选择为pom类型。finash。
此时maven父工程就创建好了。
打开pom.xml,添加依赖的版本控制。
properties 可以写入版本号,在dependencyManagement中取出。
dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。
jar的版本判断的两种途径
1:如果dependencies里的dependency自己没有声明version元素,那么maven就
会倒dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果
没有就会报错,告诉你必须为dependency声明一个version
2:如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
<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.maven</groupId>
<artifactId>testMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<junil.version>4.12</junil.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
这里并不会真正的引入jar包,只是父工程对总共工程起到统一依赖版本的作用。
创建子工程
右键父工程
选择Maven Moudule项目 next
选择creat a simple pro next
可以看到父工程和项目名都是父工程。finash
可以看到testMaven-dao成为了父工程的一个模块。
再看父工程的pom文件
再新建一个testMaven-web, testMaven-service.
这就实现了项目的聚合。
运行方式:Maven方式:
配置tomcat插件
在父工程pom文件加入
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
方式1:运行父工程(tomcat:run)。父工程会自动将各个子模块聚合到一起。将web打war包发布到tomcat
方式2:直接运行web工程(tomcat:run)
方式3:使用本地tomcat将web工程add到tomcat启动。