Maven基本操作

1.为什么需要Maven

1)添加第三方jar包

  有了Maven就不用每个项目都去复制那么多的jar包,只需要在本地存储一份,然后以坐标的方式指定来获取本地的jar包。

2)jar包之间的依赖关系

  jar包之间的依赖关系相当复杂,当我们第一次使用某个jar包的时候,我们更本不知道它需要依赖那些jar包,此时我们通过Maven就可以为我们解决这些问题。

3)获取第三方jar包。

   通过Maven我们可以很轻松地获取网上的的几乎每一个jar包。

4)将项目拆分成多个工程模块

  JavaEE项目的规模越来越庞大,通过Maven我们可以将项目拆分成多个工程协同开发,多个模块工程中有的是Java工程,有的是Web工程。

2.修改本地仓库与jre

a.修改本地仓库

MVN加载配置文件的顺序

mvn---~/.m2/setting.xml-------conf/setting.xml

①默认本地仓库位置:~\.m2\repository
        ~表示当前用户的家目录,例如:C:\Users\[你当前登录系统的用户名]
②指定本地仓库位置的配置信息文件:apache-maven-3.2.2\conf\settings.xml
③在根标签settings下添加如下内容:<localRepository>[本地仓库路径]</localRepository>

b.修改jre

eclipse中构建的项目默认使用的jre1.5,所以我们在使用项目时,应该手动更改项目的jre(避免每次读手动更改,我们可以在Maven的配置文件中修改)
<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.compileVersion>1.8</maven.compiler.compileVersion>
      </properties>
    </profile>

 c.添加一些内网的镜像

<mirrors>    
    <mirror>
        <id>aliyun</id>
        <name>aliyun Maven</name>
        <mirrorOf>*</mirrorOf>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>    
</mirrors>

 

3.Eclipse中使用Maven

Maven插件:Eclipse中其实已经内置的,只是不太好用,所以我们需要配置一下,将我们的下载好的Maven文件配置上

Maven插件的设置:
                【1】在Maven下的installation上。指定Maven核心程序的位置,不建议使用插件自带的Maven程序,而应该使用我们解压的那个
                【2】user setting:指定解压目录里的conf/setting,xml的位置,进而获取本地仓库的位置。

a.创建java项目

 

 

b.创建web项目

 

4.Maven工程结构

a.目录结构

  Hello
  |---src
  |---|---main
  |---|---|---java
  |---|---|---resources
  |---|---test
  |---|---|---java
  |---|---|---resources
  |---pom.xml

b.运行Maven的基本命令

  mvn compile    编译
  mvn clean   清理(删除target)
  mvn test      测试
  mvn package   打包

    mvn install       发布项目提交到本地仓库
  ※注意:运行Maven命令时一定要进入pom.xml文件所在的目录!

  mvn deploy   把本地jar发布到remote

  在eclipse中运行的时候不需要写mvn,直接写构建的目标即可。

c.关于联网问题

  1)Maven的程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中

  2)当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找

  3)Maven核心核心程序在本地仓库中招不到需要的插件,那么它会自动连接外网,到中央仓库下载

  4)如果此时无法连接到外网则会构建失败

5.依赖范围

【1】compile范围依赖(默认也是compile)
            对主程序是否有效:有效
            对测试程序是否有效:有效
            是否参与打包:参与
            是否参与部署:参与
            典型列子:spring-core
【2】test范围依赖(默认也是compile)
            对主程序是否有效:无效
            对测试程序是否有效:有效
            是否参与打包:不参与
            是否参与部署:不参与
            典型列子:junit
【3】provided范围依赖(默认也是compile)
            对主程序是否有效:有效
            对测试程序是否有效:有效
            是否参与打包:不参与
            是否参与部署:不参与
            典型列子:servlet-api(因为tomcar的web服务器上就有这环境)

