欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Maven笔记

程序员文章站 2022-08-29 15:31:45
一.Maven的概念及作用 1.Maven本质上是一个项目对象模型(POM),是一个基于java平台的自动化构建工具(编译-测试-打包-部署->自动构建),也是项目管理工具. 2.Maven的设计核心:约定优于配置(convention over configuration),这也称作按约定编程,是 ......

一.Maven的概念及作用

1.Maven本质上是一个项目对象模型(POM),是一个基于java平台的自动化构建工具(编译-测试-打包-部署->自动构建),也是项目管理工具.

2.Maven的设计核心:约定优于配置(convention over configuration),这也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需要做的决定的数量,获得简单的好处,而又不失灵活性.

3.Ant和Maven一种是命令式,一种是声明式.Ant需要我们指明各种动作,以及执行这些动作的顺序,比如编译代码,测试代码等.而Maven则默认大家都知道有各种动作,默认大家都遵守一个良好的目录结构,一个通用的构建过程.因此,使用Maven时我们只需要告诉Maven我们希望构建什么,而不需要告诉它如何构建.因为Maven已经在构建生命周期,阶段和目标中定义好了,我们要做的就是编写声明式的pom.xml文件.Gradle结合以上两个的优点,继承了Ant的灵活和Maven的生命周期管理,它被google作为了Android御用管理工具.它不用XML作为配置文件格式,采用了DSL格式,使得脚本更加简洁.Gradle引入了基于Groovy语言的DSL语法来代替XML配置,因此它的配置文件是一个Groovy文件.Gradle还把Maven的设计核心(Convention Over Configuration)发扬光大,而Gradle的配置即代码又超越了Maven.在Gradle中任何配置都可以作为代码被执行的,我们也可以随时使用已有的Ant脚本,Java类库,Groovy类库来辅助完成构建任务的编写.

4.完整的Maven项目构建过程包括:
  清理:删除上次编译的结果,为重新编译做准备.
  编译:java->class.
  测试:针对于项目中的关键点进行测试,也可以用项目中的测试代码去测试开发代码.
  报告:将测试的结果进行显示.
  打包:将项目中包含的多个文件压缩成一个文件,用于安装或部署(java->jar,web项目->war).
  安装:将打成的包放到本地仓库(本地仓库里没有想要的jar包就去远程仓库(*仓库,*仓库镜像,私服nexus)下载,*仓库镜像就是对*仓库的分流).
  部署:将打成的包放到服务器上准备运行.

5.Maven通过坐标对项目所依赖的jar包进行统一规范管理.

6.管理jar包:

I.在pom.xml中添加依赖可以添加第三方jar包(在这个网址中搜索想要的jar包名称:http://mvnrepository.com/).
II.jar包之间的依赖关系(自动下载并关联所有jar包,且不会冲突).

7.如果项目非常庞大,就不适合使用package来划分模块,一个模块对应一个工程才利于分工协作.借助于maven就可以将一个项目拆分成多个工程.

8.Maven的约定目录结构:

I.main->执行项目,test->测试项目,两个目录下都有java和resources(java:java代码,resources:资源代码/配置代码).
II.target:用于存放编译,打包后的输出文件.
III.pom.xml:项目对象模型
<groupId>域名反转.大项目名</groupId>
<artifactId>子模块名</artifactId>
<version>版本号</version>


二.下载配置Maven
  1.下载地址:http://maven.apache.org/download.cgi

  2.Binary二进制,source源代码,含有gz的是Linux,zip的是Windows.

  3.配置Maven之前先配置jdk(java的运行需要jdk,我安装的是1.7版本的):
    I.点击我的电脑->系统属性->高级系统设置->环境变量->新建JAVA_HOME变量,变量值填写jdk的安装目录(例如E:\Java\jdk1.7).
    II.寻找Path变量->在变量值最后输入%JAVA_HOME%\bin;(如果是第一次配置环境变量,先在这条语句复制粘贴前检查一下path里面已有的语句末尾是否有英文状态的分号,没有就加上).
    III.新建CLASSPATH变量->变量值填写.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面的那个点和分号也要一起复制过去).

  4.配置Maven:
    I.新建MAVEN_HOME变量,变量值填写Maven的安装路径(例如F:\Maven).
    II.再把%MAVEN_HOME%\bin;加入到Path里.

  5.最后分别输入java,javac,mvn -v(横杠前面有一个空格),看看是否每次输入都会出来一大段英文,出来了就算成功.

  6.配置本地仓库:默认本地仓库为C:\Users\BiggestKing(你的电脑管理员名称)\.m2\repository,可以进入到Maven的安装目录里面的conf\settings.xml中修改默认本地仓库路径(<localRepository>F:/MavenRepository(名字可以随便取)</localRepository>).

  7.在编辑器中配置Installations,点击add选择安装maven的目录.

  8.在编辑器中配置User Settings,找到安装maven的目录下的conf下的settings.xml.


