您当前的位置: 首页 >  maven

wespten

暂无认证

  • 2浏览

    0关注

    899博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Maven构建与管理项目(二)

wespten 发布时间:2019-08-25 12:39:01 ,浏览量:2

Maven构建与管理项目(二)

Maven核心概念

Maven坐标

什么是坐标?

  在平面几何中坐标(x,y)可以标识平面中唯一的一点。

Maven坐标主要组成

  • groupId:组织标识(包名)
  • artifactId:项目名称
  • version:项目的当前版本
  • packaging:项目的打包方式,最为常见的jar和war两种

样例:

  

  

Maven为什么使用坐标?

  • Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范。
  • 拥有了统一规范,就可以把查找工作交给机器。

 

依赖管理

依赖配置

  依赖配置主要包含如下元素:

    
      
          
          
              junit
              junit
              4.9
              test
          
        
         
             me.gacl.maven
             Hello
             0.0.1-SNAPSHOT
             compile
             
     

依赖范围

  依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:     1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效     2.test:测试依赖范围。只对于测试classpath有效     3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api     4.runtime:运行时提供。例如:jdbc驱动

传递性依赖

  MakeFriends.jar直接依赖于HelloFriends.jar,而HelloFriends.jar又直接依赖于Hello.jar,那么MakeFriends.jar也依赖于Hello.jar,这就是传递性依赖,只不过这种依赖是间接依赖,如下图所示:

  

可选依赖

 

仓库管理

Maven仓库

  用来统一存储所有Maven共享构建的位置就是仓库

Maven仓库布局

  根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging

仓库的分类

3.3.1、本地仓库

  每个用户只有一个本地仓库,默认是在~/.m2/repository/,~代表的是用户目录

3.3.2、远程仓库

  1、中央仓库:Maven默认的远程仓库,URL地址:http://search.maven.org/

  2、私服:是一种特殊的远程仓库,它是架设在局域网内的仓库

  

 

生命周期

何为生命周期?

  Maven生命周期就是为了对所有的构建过程进行抽象和统一,包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤

Maven三大生命周期

  Maven有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",这三套生命周期分别是:

  1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  2. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  3. Site Lifecycle 生成项目报告,站点,发布站点。

  再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。    clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

  1. pre-clean 执行一些需要在clean之前完成的工作
  2. clean 移除所有上一次构建生成的文件
  3. post-clean 执行一些需要在clean之后立刻完成的工作

  "mvn clean" 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,"mvn clean"等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。    Site生命周期pre-site 执行一些需要在生成站点文档之前完成的工作

  1. site 生成项目的站点文档
  2. post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  3. site-deploy 将生成的站点文档部署到特定的服务器上

  这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。   Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:

  • validate
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources 复制并处理资源文件,至目标目录,准备打包。
  • compile 编译项目的源代码。
  • process-classes
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources 复制并处理资源文件,至目标测试目录。
  • test-compile 编译测试源代码。
  • process-test-classes
  • test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
  • prepare-package
  • package 接受编译好的代码,打包成可发布的格式,如 JAR 。
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install 将包安装至本地仓库,以让其它项目依赖。
  • deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

  运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。

 

Maven插件

  1. Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
  2. 每个插件都能实现多个功能,每个功能就是一个插件目标。
  3. Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务,例如compile就是插件maven-compiler-plugin的一个插件目标。

 

聚合

  如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合

聚合配置代码


       模块一
       模块二
       模块三
 

 例如:对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合

 
       ../Hello  
       ../HelloFriend        
       ../MakeFriends
 

 其中module的路径为相对路径。

 

继承

  继承为了消除重复,我们把很多相同的配置提取出来,例如:grouptId,version等

继承配置代码

  
          me.gacl.maven
          ParentProject
          0.0.1-SNAPSHOT
          ../ParentProject/pom.xml  
 

继承代码中定义属性

  继承代码过程中,可以定义属性,例如:

 
     UTF-8
     4.9
     0.0.1-SNAPSHOT
 

  访问属性的方式为${junit.version},例如:

 
     junit
     junit
     ${junit.version}
     test
  

父模块用dependencyManagement进行管理

 
     
     
         junit
         junit
         ${junit.version}
         test
         
      
             cn.itcast.maven
             HelloFriend
             ${maven.version}
             jar
             compile
        
      
 

  这样的好处是子模块可以有选择行的继承,而不需要全部继承。

聚合与继承的关系

  聚合主要为了快速构建项目,继承主要为了消除重复

 

