资讯专栏INFORMATION COLUMN

Maven详细教程

Keagan / 1485人阅读

摘要:清理上一次执行创建的文件处理资源文件编译代码执行单元测试文件创建拷贝到本地的仓库下面发布生成文档将工程所有文档生成网站,生成的网站界面默认和的项目站点类似,但是其文档用格式写的,目前不支持,需要用其他插件配合才能支持。

前言

本文可以帮助你加深对Maven的整体认识,不是一篇基础文章。如果你现在还没有用 Maven 跑过 HelloWorld,那么本文可能不适合你。

一、Maven简介
Maven 官网:https://maven.apache.org  
Maven 3.3.9版本文档:http://maven.apache.org/ref/3...

Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

版本:maven有自己的版本定义和规则

构建:可以完成编译,打包,部署等。

依赖管理:方便引入所需依赖 Jar 包,不需手动下载

文档生成:maven的site命令支持各种文档信息的发布,包括构建过程的各种输出,javadoc,产品文档等。

项目关系:一个大型的项目通常有几个小项目或者模块组成,用maven可以很方便地管理

二、Maven生命周期

maven把项目的构建划分为不同的生命周期(lifecycle)。粗略一点的话,它这个过程(phase)包括:

验证(validate):验证项目是否正确

编译(compile): 编译项目的源代码

测试(test):使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署

打包(package)

验证(verify)

安装(install)

部署(deploy)

maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。

这个也是maven的一个基本调度机制。一般来说,位置稍后的过程都会依赖于之前的过程。当然,maven同样提供了配置文件,可以依照用户要求,跳过某些阶段。

三、Maven 版本规范

maven使用如下几个要素来唯一定位某一个输出物: groupId:artifactId:packaging:version 。比如org.springframework:spring:2.5 。每个部分的解释如下:

groupId 公司,团体等。如Apache Software的项目有以org.apache开头的groupId。

artifactId 项目的唯一标识符。比如一个helloworld项目就叫helloworld。

packaging 项目打包输出的类型,默认是jar。类型为war的项目产生一个web应用。

version 一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个"SNAPSHOT"的标记。

maven有自己的版本规范,一般是如下定义 ..- ,比如1.2.3-beta-01。要说明的是,maven自己判断版本的算法是major,minor,incremental部分用数字比较,qualifier部分用字符串比较,所以要小心 alpha-2和alpha-15的比较关系,最好用 alpha-02的格式。

maven在版本管理时候可以使用几个特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。比如"1.0-SNAPSHOT"。各个部分的含义和处理逻辑如下说明:

SNAPSHOT 如果一个版本包含字符串"SNAPSHOT",Maven就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为UTC时间。例如,"1.0-SNAPSHOT"会在2010年5月5日下午2点10分发布时候变成1.0-20100505-141000-1。这个词只能用于开发过程中,因为一般来说,项目组都会频繁发布一些版本,最后实际发布的时候,会在这些snapshot版本中寻找一个稳定的,用于正式发布,比如1.4版本发布之前,就会有一系列的1.4-SNAPSHOT,而实际发布的1.4,也是从中拿出来的一个稳定版。

LATEST 指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个snapshot版,具体看哪个时间最后。

RELEASE 指最后一个发布版。

四、Maven 项目依赖 1. 多模块依赖和继承

项目结构图:

parent
    ├─childA(model层)
    │  └─pom.xml(jar)
    ├─childB(web层)
    │  └─pom.xml(war)
    └─pom.xml(pom)

parent中执行mvn install就能将 childA和childB 一起编译

parent的pom.xml做如下配置:

com.song
parent
1.0-SNAPSHOT
pom    


    childA   
    childB

childA和childB的pom.xml都需要配置parent,防止引入的包冲突(如果不加parent,会分别去编译他们引入的依赖,会重复引入包):



    parent
    com.song
    1.0-SNAPSHOT

4.0.0
childA
jar



    parent
    com.song
    1.0-SNAPSHOT

4.0.0
childB
war

子pom间存在引用关系,比如childB引用到了childA的jar包


   com.module
   childA       
   1.0-SNAPSHOT
2. 子项目继承父项目的依赖

parent中加上,child项目就可以继承parent项目的依赖,并且在child中可以不用加version了。


   
      
           javax.servlet
          servlet-api
          2.5
      
   
3. 依赖范围

如果不显示执行 属性时,默认 compile
scope 属性包括:

compile(编译范围):编译范围的在所有的classpath中可用,同时它们也会被打包

provided(已提供范围):表示部署的环境当中有某容器已经提供了该jar包,只在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的servlet容器(Tomcat)提供。

