Java Maven

什么是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包了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-20TABtEj-1612168735627)(/var/folders/qt/6zrq8blj7d938nb4n2ykl6pw0000gn/T/com.evernote.Evernote/com.evernote.Evernote/WebKitDnD.S9uFxL/C6AD6876-9E8E-4C2E-8CBE-7965B7AAC234.png)]

定义一个子工程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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值