三.使用Maven
  1.打开编辑器->右击->New->点击Other...或者Project...搜索Maven->找到Maven Project并点击.

  2.在新建Maven Project的第一个页面要勾选Create a simple project(网络不好可能导致maven项目创建后报错(CoreException: Could not get the value for parameter compilerId for plugin execution default-compile...),因为需要的东西没能全部下载完成).

  3.Maven的继承:
    I.建立父工程,并且父工程的打包方式(Packaging)为pom.
    II.在父工程的pom.xml中编写依赖:
    <dependencyManagement>
      <dependencies>
        <dependency>...</dependency>
      </dependencies>
    </dependencyManagement>
    dependencies和dependencyManagement的区别在于:前者,即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项.后者,如果在子项目中不写该依赖项,那么子项目中是不会从父项目继承该依赖项的,只有在子项目中写了该依赖项,才会从父项目中继承该项,并且version和scope都读取自父项目.
    III.在子工程的pom.xml中写:
      a.父工程的<groupId>域名反转.大项目名</groupId>
        <artifactId>子模块名</artifactId>
        <version>版本号</version>
      b.当前工程的pom.xml到父工程的pom.xml之间的相对路径.
      <parent>
        <groupId>域名反转.大项目名</groupId>
        <artifactId>子模块名</artifactId>
        <version>版本号</version>
        <relativePath>../父工程名称/pom.xml</relativePath>
      </parent>
    IV.在子工程的pom.xml中需要声明使用那些父工程的依赖.

  4.Maven的聚合:
    I.Maven项目能够识别的:自身包含,本地仓库中的.
    II.A依赖于B,则在执行时,必须先将B加入到本地仓库中.
    III.聚合的使用:
      a.在一个总工程中配置聚合,只能配置在打包方式为pom的Maven项目中.
      <modules>
        <!-- 项目的根路径 -->
        <module>../项目名称</module>
        <module>../项目名称</module>
      </modules>
      b.配置完聚合后,只要操作总工程则会自动操作聚合中配置的工程.
    IV.Maven将一个大工程拆分陈若干个子工程,聚合可以将多个子工程合起来.

  5.部署maven:
    I.打war包到tomcat/webapps目录.
    II.maven命令:deploy.

    III.配置cargo,pom.xml中的属性信息:

    <build>

      <finalName>子模块名称</finalName>
      <plugins>
        <plugin>
          <groupId>org.codehaus.cargo</groupId>
          <artifactId>cargo-maven2-plugin</artifactId>
          <version>1.6.4</version>
          <configuration>
            <container>
              <containerId>tomcat8x</containerId>
              <home>E:\apache-tomcat-8.0.36-windows-x64\caf-tomcat-8.0.36</home>
            </container>
            <configuration>
              <type>existing</type>
              <home>E:\apache-tomcat-8.0.36-windows-x64\caf-tomcat-8.0.36</home>
            </configuration>
          </configuration>
          <executions>
            <execution>
              <id>cargo-run</id>
              <phase>install</phase>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>

  6.在编辑器中编写完pom.xml后,需要update.

  7.第一次执行Maven项目需要点击Maven build...,然后在Goals一栏输入命令,最后run起来,之后再执行可以直接点击Maven build,这玩意保存了上次在Maven build...里输入的命令(像clean,install,test这三个命令已经有了也可以直接点击,不用在Maven build...里输入命令).

 

四.执行maven
  1.必须在pom.xml所在的目录中执行.

  2.maven常用命令(cmd中可执行):
    I.mvn compile 编译main目录下的java文件.
    II.mvn test-compile 编译测试程序.
    III.mvn test 测试.
    IV.mvn report 报告测试程序执行的结果.
    V.mvn package 打包成jar/war.
    VI.mvn install 将开发的模块放入本地仓库,供其他模块使用.
    VII.mvn clean 删除target目录(编译文件的目录).
    VIII.mvn deploy 部署项目.


五.依赖:A中的某些类需要使用B中的某些类,则称之为A依赖B.在maven项目中如果要使用一个当时不存在的jar或模块,可以通过依赖实现(去本地仓库或*仓库找).
  1.compile(支持compile,test,run,默认) test(支持test) provided(支持compile,test) runtime(支持test,run) system(支持compile,test).

  2.maven在编译,测试,运行项目时各自使用一套classpath.

  3.依赖排除:当我们只需要A.jar不需要B.jar,就需要用到依赖排除.
  <exclusions>
    <exclusion>
      <groupId></groupId>
      <artifactId></artifactId>
    </exclusion>
    <exclusion>
      <groupId></groupId>
      <artifactId></artifactId>
    </exclusion>
    ......
  </exclusions>

  4.依赖的传递性:如果A.jar依赖于B.jar依赖于C.jar,那么也可以说A.jar依赖于C.jar(仅当B.jar依赖于C.jar的范围是compile).

  5.依赖的原则:
    I.在同一个pom.xml文件中有2个相同的依赖,后面的依赖会覆盖前面的依赖.
    II.在不同的pom.xml文件中有2个相同的依赖,先声明的依赖会覆盖后声明的依赖.


六.maven的生命周期
  1.生命周期和构建的关系:生命周期中的顺序:a,b,c,当我们执行c时,实际执行的是a,b,c.

  2.生命周期包含的三个阶段:
  I.clean lifecycle:清理
    pre-clean clean post-clean.
  II.default lifecycle:默认
    有很多,常用的有test-compile test package install.
  III.site lifecycle:站点
    pre-site site post-site site-deploy.


七.统一JDK版本(JDK只能够识别source folder中的源码)
  1.右键->Properties->build path->Libraries->删除原本的Library->add Library->JRE System Library->第二个选项选择JDK.

  2.右键->Properties->Project Facets->java verson.

  3.通过maven改JDK版本
  <profiles>
    <profile>
      <id>jdk-17</id>
      <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.7</jdk>
      </activation>
      <properties>
        <maven.compiler.source></maven.compiler.source>
        <maven.compiler.target></maven.compiler.target>
        <maven.compiler.compilerVersion></maven.compiler.compilerVersion>
      </properties>
    </profile>
  </profiles>