文章目录

  • 什么是Maven?
  • IDEA 配置Maven
  • mac下查找maven全局配置文件
  • 生成.m2文件夹
  • maven 仓库
  • 远程仓库
  • 本地仓库
  • 仓库配置
  • maven查找仓库优先级
  • maven配置jdk信息
  • maven 构建工程类型
  • IDEA中使用maven
  • maven项目目录结构
  • target编译好的文件存在哪里?
  • Maven项目依赖关系
  • 依赖关系
  • IDEA 2020,没有自动导包的设置:
  • 依赖的传递性
  • 依赖的两个原则
  • 依赖范围
  • 继承关系
  • 聚合关系
  • 插件
  • 1.编译插件
  • 2.资源插件
  • 解决非resources文件夹下的xml文件无法被编译打包的问题
  • tomcat插件
  • maven 命令


什么是Maven?

目前无论使用IDEA还是Eclipse等其他IDE,都使用里面ANT工具,ANT工具帮助我们进行编译,打包等工作
Apache基于ANT进行升级,研发出了全新的自动化构建工具Maven

Maven项目管理工具,编译打包等工作

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会自动解决包冲突问题

java项目maven实例 java中的maven项目_maven

IDEA 2020,没有自动导包的设置:

1.可以手动快捷键:
我的是:CMD+Shift+I
2.当pom.xml更改后,会出现一个更新的图标

java项目maven实例 java中的maven项目_ci_02

依赖的传递性

项目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包了

java项目maven实例 java中的maven项目_maven_03

定义一个子工程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下面放着:

java项目maven实例 java中的maven项目_ci_04

编译以后,只有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文件中配置的远程仓库