runtime(运行时范围):只在运行和测试系统的时候需要,但在编译的时候不需要。

test(测试范围):在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。

system (系统范围):该范围不推荐使用(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)

详细可参考:https://maven.apache.org/guid...
4. 可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)

maven的依赖关系是有传递性的。如:A-->B,B-->C。但有时候,项目A可能不是必需依赖C,因此需要在项目A中排除对A的依赖。在maven的依赖管理中,有两种方式可以对依赖关系进行,分别是可选依赖(Optional Dependencies)以及依赖排除(Dependency Exclusions)。

4.1 可选依赖 optional

当一个项目A依赖另一个项目B时,项目A可能很少一部分功能用到了项目B,此时就可以在A中配置对B的可选依赖。举例来说,一个类似hibernate的项目,它支持对mysql、oracle等各种数据库的支持,但是在引用这个项目时,我们可能只用到其对mysql的支持,此时就可以在这个项目中配置可选依赖。

配置可选依赖的原因:1、节约磁盘、内存等空间;2、避免license许可问题;3、避免类路径问题,等等。


  sample.ProjectB
  Project-B
  1.0
  compile
  true

假设以上配置是项目A的配置,即:Project-A --> Project-B。在编译项目A时,是可以正常通过的。

如果有一个新的项目X依赖A,即:Project-X -> Project-A。此时项目X就不会依赖项目B了。如果项目X用到了涉及项目B的功能,那么就需要在pom.xml中重新配置对项目B的依赖。

4.2 依赖排除 exclusions

当一个项目A依赖项目B,而项目B同时依赖项目C,如果项目A中因为各种原因不想引用项目C,在配置项目B的依赖时,可以排除对C的依赖。

示例(假设配置的是A的pom.xml,依赖关系为:A --> B; B --> C):


  sample.ProjectB
  Project-B
  1.0
  compile
  
    
      sample.ProjectC
      Project-C
    
   

当然,对于多重依赖,配置也很简单,参考如下示例:

Project-A
   -> Project-B
        -> Project-D 
              -> Project-E 
              -> Project-F
   -> Project C

A对于E相当于有多重依赖,我们在排除对E的依赖时,只需要在配置B的依赖中进行即可:


  sample.ProjectB
  Project-B
  1.0-SNAPSHOT
  
    
      sample.ProjectE
      Project-E
    
  
五、Maven插件机制 1. Maven默认插件

不配置Plugin时,Maven默认会使用以下插件。如果针对各个 plugin 有特殊配置的话,需要显示指定 plugin 和 属性配置。

plugin function life cycle phase
maven-clean-plugin 清理上一次执行创建的target文件 clean
maven-resources-plugin 处理资源文件 resources,testResources
maven-compiler-plugin 编译Java代码 compile、testCompile
maven-surefire-plugin 执行单元测试文件 test
maven-jar-plugin 创建 jar package
maven-install-plugin 拷贝jar到本地的maven仓库 .m2/repository 下面 install
maven-deploy-plugin 发布 jar deploy
maven-site-plugin 生成文档 site
maven-site-plugin:将工程所有文档生成网站,生成的网站界面默认和apache的项目站点类似,但是其文档用doxia格式写的,目前不支持docbook,需要用其他插件配合才能支持。需要指出的是,在maven 2.x系列中和maven3.x的site命令处理是不同的,在旧版本中,用 mvn site 命令可以生成reporting节点中的所有报表,但是在maven3中,reporting过时了,要把这些内容作为 maven-site-plugin的configuration的内容才行。详细内容可以参考http://www.wakaleo.com/blog/2...

    
    
        
            src/main/java
            true 
            
                **/*.xml
            
        
        
            src/main/resources
            true
            
                **/*.properties
                *.xml
                *.dic
                *.txt
            
        
        
            src/main/resources
            false
            
                *.p12
            
        
    



    
        
        
            maven-compiler-plugin
            3.1
            
                1.8
                1.8
                UTF-8
            
        
        
        
        
            org.apache.maven.plugins
            maven-resources-plugin
            2.6
            
                UTF-8
            
        
    

2. Maven常用插件 2.0 spring-boot-maven-plugin

当使用SpringBoot开发项目的时候,会使用到spring-boot-maven-plugin插件

官方文档:https://docs.spring.io/spring...

Spring Boot Maven plugin有5个Goals:

命令 说明
spring-boot:repackage 默认goal。在mvn package之后,再次打包可执行的jar/war,
并将mvn package生成的软件包重命名为*.original
spring-boot:run 运行Spring Boot应用
spring-boot:start 在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
spring-boot:stop 在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
spring-boot:build-info 生成Actuator使用的构建信息文件build-info.properties