聚合与继承实战演练

  创建四个Maven项目,如下图所示:

  

  这四个项目放在同一个目录下,方便后面进行聚合和继承

  

  Parent项目是其它三个项目的父项目,主要是用来配置一些公共的配置,其它三个项目再通过继承的方式拥有Parent项目中的配置,首先配置Parent项目的pom.xml,添加对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合以及jar包依赖,pom.xml的配置信息如下:

  Parent项目的pom.xml配置

 
     4.0.0
 
     me.gacl.maven
     Parent
    0.0.1-SNAPSHOT
     pom
 
     Parent
     http://maven.apache.org
     
     
     
         ../Hello
         ../HelloFriend
         ../MakeFriends
     
     
    
     
         UTF-8
         4.9
         0.0.1-SNAPSHOT
     
 
     
     
         
         
             
                 junit
                junit
                 
                 ${junit.version}
                 test
             
             
                 me.gacl.maven
                 Hello
                 
                 ${maven.version}
                 compile
             
             
                 me.gacl.maven
                 HelloFriend
                 
                 ${maven.version}
             
         
     
 

  在Hello项目的pom.xml中继承Parent项目的pom.xml配置

 
   
   4.0.0
   Hello
   
       
          
           me.gacl.maven
          Parent
           0.0.1-SNAPSHOT
           
         ../Parent/pom.xml  
     
     
     
        
             junit
             junit
         
     
 

 在HelloFriend项目的pom.xml中继承Parent项目的pom.xml配置

 
     4.0.0
     HelloFriend
     HelloFriend
     
     
     
         me.gacl.maven
         Parent
         0.0.1-SNAPSHOT
         ../Parent/pom.xml
     
     
         
             
             junit
             junit
         
         
         
             me.gacl.maven
             Hello
         
     
 

 在MakeFriends项目的pom.xml中继承Parent项目的pom.xml配置

 
     4.0.0
    MakeFriends
     
     
         me.gacl.maven
         Parent
         0.0.1-SNAPSHOT
         ../Parent/pom.xml
     
     
         
        
             junit
             junit
         
         
         
             me.gacl.maven
            HelloFriend
        
     
 

  以上的四个项目的pom.xml经过这样的配置之后,就完成了在Parent项目中聚合Hello、HelloFriend、MakeFriends这三个子项目(子模块),而Hello、HelloFriend、MakeFriends这三个子项目(子模块)也继承了Parent项目中的公共配置,这样就可以使用Maven一次性构建所有的项目了,如下图所示:

  

  选中Parent项目的pom.xml文件→【Run As】→【Maven install】,这样Maven就会一次性同时构建Parent、Hello、HelloFriend、MakeFriends这四个项目,如下图所示:

  

 

Maven构建多模块项目

在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层)、dao(数据库访问层)、service(业务逻辑层)、web(表现层),这样分层之后,各个层之间的职责会比较明确,后期维护起来也相对比较容易,今天我们就是使用Maven来构建以上的各个层。

  项目结构如下:

  system-parent         |----pom.xml         |----system-domain                 |----pom.xml         |----system-dao                 |----pom.xml         |----system-service                 |----pom.xml         |----system-web                 |----pom.xml

 

创建system-parent项目

  创建system-parent,用来给各个子模块继承。

  进入命令行,输入以下命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

 如下图所示:

  

  命令执行完成之后可以看到在当前目录(C:\Documents and Settings\Administrator)生成了system-parent目录,里面有一个src目录和一个pom.xml文件,如下图所示:

  

  将src文件夹删除,然后修改pom.xml文件,将jar修改为pom,pom表示它是一个被继承的模块,修改后的内容如下:

 
   4.0.0
 
   me.gacl
   system-parent
   1.0-SNAPSHOT
   pom
 
   system-parent
   http://maven.apache.org
 
   
     UTF-8
   
 
   
     
       junit
      junit
     3.8.1
       test
     
   
 

 

创建sytem-domain模块

  在命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-domain -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

  如下图所示:

  

  命令执行完成之后可以看到在system-parent目录中生成了system-domain,里面包含src目录和pom.xml文件。如下图所示:

  

  

  同时,在system-parent目录中的pom.xml文件自动添加了如下内容:


    system-domain

  这时,system-parent的pom.xml文件如下:

 
 2 
   4.0.0
 
   me.gacl
   system-parent
   1.0-SNAPSHOT
   pom
 
   system-parent
   http://maven.apache.org
 
   

     UTF-8   
 
   
     
       junit
       junit
       3.8.1
       test
     
   
   
     system-domain
   
 

 修改system-domain目录中的pom.xml文件,把me.gacl和1.0-SNAPSHOT去掉,加上jar,因为groupId和version会继承system-parent中的groupId和version,packaging设置打包方式为jar

  修改过后的pom.xml文件如下:

 
 
   4.0.0
   
     me.gacl
     system-parent
     1.0-SNAPSHOT
   
   
  system-domain
   jar
   
   system-domain
   http://maven.apache.org
 

 

创建sytem-dao模块

  在命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-dao -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

如下图所示:

命令执行完成之后可以看到在system-parent目录中生成了system-dao,里面包含src目录和pom.xml文件。如下图所示:

