文章目录
什么是Maven?
目前无论使用IDEA还是Eclipse等其他IDE,都使用里面ANT工具,ANT工具帮助我们进行编译,打包等工作
Apache基于ANT进行升级,研发出了全新的自动化构建工具Maven
Maven项目管理工具,编译打包等工作
maven.apache.org
tomcat.apache.org
Maven使用(POM-Project Object Model,项目对象模型)pom.xml 来管理项目构建,
在Maven中每个项目都相当于是一个对象,对象(项目)和对象之间是有关系的,
关系包含:依赖,继承,聚合,实现Maven项目可以更加方便的实现导jar包,拆分项目等效果
相当于nodejs的npm
IDEA 配置Maven
mac下查找maven全局配置文件
softwaredeMacBook-Pro:3.6.3_1 software$ which mvn
/usr/local/bin/mvn
softwaredeMacBook-Pro:3.6.3_1 software$ ls -l /usr/local/bin/mvn
lrwxr-xr-x 1 software admin 31 12 2 22:42 /usr/local/bin/mvn -> ../Cellar/maven/3.6.3_1/bin/mvn
softwaredeMacBook-Pro:3.6.3_1 software$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 13.0.2, vendor: N/A, runtime: /usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"
全局config配置文件就在 Maven home下:
softwaredeMacBook-Pro:conf software$ pwd
/usr/local/Cellar/maven/3.6.3_1/libexec/conf
softwaredeMacBook-Pro:conf software$ ls
logging settings.xml toolchains.xml
当找不到用户配置文件~/.m2/settings.xml,就会用默认的全局配置文件
生成.m2文件夹
mvn help:system ,会在.m2文件夹下,生成repository文件夹
1.生成.m2文件夹后,没有settings.xml
2.拷贝全局的settings.xml,到~/.m2/下
maven 仓库
远程仓库
1.中央仓库:
mvnrepository.com
2.本地私服仓库:
公司内网提供的仓库
本地仓库
在本机中的仓库,用来缓存从远程仓库下载下来的jar包
仓库配置
~/.m2/settings.xml
本地仓库配置
<localRepository>/Users/software/.m2/repository</localRepository>
远程仓库配置
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<!-- https://maven.aliyun.com/repository/public/ -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
maven查找仓库优先级
本地仓库->配置文件中指定的仓库中->mirror仓库->(全局配置文件)默认中央仓库找
maven配置jdk信息
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
maven 构建工程类型
1.POM工程
POM工程是逻辑工程,用在父级工程或聚合工程中,用来做jar包的版本控制 — 主要用于管理项目
2.JAR工程
将会打包成jar,用作jar包使用,即常见的本地工程—>java Project
3.WAR工程
将会打包成war包,发布到服务器上的工程
IDEA中使用maven
maven项目目录结构
名称不要随意更改,maven会根据文件夹名称来编译
target编译好的文件存在哪里?
本地仓库
softwaredeMacBook-Pro:HelloMaven software$ pwd
/Users/software/.m2/repository/com/wuyuhong/HelloMaven
Maven项目依赖关系
在maven项目中每个项目都相当于一个对象,对象和对象之间是有关系的,包含:依赖,继承,聚合
实现Maven项目可以方便的时间导jar包,拆分项目等效果
依赖关系
A工程需要B工程提供支持
A依赖B(也就是导jar包)
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.3</version>
</dependency>
</dependencies>
当两个包冲突时,maven会自动解决包冲突问题
IDEA 2020,没有自动导包的设置:
1.可以手动快捷键:
我的是:CMD+Shift+I
2.当pom.xml更改后,会出现一个更新的图标
依赖的传递性
项目2 依赖项目1 ,项目1依赖Mybatis,依赖的传递性,项目2可以直接使用Mybatis工程
依赖的两个原则
1.最短优先原则
A->B-C-D(2.0)
A->E-D(1.0)
那么A使用D(1.0)
2.最先声明原则
当依赖路径长度是一样的,谁先在Pom文件中先申明,就使用谁
3.排除依赖
MavenHello项目中排除依赖的HelloMaven项目中mybatis
<dependencies>
<dependency>
<groupId>com.wuyuhong</groupId>
<artifactId>HelloMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
依赖范围
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${jar_version}</version>
<scope>compile</scope>
</dependency>
scope:
compile:Default,表示该依赖在编译和运行时有效
provided:已提供依赖范围,项目中依赖了Servlet的相关jar包,打成
war包后,但Tomcat已经有相关的Servlet jar,此时jar包冲突了
runtime:只是在运行时有效,ex:jdbc,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或运行项目的时候才需要实现上述接口的具体JDBC驱动
system:
系统范围与provided类似,不想使用本地仓库的,也不想使用远程中央仓库的,只想使用 本地某个文件夹下的jar包
system
XXX/XXX
test:
Junit.jar包,只在测试范围有效,生产环境不需要
import:
定义一个父工程HelloMaven—> POM工程
dependencyManagement :相当于管理工程
管理统一的jar包版本
<properties>
<jar_version>3.5.4</jar_version>
</properties>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${jar_version}</version>
</dependency>
</dependencies>
</dependencyManagement>
父工程中的Library中就没有具体的jar包了
定义一个子工程MavenHello:
<parent>
<groupId>com.wuyuhong</groupId>
<artifactId>HelloMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../HelloMaven/pom.xml</relativePath> <!--指定父工程pom文件-->
</parent>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
</dependencies>
父工程指定的mybatis版本是3.5.4
子工程可以自定义mybatis版本 ex:3.4.3
那么当添加了scope:import后,子工程只能使用父工程指定的版本
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${jar_version}</version>
<scope>import</scope>
</dependency>
继承关系
父工程当做POM工程,没有任何逻辑代码
<groupId>com.wuyuhong</groupId>
<artifactId>HelloMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging><!--显式指定工程类型-->
<properties>
<jar_version>3.5.4</jar_version>
</properties>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${jar_version}</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
当子工程引用jar包,父工程有此jar,子工程直接继承父工程的jar包
聚合关系
单体项目 dao,service,model
当我们开发的工程拥有2个以上的模块,搜索模块,用户模块,积分模块等
HelloMaven:父工程
<modelVersion>4.0.0</modelVersion>
<groupId>com.wuyuhong</groupId>
<artifactId>HelloMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>ChildMaven</module>
</modules>
<packaging>pom</packaging><!--显式指定工程类型-->
<properties>
<jar_version>3.5.4</jar_version>
</properties>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${jar_version}</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
ChildMaven:子模块
<parent>
<artifactId>HelloMaven</artifactId>
<groupId>com.wuyuhong</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ChildMaven</artifactId>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
</dependencies>
继承:更多的是工程与工程之间继承
聚合:一般是主工程和多个子模块聚合
插件
1.编译插件
为每个项目或每个模块设置单独的编译器
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
2.资源插件
配置文件,一般都放在:src/main/resources
然后打包后配置文件就会在target的classes下面放着:
编译以后,只有resource下的配置文件被编译打包到classes文件下,
main/java下的配置文件testConfig.xml.没有被打包编译
解决非resources文件夹下的xml文件无法被编译打包的问题
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
<path>/SSM</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
执行命令maven->plugins->tomcat7run
maven 命令
1.install
本地安装,包含编译,打包,安装到本地仓库
-编译:javac
-打包 jar
-安装到本地仓库,将打包好的jar文件,拷贝至本地仓库目录中
2.clean
清除已编译信息
删除工程中的target目录
3.compile
只编译
4.package
只编译和打包,不会把打包好的jar包或war包放到本地maven仓库和远程maven私服仓库
5.mvn deploy 打包后将其安装到pom文件中配置的远程仓库
参考:
https://blog.csdn.net/zflovecf/article/details/80831467