其中比较重要的命令是:

mvn package spring-boot:repackage

执行后会看到生成的两个jar文件,一个是*.jar,另一个是*.jar.original
这是由于在执行上述命令的过程中,Maven首先在package阶段打包生成*.jar文件;然后执行spring-boot:repackage重新打包

我们也可以跳过repackage阶段

clean deploy -D spring-boot.repackage.skip=true

加上-D spring-boot.repackage.skip=true参数即可,此时只会生成一个普通的jar包

2.1 maven-source-plugin

maven-source-plugin提供项目自动将源码打包并发布的功能,在需要发布源码项目的pom.xml文件中添加如下代码即可:


    org.apache.maven.plugins
    maven-source-plugin
    
    
    
        
            attach-sources
            
                jar
            
        
    

执行 mvn install,maven会自动将source install到repository 。
执行 mvn deploy,maven会自动将source deploy到remote-repository 。
执行 mvn source:jar,多带带打包源码。

注意:在多项目构建中,将source-plugin置于顶层或parent的pom中并不会发挥作用,必须置于具体项目的pom中。
2.2 Tomcat插件

tomcat插件有两种:tomcat-maven-plugin 和 tomcat7-maven-plugin,使用方式基本相同。

tomcat-maven-plugin 插件是org.codehaus.mojo组织提供的,里面的tomcat是6.0.29版本,没有更新了。

tomcat7-maven-plugin 插件是apache提供的,官网:http://tomcat.apache.org/mave...

tomcat7-maven-plugin 插件使用


    org.apache.tomcat.maven
    tomcat7-maven-plugin
    2.2
       
          /
          8080
          UTF-8
          tomcat7
       
        
            
                package
                
                    run
                
            
        

命令:

tomcat7:deploy  --部署一个web war包
tomcat7:reload  --重新加载web war包
tomcat7:start    --启动tomcat
tomcat7:stop    --停止tomcat
tomcat7:undeploy --停止一个war包
tomcat7:run --启动嵌入式tomcat ,并运行当前项目

tomcat-maven-plugin 插件使用


    org.codehaus.mojo
    tomcat-maven-plugin
    1.1
    
        /helloworld
        8080
        UTF-8
        http://localhost:8080/manager/html
        tomcat6
        
            -Xms256m -Xmx512m -XX:MaxPermSize=512m
          
    

命令:

tomcat:deploy   --部署一个web war包
tomcat:reload   --重新加载web war包
tomcat:start    --启动tomcat
tomcat:stop    --停止tomcat
tomcat:undeploy --停止一个war包
tomcat:run  --启动嵌入式tomcat ,并运行当前项目

配置参数:
path:是访问应用的路径
port:是tomcat 的端口号
uriEncoding:URL按UTF-8进行编码,这样就解决了中文参数乱码。
Server:指定tomcat名称。

2.3 自动部署插件wagon

自动部署包含三个步骤:
编译打包、上传到服务器、在服务器上执行linux命令

2.3.1 文件上传到服务器

Maven项目可使用 mvn install 指令打包,打包完成后包位于target目录下,要想在远程服务器上部署,首先要将包上传到服务器。

首先在本地的setting.xml中配置server的信息,包括id,用户名,密码。(当然也可以在pom.xml里面配置)


    
      linux_server
      user
      password
    

pom.xml


    
        
            org.apache.maven.wagon
            wagon-ssh
            2.8
        
    
    
        
            org.codehaus.mojo
            wagon-maven-plugin
            1.0
            
                linux_server
                target/test.war
                scp://user:password@192.168.20.128/home/tomcat7/webapps
            
        
    

linux_server: 在setting.xml中配置的server的id名字
target/test.war:是要上传到服务器的文件,一般来说是jar或者war包 scp://user:password@192.168.20.128/home/tomcat7/webapps:配置服务器的用户、密码、地址以及文件上传的目录

命令:

# 对项目进行打包和上传操作
mvn clean install wagon:upload-single 

如果觉的wagon命令太长,可以设置 excutions 来配置phase和goals来简化命令。

2.3.2 在服务器上执行linux命令
1. 运行jar文件



    
        
            org.apache.maven.wagon
            wagon-ssh
            2.8
        
    
    
        
            org.codehaus.mojo
            wagon-maven-plugin
            1.0
            
            
                target/test.jar
                scp://user:password@192.168.20.128/home/java/exe
                
                    pkill -f /home/java/exe/test.jar  
                    nohup java -jar /home/java/exe/test.jar > /home/java/exe/$(date +%Y%m%d-%H%M%S).log &  
                
                true 
            
        
    

