1.Maven的入门
1.1Maven的介绍
Maven是一个项目管理工具和自动化构建工具,还可以管理Jar包的依赖
Maven的读音:麦文、妹文
项目管理工具:Ant—Maven—Gradle
1.2Maven的作用
作用一: 项目管理【Project Object Management】
作用二: 项目自动化构建,[一键完成 清理编译-测试-打包-部署]
作用三: Jar包依赖管理
1.3Maven的好处
好处一:maven支持多种平台,windows/linux/mac
好处二: maven便于项目团队开发,适合大中型项目
好处三:可以节省磁盘空间和简化jar包管理
1.4Maven的安装
第一步:解压到指定的目录
D:\devsoft\apache-maven-3.6.3
第二步:配置maven的环境变量
M2_HOME=D:\devsoft\apache-maven-3.6.3
Path=;%M2_HOME%\bin
第三步:测试是否成功:
cmd: mvn -version
1.5Maven项目目录结构
项目名
src
-
main----------------------业务逻辑代码和业务逻辑代码所需要的配置文件的
- java----------------=–业务逻辑代码
- resources--------------业务逻辑代码所需要的配置文件
-
test----------------------存放测试代码和测试代码所需要的配置文件的
- java-------------------存放测试代码 resources--------------测试代码所需要的配置文件的
- pom.xml:相当于动态web工程的web.xml,在pom文件配置项目的坐标和依赖信息
1.6Maven的常用命令
mvn clean: 清理当前项目下的target目录
mvn compile:将src/main/java目录里面的java代码编译
mvn test:执行src/test/java目录里面的测试代码的
mvn package:将当前项目打成对应的包【Jar包、War包、Pom包】
mvn install:将当前项目打成对应的包扔到本地仓库中。
mvn deploy:将本地仓库对应的包部署到私服上。
mvn site: 用来生成项目的站点信息,了解。
1.7Maven的第一个案例
Maven程序的目录结构:
- src/main/java —— 存放项目的.java文件
- src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件
- src/test/java —— 存放所有测试.java文件,如JUnit测试类
- src/test/resources —— 测试资源文件
- target —— 项目输出位置[编译后可以自动生成]
- pom.xml相当于web.xml
1.7.1首先建立Hello项目同时建立Maven约定的目录结构
Hello
–src
-----main
---------java
---------resources
-----test
---------java
---------resources
–pom.xml
1.7.2在项目Hello根目录建立pom.xml
<?xml version="1.0" ?>
<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.offcn.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
1.7.3在src/main/java/com/offcn/maven目录下新建文件Hello.java
package com.offcn.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
1.7.4在/src/test/java/com/offcn/maven目录下新建测试文件HelloTest.java
package com.offcn.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("litingwei");
assertEquals("Hello litingwei!",results);
}
}
1.7.5测试
①打开cmd命令行,进入Hello项目根目录(pom.xml文件所在目录)执行 mvn compile命令,查看根目录变化
②cmd 中继续录入mvn clean命令,然后再次查看根目录变化
③cmd 中录入 mvn clean compile命令, 查看根目录变化
④cmd 中录入 mvn clean test命令,查看target目录变化
⑤cmd 中录入 mvn clean package命令,查看target目录变化
2.Maven的依赖
2.1Maven的仓库划分
Maven的仓库:说白了,就是存放Jar包的一个文件夹
Maven的仓库划分: 本地仓库、远程仓库【私服、镜像仓库、中央仓库】
2.2本地仓库
本地仓库:在当前计算机上的一个存放Jar包的文件夹【目录】
Maven本地仓库:
默认位置:参考maven安装目录/conf/settings.xml/ Default: ${user.home}/.m2/repository
修改本地仓库位置:
2.3Maven的镜像仓库
阿里云镜像
在maven安装目录/conf/settings.xml文件中找一个mirrors标签:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
2.4Maven的坐标
平面坐标:(x,y):平面坐标就是确定平面上一个点的
几何坐标:(x,y,z)几何坐标是用来确定空间中一个点
Maven坐标:简称为GAV坐标,确定当前项目打成的Jar包在本地仓库的位置。
<groupId>com.offcn.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
写法:
groupId:公司域名反写.项目名
artifactId:项目名_模块名|模块名
version: 0.0.1-SNAPSHOT
2.4.1Maven坐标和依赖的区别
Maven坐标:用来确定当前项目打成的Jar包在本地仓库的位置的。一个项目只有一个坐标
<groupId>com.offcn.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
Maven的依赖:用来引入当前项目所需要的Jar包,一个项目可以引入多个依赖信息。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
2.4.2Maven坐标找Jar包
确定Jar所在目录: groupId+ artifactId+ version
Com/offcn/maven/ Hello/0.0.1-SNAPSHOT/
确定Jar包名称:artifactId- version
Hello-0.0.1-SNAPSHOT.jar
2.4.3由Jar包写出Maven坐标
3.Maven的第二个项目
3.1新建第二个项目模块目录及约定的目录结构
HelloFriend
–src
-----main
---------java
---------resources
-----test
---------java
---------resources
–pom.xml
3.2在项目HelloFriend根目录建立pom.xml
<?xml version="1.0" ?>
<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.offcn.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>HelloFriend</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.offcn.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
3.3在src/main/java/com/offcn/maven目录下新建文件HelloFriend.java
package com.offcn.maven;
import com.offcn.maven.Hello;
public class HelloFriend {
public 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";
}
}
3.4在/src/test/java/com/offcn/maven目录下新建测试文件HelloFriendTest.javapackage com.offcn.maven;
package com.offcn.maven;
import org.junit.Test;
public class HelloFriendTest {
@Test
public void testHelloFriend(){
HelloFriend helloFriend = new HelloFriend();
String str = helloFriend.sayHelloToFriend("litingwei");
System.out.println(str);
}
}
3.5在HelloFriend目录下执行命令mvn package
系统报错说没有找到依赖。所有依赖的JAR包都应该正确安装到当前的Maven仓库中才能够使用,换句话说,Maven项目都是到当前仓库中去寻找它所依赖的JAR包的。
3.6需要重新构建Hello第一个项目并安装到数据仓库,在命令行Hello根目录下执行mvn clean install
3.7重新在HelloFriend目录下执行命令mvn package
3.8执行其他常用命令:site
通过第二个Maven项目实现了项目之间的通信,当然这个通信是伪通信,和我们直接给动态web工程导入一个Jar包是类似的
注意点:引入本地仓库的hello.jar包
3.9去哪儿找常用的Jar包依赖
https://mvnrepository.com/【建议使用】
http://search.maven.org/
4.Maven和eclipse整合
4.1整合
第一步:在Eclipse中配置Maven
第二步:
4.2Maven项目类型
jar工程:当一个项目A需要被其它项目依赖的时候,项目A就打成Jar包,
pom工程: 当一个工程是父工程或者聚合工程,就打成pom包
war工程:当项目需要部署到tomcat服务器运行的时候,就打成war包
4.3在Eclipse中创建Maven项目
鼠标右键-new-maven project—
4.4如何在eclipse中使用maven命令
4.5Maven中创建项目遇到问题
问题一:
web.xml is missing and is set to true
缺少web.xml文件
解决方案:右键项目—JavaEE tools-Generate Deployment Descriptor Stub
问题二:
The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
解决方案:在项目的pom.xml文件中加入如下依赖
<!-- jsp-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
问题三:Jdk问题
第一种:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
第二种方式:在maven安装目录的conf/settings.xml文件中配置:
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<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>
</profile>
重启eclipse,再次创建项目的时候,就好使用Jdk1.8.
问题四: JDK问题
错误:on a JRE rather than a JDK
Eclipse中的JDK配置有问题,配置成了JRE的目录,改成JDK目录就可以了。
问题五:
-Dmaven.multiModuleProjectDirectory system property is not set.
Check $M2_HOME environment variable and mvn script match.
Windows系统maven环境变量的键:M2_HOME就可以了
4.6补充一:tomcat插件配置
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/ssm</path>
<port>8888</port>
</configuration>
</plugin>
</plugins>
</build>
项目右键-run asmaven build… ,输入: tomcat7:run
4.7Jar包的依赖
Jar包依赖具有传递性,Jar包依赖传递的特点:
相同Jar包,只是版本号不同,路径不同,以路径短着优先
相同Jar包,只是版本号不同,路径相同,以先声明者优先
Jar包冲突解决的三种方案:
- 相同Jar包,只是版本号不同,路径相同,以先声明者优先
- 相同Jar包,只是版本号不同,路径不同,以路径短着优先
- 排除法:
<dependency>
<groupId>com.offcn.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<!-- 每个exclusion都对应一个要排除的Jar包 -->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
4.8Maven生命周期[了解]
Clean生命周期: 完成项目清理工作
mvn pre-clean
mvn clean
mvn post-clean
default生命周期:完成项目的编译、测试、打包、部署操作
mvn compile
mvn test
mvn package
mvn install
mvn deploy
site生命周期: 完成项目的站点相关操作
mvn pre-site
mvn site
mvn post-site
注意:每个生命周期的命令在执行的时候,默认都会从当前生命周期的第一个命令开始执行。
4.9父工程
父工程:父工程打成pom包,父工程用来管理子工程的Jar包版本号信息,不做实际依赖。
是通过dependencyManagement标签dependencies标签—
父工程pom文件
<properties>
<log4j.version>4.0.0.RELEASE</log4j.version>
</properties>
<!-- 在父工程中,dependencyManagement标签做Jar包版本的管理,不做实际依赖。 -->
<dependencyManagement>
<dependencies>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
子工程pom文件
<artifactId>son1</artifactId>
<parent>
<groupId>com.offcn</groupId>
<artifactId>parent01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent01/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
注意:子工程知道自己的父工程是哪个,但是父工程不知道自己有哪些子工程。
4.10聚合工程
聚合工程:打成pom包,聚合工程是用来管理其它工程的。
聚合工程的pom文件
<!-- modules标签里面可以有多个module标签,每个module标签代表聚合工程管理的一个工程 -->
<modules>
<module>../app01/pom.xml</module>
<module>../app02/pom.xml</module>
<module>../app04/pom.xml</module>
</modules>
注意:在实际开发中,一个项目作为父工程使用的时候同时也会作为聚合工程使用!
4.11依赖的范围[了解]
scope:
compile:默认值,表示该jar包在编译期、测试期、运行期都有效
test: 表示该Jar包在测试期有效
provided: 表示该Jar包在编译期、测试期有效。
5.Maven整合SSM[重点]
将现有的SSM项目改成由Maven管理的SSM项目:
1.导入Jar包的依赖
2.将ssm项目中的代码拷贝到maven项目的src/main/java
3.将ssm项目中的配置文件拷贝到maven项目的src/main/resources
4.将页面和web.xml文件拷贝到maven项目的src/main/webapp目录下
6.使用Maven进行SSM的分层开发【难点】
Bean代码—ssm_bean
Dao层代码、mybatis配置文件、dao层jar包依赖—ssm_dao
Service代码、service配置文件、service层的jar包依赖—ssm_service
Controller代码、controller层配置文件、controller层的jar包依赖、页面、web.xml—>ssm_web
Ssm_parent: jar包版本依赖信息
7.私服
nexus.bat install
nexus.bat start
启动失败时修改:
bin/jsw/conf/wrapper.conf文件
将15行的wrapper.java.command=java修改为:wrapper.java.command=java.exe所在的位置
nexus默认是使用jetty服务器的,在conf/nexus.properties文件中我们就可以看到,
nexus启动后默认访问:http://localhost:8081/nexus
登录私服【nexus】:
用户:admin
密码:admin123
仓库的类型:
virtual:虚拟仓库,不起作用
proxy:代理仓库,两个
Hosted 宿主仓库, 本地仓库
Group : 就是自己不知道下载的jar包是snapshot还是release版本的时候使用!
将自己的项目发布到私服上,如何发布呢?
执行deploy命令,前提是在当前项目的pom.xml文件中配置了私服的地址:
添加到settings.xml中
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
添加到pom.xml中
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
--------下载--------
添加到settings.xml中
<profile>
<!--profile的id-->
<id>dev</id>
<repositories>
<repository>
<!--仓库id,repositories可以配置多个仓库,保证id不重复-->
<id>nexus</id>
<!--仓库地址,即nexus仓库组的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<!--是否下载releases构件-->
<releases>
<enabled>true</enabled>
</releases>
<!--是否下载snapshots构件-->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>