同时,在system-parent目录中的pom.xml文件自动变成如下内容:

 
 
   4.0.0
 
   me.gacl
   system-parent
   1.0-SNAPSHOT
   pom
 
   system-parent
   http://maven.apache.org
 
   
     UTF-8
   
 
   
     
       junit
       junit
       3.8.1
       test
     
   
   
     system-domain
     system-dao
   
 

  修改system-dao目录中的pom.xml文件,,把me.gacl和1.0-SNAPSHOT去掉,加上jar,因为groupId和version会继承system-parent中的groupId和version,packaging设置打包方式为jar,同时添加对system-domain模块的依赖,修改后的内容如下:


 
   4.0.0
   
     me.gacl
     system-parent
     1.0-SNAPSHOT
   
 
   system-dao
   jar
 
   system-dao
   http://maven.apache.org
   
     UTF-8
   
   
     
      
       me.gacl
       system-domain
       ${project.version}
     
   
 

 

创建system-service模块

  在命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

  如下图所示:

  命令执行完成之后可以看到在system-parent目录中生成了system-service,里面包含src目录和pom.xml文件。如下图所示:

  同时,在system-parent目录中的pom.xml文件自动变成如下内容:

 
 
   4.0.0
 
   me.gacl
   system-parent
   1.0-SNAPSHOT
   pom
 
   system-parent
   http://maven.apache.org
 
  
     UTF-8
   
 
   
     
      junit
      junit
       3.8.1
       test
     
   
   
     system-domain
     system-dao
     system-service
   

 修改system-service目录中的pom.xml文件,,把me.gacl和1.0-SNAPSHOT去掉,加上jar,因为groupId和version会继承system-parent中的groupId和version,packaging设置打包方式为jar,同时添加对system-dao模块的依赖,system-service依赖system-dao和system-domain,但是我们只需添加system-dao的依赖即可,因为system-dao已经依赖了system-domain。修改后的内容如下:


 
   4.0.0
   
     me.gacl
     system-parent
     1.0-SNAPSHOT
     
   system-service
   jar  
   system-service 
  http://maven.apache.org
   
     UTF-8
   
   
     
     
       me.gacl
       system-dao
       ${project.version}
    
   
 

 

创建system-web模块

  在命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

  如下图所示:

  命令执行完成之后可以看到在system-parent目录中生成了system-web,里面包含src目录和pom.xml文件。如下图所示:

  在\system-web\src\main\webapp目录中还生成了一个简单的index.jsp,如下图所示:

  里面的内容为



Hello World!

  system-web\src\main\webapp\WEB-INF目录中生成了web.xml

 

  同时,在system-parent目录中的pom.xml文件自动变成如下内容:

 
  
   4.0.0
 
   me.gacl
   system-parent
   1.0-SNAPSHOT
   pom
 
   system-parent
   http://maven.apache.org
 
   
     UTF-8
   
 
   
     
       junit
       junit
       3.8.1
       test
     
   
   
    system-domain
     system-dao
     system-service
     system-web
   
 

 修改system-web目录中的pom.xml文件,,把me.gacl和1.0-SNAPSHOT去掉,因为groupId和version会继承system-parent中的groupId和version,同时添加对system-service模块的依赖,修改后的内容如下:

 
 
   4.0.0
    
     me.gacl
     system-parent
     1.0-SNAPSHOT
   

   system-web
  war
   
   system-web Maven Webapp
   http://maven.apache.org
   
     
      
       me.gacl
       system-service
       ${project.version}
     
   
   
     system-web
  

  注意,web项目的打包方式是war。

 

编译运行项目

  经过上面的五个步骤,相关的模块全部创建完成,怎么运行起来呢。由于最终运行的是system-web模块,所以我们对该模块添加jetty支持,方便测试运行。修改system-web项目的pom.xml如下:

 
 
   4.0.0
   
     me.gacl
     system-parent
     1.0-SNAPSHOT
   
 
   system-web
   war
   
   system-web Maven Webapp
  http://maven.apache.org
   
     
      
       me.gacl
       system-service
       ${project.version}
     
   
   
     system-web
     
         
         
             org.mortbay.jetty
             maven-jetty-plugin
         
     
   
 

 在命令行进入system-parent目录,然后执行下列命令:

mvn clean install

 如下图所示:

 

 

  命令执行完后,在system-web目录下多出了target目录,里面有了system-web.war,如下图所示:

 

  命令行进入sytem-web目录,执行如下命令,启动jetty

mvn jetty:run

 如下图所示:

  启动jetty服务器后,访问http://localhost:8080/system-web/ 运行结果如下图所示:

 

导入Eclipse中进行开发

操作步骤如下所示:

  

  

  

  

  

 

关注
打赏
1665965058
查看更多评论
立即登录/注册

微信扫码登录

0.2251s