命令


mvn clean install wagon:upload-single wagon:sshexec
2. 上传war包并启动Tomcat

   
       
           org.apache.maven.wagon
           wagon-ssh
           2.8
       
   
   
       
           org.codehaus.mojo
           wagon-maven-plugin
           1.0
           
           
               target/javawebdeploy.war
               scp://user:password@192.168.20.128/home/tomcat7/webapps
               
                   
                   sh /home/tomcat7/bin/shutdown.sh
                   rm -rf /home/tomcat7/webapps/test
                   sh /home/tomcat7/bin/startup.sh
               
               true
           
       
   

命令

mvn clean install wagon:upload-single wagon:sshexec
2.3.3 配置execution

如果觉得 mvn clean package wagon:upload-single wagon:sshexec 命令太长了不好记,那么可以配置execution,在运行deploy的同时运行upload-single和sshexec。


    
        
            org.apache.maven.wagon
            wagon-ssh
            2.8
        
    
    
        
            org.codehaus.mojo
            wagon-maven-plugin
            1.0
            
                
                    upload-deploy
                    
                    deploy
                    
                        upload-single
                        sshexec
                    
                    
                    
                        target/test.war
                        scp://user:password@192.168.20.128/home/tomcat7/webapps
                        
                            sh /home/tomcat7/bin/shutdown.sh
                            rm -rf /coder/tomcat7/webapps/test
                            sh /coder/tomcat7/bin/startup.sh
                        
                        true
                    
                
            
        
    

部署命令




mvn clean deploy -D maven.deploy.skip=true
2.3.4. 完整示例配置

首先在本地的setting.xml中配置server的信息,包括id,用户名,密码。(当然也可以在pom.xml里面配置)


    
      linux_server
      user
      password
    

pom.xml


    
        
            org.apache.maven.wagon
            wagon-ssh
            2.8
        
    
    
        
            org.codehaus.mojo
            wagon-maven-plugin
            1.0
            
            
                linux_server
                scp://192.168.20.128/home/tomcat7/webapps
                true 
            
            
            
                
                
                    upload-war-to-server
                    deploy
                    
                        upload-single
                        sshexec
                    
                    
                        target/test.war
                        
                            datefilename=$(date +%Y%m%d-%H%M%S);cp /home/tomcat7/webapps/test.war /home/tomcat7/webapps/test.war.$datefilename  
                            ps -ef | grep /home/tomcat7/ | grep -v grep | awk {"print $2"} | sed -e "s/^/kill -9 /g" | sh 
                            rm -rf /home/tomcat7/webapps/test 
                            export JAVA_HOME=/home/jdk/jdk1.8.0_91;sh /home/tomcat7/bin/startup.sh 
                        
                    
                
        
    

部署命令

# 必须加 -D maven.deploy.skip=true ,表示跳过maven自身的deploy使用wagon的deploy。否则报错“-DaltDeploymentRepository=id::layout::url parameter”
mvn clean deploy -D maven.deploy.skip=true
2.4 maven-war-plugin

Maven打包时可以对web.xml中的spring.profiles.active值进行替换。

web.xml中配置一个占位符${profiles.active}:


    spring.profiles.active
    ${profiles.active}

pom.xml配置maven-war-plugin



  
    maven-war-plugin
    3.2.2
    
      
      true
    
  




  dev



  
    dev
    
      dev
    
  
  
    release
    
      release
    
  

以上配置完成后,再通过mvn package -Pdevmvn package -Preelase打包后,${profiles.active}<占位符就被替换为devrelease

六、Maven控制测试环境和正式环境 6.1 Maven profiles切换测试环境和正式环境

    
        
        dev
        
            dev
        
        
            
            true
        
    
    
        
        release
        
            release
        
    
    
        
        beta
        
            beta
        
    
 




    helloworld
    
        
        
            src/main/resources
            
                config/
            
        
        
        
            src/main/resources/config/${profiles.active}
            .
        
    

id代表这个环境的唯一标识,在 mvn install -Pdev 来指定。
此properties定义了三个环境,分别是dev(开发环境)、beta(测试环境)、release(发布环境)
activeByDefault=true代表如果不指定某个固定id的profile,那么就使用这个环境

使用 mvn install -Pdev会将 id 为 dev 的 profile 中的定义的属性profiles.active自动替换${profiles.active}占位符的变量。最终build到classpath的资源文件由maven-resources-plugin来指定,为src/main/resources/config/dev文件下的所有文件。

6.2 Spring Framework profile整合Maven profile