6.依赖(高级)

 1)依赖的传递性

  可以传递的依赖不必在每个模块工程中重复声明,在“最下面”的项目中声明一次即可

  注意:非compile范围的依赖是不可以传递的。所以在各个工程模块中,如果有需要就得重复声明依赖。

 2)依赖的原则

  【1】作用:解决各模块之间的jar包冲突问题

  【2】情景设定1:验证路径最短者优先

  【3】情景设定2:验证最先声明着优先

 

  3)统一管理依赖的版本

    如对spring各个jar包的依赖版本都是4.0.0。如果需要统一升级为4.1.1,怎么办?手动逐一修改不可靠。可以使用<properties>属性  

<properties>
      <com.chen.spring>4.0.0</com.chen.spring>
      <com.chen.mybatis>3.2.2</com.chen.mybatis>
 </properties>
<version>${com.chen.mybatis}</version>

    其实在<properties>标签中配合自定义标签声明数据的配置并不是只能用于声明依赖的版本号,凡是需要统一声明再使用的场合都行(如声明统一字符集) 

7.继承 

  现状:

    Hello依赖的junit:4.0

    HelloFriend依赖的junit:4.0

    MakeFriends依赖的junit:4.9

    由于test范围的依赖不能传递,所以必须会分散在各个模块工程中,很容易造成版本不一致

  需求:统一管理各个模块工程中对junit依赖的版本

  解决思路:将依赖统一提取到"父"工程中,在子工程中声明junit依赖是不指定版本,以父工程中统一设定的为.同时便于修改

  操作步骤:

    [1]创建一个Maven工程为父工程.注意:打包的方式为pom

    [2]在子工程中声明对父工程的引用

    [3]将子工程中的坐标中与父工程坐标中重复的内容删除

    [4]在父工程中统一junit的依赖

    [5]在子工程中删除junit依赖的版本号不部分

 8.聚合

      作用:一键安装各个模块

   配置方式:在一个"总的聚合工程中"配置各个参数参与聚合的模块

 <modules>
        <module>../xx</module>
        <module>../hh</module>
    </modules>

   也可以在创建的时候,在总的聚合工程中不是创建Maven Project 而是创建Maven Module

   然后我们可以在聚合工程的pom.xml上点右键-run as-maven install即可一键安装

 9.web工程自动部署(build)

    build:配置当前工程构建过程中的特殊设置

    plugins:配置构建过程中需要使用的插件 

  

<!-- maven项目:约定大于配置 
    src/main/java:只能编译java代码
     src/main/resources:只能编译配置文件 
    此时需要在src/main/java编译配置文件, 配置maven约定,放行xml文件.而在mybatis项目中,src/main/java下有很多的xml文件 -->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
 
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <port>8084</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>    

10.项目依赖包的打包

将项目的依赖jar也打包.这样的话会将该项目所有依赖的jar包会打包成一个wirh-dependencies.jar包.此时我们就可以将此jar包与其依赖的jar包一起拷贝给其他项目使用,否则在其他项目中使用该项目中的代码可能会因为缺失依赖包的问题而报错.

当然我们也可以使用Maven的方式,搭建一个服务,然后把install中的jar包坐标依赖给其他项目也是可以的.

对于打包成war包的时候,它会自动将依赖的包都会放进去,我们将war包直接放在tomcat的webapps下,解压后我们可以看到此war包解压出来的lib目录下是存有所有的依赖的jar包的.

<plugin>  
         <artifactId>maven-assembly-plugin</artifactId>  
           <configuration>  
             <archive>  
               <manifest>  
                <mainClass>kpmg.thrift.scenario.task</mainClass>  
              </manifest>  
                  </archive>  
                  <descriptorRefs>  
                      <descriptorRef>jar-with-dependencies</descriptorRef>  
                  </descriptorRefs>  
              </configuration>  
              <executions>
                      <execution>
                           <id>make-assembly</id>
                           <phase>package</phase>
                           <goals>
                                <goal>single</goal>
                           </goals>
                      </execution>
              </executions>
          </plugin>  
        </plugins> 

 

    

 

 

 

 

 

  

 

posted @ 2018-08-27 18:37  刘丽刚  阅读(786)  评论(0)    收藏  举报