maven管理了所有jar包的导入
引用
即可Make->Ant->Maven->Gradle
以 “java源文件”、“框架配置文件”、“JSP”、“HTML”、“图片”等资源为“原材料”,“生产”一个可以运行的项目的过程
编译
搭建
部署
动态web工程-> 编译、部署 -> 编译结果
清理
将以前编译得到的就得.class字节码文件删除
编译
将.java源程序变成.class字节码文件
测试
自动测试,自动调用junit程序
报告
测试程序 执行的结果
打包
动态web工程 -> war包
java工程 -> jar包
安装
Maven特定概念——将打包得到的文件复制到 “仓库” 中的制定位置
部署
将动态Web工程生成的war包赋值到Servlet容器的制定目录下,使其可以运行
只要有 pom.xml
,Eclipse和IDEA都可以识别为Maven项目
Hello
| —src
| —main
| —java
| —resources
| —test
| —java
| —resources
| —pom.xml
要实现自动构建:
约定 > 配置 > 编码
Project Object Model:项目对象模型
pom.xml
与构建过程相关的一切设置都在这个文件
相当于 web.xml相对于动态Web工程
数学上的坐标
Maven的坐标
三个向量在仓库中唯一定位一个Maven工程
groupId
公司或组织域名倒序+项目名
<groupid>com.atguigu.mavengroupid>
artifactId
模块的名称
<artifactid>Helloartifactid>
version
版本
<version>1.0.0version>
Maven工程的坐标与仓库中路径的对应关系
<groupid>org.springframeworkgroupid>
<artifactid>spring-coreartifactid>
<version>4.0.0.RELEASEversion>
org\springframework\spring-core\4.0.0.RELEASE\spring-core-4.0.0.RELEASE
依赖
Maven解析依赖信息时,会到本地仓库中找依赖的jar包
三个取值
被定义为 | compile范围的依赖 | test范围的依赖 | provided范围的依赖 |
---|---|---|---|
对主程序是否可见 | 是 | 否 | 是 |
对测试是否可见 | 是 | 是 | 是 |
是否参与打包\部署 | 是 | 否 | 否 |
例子 | spring-core | junit | Tomcat:servlet-api.jar |
非
compile
范围的依赖不能传递
直接依赖
继承依赖
什么时候需要
排除
<dependency>
<exclusions>
<exclusion>
<groupId>groupId>
<artifactId>artifactId>
exclusion>
exclusions>
dependency>
查找groupId 和 artifactId
作用:解决模块工程之间的jar包冲突问题
自定义标签
统一声明版本号${自定义标签名}
引用声明<project>
<properities>
<atguigu.spring.version>atguigu.spring.version>
<自定义标签名>4.0.0.RELEASE自定义标签名>
properities>
project>
<dependencies>
<dependency>
<version>${atguigu.spring.version}version>
dependency>
dependencies>
分类
仓库中的内容——Maven工程
各个构建环节执行的顺序
Maven的核心程序中定义了抽象的生命周期
clean Lifecycle——构建之前的清理
Default Lifecycle——构建的核心部分
编译、测试、打包、安装、部署
Maven核心程序为了更好的实现自动化构建——
不论现在执行生命周期中的哪个阶段,都是从这个生命周期最开始的阶段开始
Site Lifecycle——生成项目报告、站点、发布站点
目标:生命周期的各个阶段仅定义了要执行什么
插件:相似的目标由特定的插件完成
生命周期阶段 | 插件目标 | 插件 |
---|---|---|
compile | compile | maven-compiler-plugin:3.1:compile |
test-compile | test-compile | maven-compiler-plugin:3.1:compile |
命令 调用 插件 实现 插件目标
需求:统一管理各个模块工程中对
junit[test范围的依赖]
依赖的版本
解决思路:
将
junit
依赖版本统一提取到 “父” 工程中,在子工程中声明依赖时,不指定版本,以父工程中统一设定的为准。
创建一个Maven工程为父工程
打包方式:pom
在子工程中声明对父工程的引用
<project>
<parent>
<groupId>com.atguigu.mavengroupId>
<artifactId>ParentartifactId>
<version>0.0.1-SNAPSHOTversion>
<relativePath>../Parent/pom.xmlrelativePath>
parent>
project>
将子工程的坐标中与父工程中重复内容删除
在父工程中统一junit的依赖
<project>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.0version>
<scope>testscope>
dependency>
dependencies>
dependencyManagement>
project>
在子工程中删除 junit 依赖的版本号部分
解决各个模块工程的安装——一键安装各个模块工程
配置方式
在一个 “聚合工程” 中配置各个参与聚合的模块
聚合工程——Parent
<project>
<modules>
<module>../HelloFriendmodule>
<module>../Hellomodule>
modules>
project>
使用方式:在聚合工程pom.xml上右键 -> Run as -> Maven Install
聚合时,Maven可识别各模块工程之间的依赖关系
mvn [plugin-name]:[goal-name]
执行与构建过程相关的Maven命令,必须进入pox.xml所在的目录
清理[项目名]\target 文件夹
阶段(不重要)
阶段(不重要)
阶段(不重要)
测试报告
单独启动某个带有main方法的class
阶段(不重要)
打包后的结果
<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.0modelVersion>
<name>Helloname>
<groupId>com.atguigu.mavengroupId>
<artifactId>HelloartifactId>
<version>0.0.1-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>HelloartifactId>
<version>4.0version>
<scope>testscope>
dependency>
dependencies>
project>
package com.atguigu.maven;
public class Hello{
public String sayHello(String name){
return "Hello "+name+"!";
}
}
package com.atguigu.maven;
import org.junit.Test;
import static junit.framework.Assert.*;//静态导入
public class HelloTest(){
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.satHello("litingwei");
assertEquals("Hello litingwei!",results);//Assert的一个静态方法
}
}
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.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>HelloFriendartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>HelloFriendname>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.0version>
<scope>testscope>
dependency>
<dependency>
<groupId>com.atguigu.mavengroupId>
<artifactId>HelloartifactId>
<version>0.0.1-SNAPSHOTversion>
<scope>compilescope>
dependency>
dependencies>
project>
HelloFriend
package com.atguigu.maven;
import com.atguigu.maven.Hello;
public class HelloFriend{
public static String sayHelloToFriend(String name){
Hello hello = new hello();
String str = hello.sayHello(name)+"I am " + this.getMyName();
System.out.println(str);
return str;
}
public String getMyName(){
return "John";
}
}
HelloFriendTest.java
package com.atguigu.maven;
import static org.junit.Assert.*;
import org.junit.Test;
import com.atguigu.maven.Hello;
public class HelloFriendTest{
@Test
public void testHelloFriend(){
HelloFriend helloFriend = new HelloFriend();
String results = helloFriend.sayHelloToFriend("litingwei");
assertEquals("Hello litingwei! I am John",results);
}
}
Hello根目录下 执行 mvn install
pom.xml
<dependencies>
<dependency>
<groupId>com.atguigu.mavengroupId>
<artifactId>HelloFriendartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
dependencies>
引用
,仅在Maven仓库中保留一份
MakeFriends.java
package com.atguigu.maven;
public class MakeFriends {
public String makeFriends(String name) {
HelloFriend friend = new HelloFriend();
friend.sayHelloToFriend("litingwei");
String str = "Hey" + friend.getMyName() + " make a friend please.";
System.out.println(str);
return str;
}
}
MakeFriendsTest
package com.atguigu.maven;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class MakeFriendsTest {
@Test
public void testMakeFriends() {
MakeFriends makeFriend = new MakeFriends();
String str = makeFriend.makeFriends("litingwei");
assertEquals("Hey,John make a friend please.",str);
}
}
问题:JDK默认1.5
解决
<profiles>
<profile>
<id>developmentid>
<activation>
<jdk>1.8jdk>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
properties>
profile>
profiles>
Maven的核心程序仅定义了抽象的生命周期,但具体的工作必须由特定插件完成,插件不在Maven的核心程序中
当执行的Maven命令需要用到某些插件,Maven核心程序会先到本地仓库中查找
本地仓库的默认位置:[当前用户的家目录]\.m2\repository
Maven核心程序如果在本地仓库中找不到所需插件,则会连接外网,到中央仓库下载
解决办法
修改默认本地仓库的位置
问题:下载速度慢
解决办法:插件下载路径修改为国内镜像
<mirrors>
<mirror>
<id>nexus-aliyunid>
<mirrorOf>centralmirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
mirrors>
File -> Settings :仅为当前项目配置
File -> New Project Settings:为所有项目
为所有项目配置
修改Maven核心程序位置
手动新建文件夹时,Maven不会自动识别,要手动将其标记为Maven文件目录结构
打开项目后会下载依赖到仓库,在 pom.xml
中引用插件
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
public class Hello {
public String sayHello(String name){
return "Hello " + name + "!";
}
}
public class HelloTest {
@Test
public void testHelloTest(){
Hello hello = new Hello();
String maven = hello.sayHello("Maven");
System.out.println(maven);
}
}
<packaging>warpackaging>
An artifact is an assembly of your project assets that you put together to test, deploy or distribute your software solution or its part. Examples are a collection of compiled Java classes or a Java application packaged in a Java archive, a Web application as a directory structure or a Web application archive, etc.
即编译后的Java类,Web资源等的整合,用以测试、部署等工作。再白话一点,就是说某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式。某个module有了 Artifacts 就可以部署到应用服务器中了
jar:Java ARchive,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便分发Java平台应用软件或库;
war:Web application ARchive,一种JAR文件,其中包含用来分发的JSP、Java Servlet、Java类、XML文件、标签库、静态网页(HTML和相关文件),以及构成Web应用程序的其他资源;
*exploded:在这里你可以理解为展开,不压缩的意思。也就是war、jar等产出物没压缩前的目录结构。建议在开发的时候使用这种模式,便于修改了文件的效果立刻显现出来。
tomcat/conf/logging.properties
java.util.logging.ConsoleHandler.encoding = GBK
指定Maven核心程序的位置——用自己安装的
指定本地仓库的位置
指定conf/settings.xml位置,进而获取本地仓库的位置
打包方式区分 java工程 与 Web工程
web.xml 又称部署描述符
去掉Dynamic Web Module -> Apply ->
勾选Dynamic Web Module ->Further cofiguration available
eclipse做法
Maven做法
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.1.3-b06version>
<scope>providedscope>
dependency>
dependencies>
servlet-api.jar为provided范围的依赖
依赖默认为compile范围
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<project>
<build>
<finalName>[工程名]finalName>
<plugins>
<plugin>
<groutId>org.codehaus.cargogroutId>
<artifactId>cargo-maven2-pluginartifactId>
<version>1.2.3version>
<configuration>
<container>
<containerId>tomcat8xcontainerId>
<home>[tomcat Home路径]home>
container>
<configuration>
<type>existingtype>
<home>[tomcat Home路径]home>
<properities>
<cargo.servlet.port>8090cargo.servlet.port>
properities>
configuration>
configuration>
<executions>
<exexution>
<id>cargo-runid>
<phase>installphase>
<goals>
<goal>rungoal>
goals>
exexution>
executions>
plugin>
plugins>
build>
project>
eclipse工程必须有的配置文件
- .settings
- .classpath
- .project
只要有pom.xml的工程都可作为maven工程导入
建在工作区外的Maven工程 Eclipse无法将其复制到工作区
Maven build——Maven构建
项目中的依赖必须在Maven中找到