Day_69_Maven

1. 什么是maven?


        目前无论使用IDEA还是Eclipse等其他IDE,使用里面ANT工具,ANT工具帮助我们进行编译,打包运行等工作。

        Apache基于ANT进行了升级,研发出了全新的自动化构建工具Maven,Maven是Apache的一款开源的项目管理工具.

        以后无论是普通javase项目还是javaee项目,我们都创建的是Maven项目,

        Maven使用项目对象模型(POM-Project Object Model,项目对象模型)的概念,可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具,在Maven中每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的,关系包含了:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果。

二、Maven的下载_目录结构_IDEA整合
        1 Idea默认集成maven
        2 下载地址:https://maven.apache.org
        3 Idea集成maven

 

在settings.xml中配置

①本地仓库的位置

<localRepository>D:\maven_lib\respository</localRepository>

 ②远程仓库的配置

<mirror>
        <id>aliyunmaven</id>
        <mirrorOf>central</mirrorOf>
        <name>central</name>
       <url>https://maven.aliyun.com/repository/central</url>
    </mirror>


③配置maven项目的环境也就是jdk版本(可选)

<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>

3. Maven仓库

本地仓库就是在本地存放jar包的文件夹

远程仓库非本地存放jar包的地址

4. JDK的配置

<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>

5. Maven工程类型

【1】POM工程:

POM工程是逻辑工程,用在父级工程或聚合工程中。用来做jar包的版本控制。

【2】JAR工程:

将会打成jar,用作jar包使用。即常见的本地工程-----》Java Project.

【3】WAR工程:

将会打成war,发布在服务器上的工程。

6. 在Idea中创建Maven项目

普通的maven项目创建

7. Maven项目结构

目录介绍:

Main/java: 放开发的java代码

Resources: 配置文件

Test/java:放测试代码

Pom.xml:  配置依赖

八、POM模式-Maven工程关系

1 依赖

【1】依赖关系:

即A工程开发或运行过程中需要B工程提供支持,则代表A工程依赖B工程。

在这种情况下,需要在A项目的pom.xml文件中增加下属配置定义依赖关系。
 

通俗理解:就是导jar包。

B工程可以是自己的项目打包后的jar包,也可以是中央仓库的jar包。

【1.1】如何注入依赖呢?

在pom.xml文件 根元素project下的 dependencies标签中,配置依赖信息,内可以包含多个dependence元素,以声明多个依赖。每个依赖dependence标签都应该包含以下元素:groupld,artifactld,version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。

例如:

<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
    </dependencies>


【1.2】依赖的好处

【2】依赖的传递性

 注意:将项目1打包成jar包,再创建项目2,让项目2依赖项目1

传递性两个原则:

【2.1】第一原则:最短路径优先原则

“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。

例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0)和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。

【2.2】第二原则:最先声明原则

依赖路径长度是一样的的时候,第一原则不能解决所有问题,比如这样的依赖关系:A->B->Y(1.0),A->C->Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。那么到底谁会被解析使用呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。

【3】排除依赖

Exclusions:用来排除传递性依赖,其中可配置多个exclusion标签,每个exclusion里面对应的有groupid,artifactid,version三项基本元素。注意不用写版本号

比如:A--->B--->C(Mybatis.jar)排除C中的Mybatis.jar

 <dependencies>
        <dependency>
            <groupId>com.tledu</groupId>
            <artifactId>mavn-demo1</artifactId>
            <version>1.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>


【4】依赖范围

依赖范围就决定了你依赖的坐标在什么情况下有效,什么情况下无效:

@compile

这是默认范围。如果没有指定,就会使用该依赖范围。表示该依赖在编译和运行时都生效。

<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>


@provided

已提供依赖范围。使用此依赖范围的Maven依赖。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如:servlet-api)

@runtime

runtime范围表明编译时不需要生效,而只在运行时生效典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。

@system

系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径,

@test

test范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。Junit的jar包就在测试阶段用就行了,你导出项目的时候没有必要把junit的东西到处去了就,所在在junit坐标下加入scope-test

@Import

import范围只适用于pom文件中的<dependencyManagement>部分。表明指定的POM必须使用<dependencyManagement>部分的依赖,

注意:import只能用在dependencyManagement的scope里。

2 继承关系

如果A工程继承B工程,则代表A工程默认依赖B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。被继承的工程(B工程)只能是POM工程。

注意:在父项目中放在<dependencyManagement>中的内容时不被子项目继承,不可以直接使用放在<dependencyManagement>中的内容主要目的是进行版本管理,里面的内容在子项目中依赖时坐标只需要填写<group id>和<artifact id>即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)

父工程pom.xml:

<groupId>com.tledu</groupId>
    <artifactId>mavn-demo1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
 
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.7</version>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
子工程pom.xml:

<groupId>com.tledu</groupId>
    <artifactId>mvn-demo2</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
 
    <parent>
        <artifactId>mavn-demo1</artifactId>
        <groupId>com.tledu</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../mavn-demo1/pom.xml</relativePath>
    </parent>
 
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
    </dependencies>


3 聚合关系

当我们开发的工程拥有2个以上模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独立编译,测试,运行。这个时候我们就需要一个聚合工程。

在创建聚合工程的过程中,总的工程必须是一个POM工程(Maven Project) (聚合项目必须是一个pom类型的项目,jar项目war项目是没有办法做聚合工程的),各子模块可以是任意类型模块(Maven Module)

前提:继承。

聚合包含了继承的特性。

聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为pom类型。同时在父项目的pomxml中出现

<modules>表示包含的所有子模块。

 

父工程pom.xml

 <groupId>com.tledu</groupId>
    <artifactId>mavn-demo1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>child-demo</module>
    </modules>
    <packaging>pom</packaging>
 
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring.version>5.3.10</spring.version>
    </properties>
 
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>


 子模块pom.xml:

<parent>
        <artifactId>mavn-demo1</artifactId>
        <groupId>com.tledu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
 
    <artifactId>child-demo</artifactId>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
    </dependencies>


插件:

①编译版本插件(可以在不同模块中定义自己的编译环境)

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>


②资源拷贝插件

Maven在打包时默认只将src/main/resources里的配置文件拷贝到项目中并做打包处理,而非resource目录下的配置文件在打包时不会添加到项目中。

pom.xml配置片段:

<build>
    <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>


</build>
九、常用命令
①、compile:将Java 源程序编译成 class 字节码文件。

②、test:测试生成测试报告。

③、mvn clean 将以前编译得到的旧的 class 字节码文件删除

④、mvn pakage 打包,动态 web工程打 war包,Java工程打 jar 包。

⑤、mvn install 将项目生成 jar 包放在仓库中,以便别的模块调用
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值