如果想要整合Maven profile和Spring Framework profile,Maven打包时可以对web.xml中的spring.profiles.active值进行替换。

web.xml中配置一个占位符${profiles.active}:


    spring.profiles.active
    ${profiles.active}

pom.xml配置maven-war-plugin



  
    maven-war-plugin
    3.2.2
    
      
      true
    
  




  dev



  
    dev
    
      dev
    
  
  
    release
    
      release
    
  

以上配置完成后,再通过mvn package -Pdevmvn package -Preelase打包后,${profiles.active}<占位符就被替换为devrelease

七、Maven 变量 1. 内置属性

${basedir} represents the directory containing pom.xml

**${version}** equivalent to ${project.version } or ${pom.version }

2. Pom/Project properties

所有pom中的元素都可以用 project. 前缀进行引用,以下是部分常用的

**${project.build.directory}** results in the path to your "target" dir, this is the same as ${pom.project.build.directory}

${project.build.outputDirectory} results in the path to your "target/classes" dir

${project.name} refers to the name of the project.

${project.version} refers to the version of the project.

${project.build.finalName} refers to the final name of the file created when the built project is packaged

3. 本地用户设定

所有用的的 settings.xml 中的设定都可以通过 settings. 前缀进行引用

${settings.localRepository} refers to the path of the user"s local repository.

${maven.repo.local} also works for backward compatibility with maven1

4. 环境变量

系统的环境变量通过 env. 前缀引用

${env.M2_HOME} returns the Maven2 installation path.

**${java.home}** specifies the path to the current JRE_HOME environment use with relative paths to get for example: ${java.home}../bin/java.exe

5. java系统属性

所有JVM中定义的java系统属性.

6. pom.xml自定义变量
 
    ... 
     
        hellowolrld 
     
    ... 
 

则引用 ${project.build.finalName} 就会得到值 hellowolrld

7. parent 工程的变量

parent工程的pom.xml中的变量用前缀 ${project.parent} 引用. 上级工程的版本也可以这样引用: ${parent.version }.

参考文章:  
https://blog.csdn.net/wwbmyos...
https://blog.csdn.net/j080624...
http://xxgblog.com/2015/10/23...
https://blog.csdn.net/java_an...
https://blog.csdn.net/xiao__g...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69566.html

相关文章

  • dubbo整合springboot最详细入门教程

    摘要:说明目前互联网公司,大部分项目都是基于分布式,一个项目被拆分成几个小项目,这些小项目会分别部署在不同的计算机上面,这个叫做微服务。当一台计算机的程序需要调用另一台计算机代码的时候,就涉及远程调用。此时就粉末登场了。 showImg(https://s2.ax1x.com/2019/07/05/ZaELxe.jpg); 说明 目前互联网公司,大部分项目都是基于分布式,一个项目被拆分成几个...

    JinB 评论0 收藏0
  • Java缓存框架---EhCache(基于Maven+Spring的EhCache入门教程

    摘要:今天就介绍一款常用的缓存框架。设置缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。内存不足时,是否启用磁盘缓存。磁盘失效线程运行时间间隔,默认是秒。 在当今大数据爆发时代,数据量每天都呈爆炸式增长,频繁的数据库访问无疑给数据库带来的极大负载,除了增大物理服务器的数量,我们也可以将一些常用的、公共的资源以cache形式放在客户端或者靠近客户端的服务器上,从而减少了服务器的...

    suosuopuo 评论0 收藏0
  • JavaFx系列教程之一:JavaFx+Springboot+Maven 开发打包教程

    摘要:最近在用开发窗体程序,并且以后打算把所有的窗体软件切换到上面,并且还想用的各种好处,集成了就可以愉快的用各种服务了。最重要的是打包工具。由于我是,一般用和,执行命令会看到打包成了和两种类型的安装包。由于没有计算机,所以还不知道打包成的状态。 最近在用 JavaFx 开发窗体程序,并且以后打算把所有的窗体软件切换到 JavaFx 上面,并且还想用 springboot 的__各种好处,集...

    Coding01 评论0 收藏0
  • SpringBoot简单入门

    摘要:接下来我们继续看如果达成包,在加入如下配置然后通过打包,最后通过命令启动这样,最简单的就完成了,但是对于一个大型项目,这是远远不够的,的详细操作可以参照官网。以上实例只是最简单的项目入门实例,后面会深入研究。 什么是Spring Boot Spring Boot是由Pivotal团队提供的基于Spring的全新框架,其设计目的是为了简化Spring应用的搭建和开发过程。该框架遵循约定大...

    BWrong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<