maven项目管理工具记录

初识maven


个人对maven使用的总结:
https://blog.csdn.net/ya_1249463314/article/details/61416711

关键概念之坐标和依赖


什么是坐标

在我们的工程中引用的jar包和war包等文件,我们需要通过坐标来对这些构件来进行唯一标识。所以坐标的作用就是为构件进行唯一标识。

坐标详解

groupId:就是定义当前的maven项目属于哪个公司的哪个项目,groupId的表示方式与java包名的表示方式类似,通常域名反向一一对应。
artifactId:就是项目中指定的模块。推荐做法是使用实际项目名称作为artifactId作为前缀。
version:就是maven项目中当前构件的版本号、
packaging:就是当前maven项目打包方式。如果写成jar,那么就打包成jar包。如果写war,就打包成war包。如果不定义packaging,那么默认值就打成jar。
classifier:就是帮助输出一些附属的构件。譬如文档doc,源码source等文件。但是要注意这个属性是不能直接定义的,附属构件是插件帮助生成的。

依赖的配置

依赖的前提是坐标,只有坐标定位,才能找到maven对应的依赖。
依赖的配置:
groupId artifactId version:依赖基本坐标
type:依赖的类型,对应于项目坐标定义的packaging。默认情况下声明为jar。
scope:依赖的范围。(compile:编译期依赖范围;test:测试依赖范围;provided:已提供范围,就是对于编译和测试classpath有效,运行时期无效;runtime:运行时依赖范围。对于测试和运行classpath时有效,但是编译主代码时无效;system:系统依赖范围)。
optional:可选依赖。我们知道依赖有传递性,A依赖于B,B依赖于C并且B依赖于D,如果B中设置optional属性为true,那么A将不会依赖于C和D。C和D只会对B产生影响。
exclusions:用来排除指定的依赖。由于依赖的传递性,就会给项目隐式的引入很多依赖,但是往往会带来一些冲突等问题。我们可以使用exclusions来排除多个冲突的依赖。

关键概念之仓库


什么是仓库

仓库就是用来存放构件的地方。

仓库的分类

本地仓库:每个用户都会在自己的windows、linux上拥有一个仓库目录。用来存放jar包。在settings.xml中配置。
中央仓库:面向全球的。远程仓库下载地址:http://repo1.maven.org/maven2
公司私服仓库:是一种远程仓库,部署在局域网中,方便整个团队的开发使用。

关键概念之生命周期


Maven的三套独立的生命周期
① clean生命周期:清理项目。
② default生命周期:构建项目。
③ site生命周期:建立项目站点。
clean生命周期
pre-clean执行清理前的准备工作
clean清理上一次构建生成的文件
post-clean执行一些清理后需要的工作
default生命周期
validate
initialize
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或war。
pre-integration-test
intergration-test
post-integration-test
verify
install将maven包安装到本地maven库,让本地的其他的项目来使用此包。
deploy将最终的包部署到远程仓库。让其他程序员和maven项目使用。
site生命周期
site生命周期就是建立和发布项目站点。
pre-site执行一些项目站点之前需要完成的工作。
site生成项目的文档。
post-site执行一些生成项目站点之后的工作。
site-deploy将项目站点发布到服务器。

关键常用命令

mvn clean命令就是执行clean生命周期中的clean阶段(清理上一次构建的文件)。
mvn test命令就是执行default生命周期中的test阶段(使用单元测试框架运行测试)。
mvn clean install命令就是执行了clean生命周期中的clean阶段和default生命周期中的install阶段(清理上一次构建的文件并且将maven包安装到本地maven库中)。
mvn clean deploy site-deploy命令就是执行了clean生命周期的clean阶段、default生命周期的deploy阶段、site生命周期的site-deploy阶段(清理上一次构建的文件、将maven包安装到本地maven库中、将项目站点发布到服务器)。


补充:
mvn compile命令执行default生命周期中的compile阶段(编译项目中的主源码)。
mvn package命令执行default生命周期中的package阶段(将代码打包成指定的格式)。

关键概念之聚合


什么是聚合

聚合就是为了满足我们一次想构建多个项目,而不是去每个项目专门的构建一遍。达到快速构建项目的目得。

聚合如何实现

采用pom打包多个module元素来实现多个项目模块的聚合。
例子:


1.jpg

maven-parent的pom文件:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cn.spy</groupId>
  <artifactId>maven-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>maven-parent</name>

  <modules>
    <module>../maven-first</module>
    <module>../maven-second</module>
    <module>../maven-third</module>
  </modules>
  
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

</project>

执行maven install命令


2.jpg

解释:
maven会首先解析聚合模块的pom文件。分析要构建的模块并且计算反应堆构建顺序。然后按照这个顺序构建各个模块。

关键概念之继承


什么是继承

项目模块与项目模块之间会存在调用重复jar包的情况。为了消除这个情况,使用继承来消除重复配置。

继承的实现

例子:
maven-parent的pom配置

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cn.spy</groupId>
  <artifactId>maven-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>maven-parent</name>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.31</version>
    </dependency>
  </dependencies>
  
</project>

注意:我在maven-parent中加入了fastjson的jar包依赖配置。当maven-first项目模块继承maven-parent项目模块就会发现maven-first项目会自动依赖了fastjson的jar包了。
maven-first项目模块的pom文件配置:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
   
  <parent>
    <groupId>cn.spy</groupId>
    <artifactId>maven-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../maven-parent/pom.xml</relativePath>
  </parent>
  
  <groupId>cn.spy</groupId>
  <artifactId>maven-first</artifactId>
  <version>1.0.1-SNAPSHOT</version>
  <name>maven-first</name>
</project>

解释:可以发现maven-first也引入了fastjson的jar包

4.jpg

注意:
① 父类maven-parent项目模块的packaging打包类型必须为pom。
② relativePath表示父模块相对路径。当项目构建时,会根据relativePath去检查父类的pom。如果没找到,就从本地仓库中找。
③ maven默认父pom在上一层目录。

关键概念之依赖管理


继承的引发的问题

如果子项目模块继承了父项目模块的pom,那么就会自动依赖父项目模块的jar包了。如果子项目模块想要根据实际需要引入父项目模块的jar包,那么就需要dependencyManagement元素。这样就可以增加继承的灵活性。

dependencyManagement元素的使用

maven-parent的pom文件:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
   <groupId>cn.spy</groupId>
  <artifactId>maven-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>maven-parent</name>
  <properties>
    <fastjson.version>1.2.31</fastjson.version>
    <junit.version>4.11</junit.version>
  </properties>
  
  <dependencyManagement>
     <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>${junit.version}</version>
          <scope>test</scope>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
      </dependencies>
  </dependencyManagement>
</project>

maven-second项目模块的pom文件:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>cn.spy</groupId>
    <artifactId>maven-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../maven-parent/pom.xml</relativePath>
  </parent>
  <artifactId>maven-second</artifactId>
  <name>maven-second</name>

  <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
  </dependencies>
</project>

由于我们是maven中引用jar包的继承,所以我们的<packaging>标签为pom。如果我们是引用的jar包提供的接口实现,那么我们就将<packaging>标签为jar。


解释:
可以发现虽然maven-second项目模块继承maven-parent但是只对junit的jar包进行了引用,对于不需要的fastjson的jar包并没有引用。
常用元素总结:
description:项目的描述信息。
inceptionYear:项目的创始年份。
distributionManagement:项目的部署配置。
properties:自定义的maven属性。
repositories:项目的仓库配置。
build:项目的源码目录配置、输出目录配置、插件配置、插件管理配置等。
reporting:项目的报告输出目录配置、报告插件配置等。

maven打包引入本地的jar包


<dependency>
            <groupId>com.yizhilu</groupId>
            <artifactId>qq-Sdk4J</artifactId>
            <version>2.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/qq-Sdk4J-2.0.jar</systemPath>
</dependency>

解释:
${project.basedir} :代表当前项目的路径

maven生成jar包


配置pom文件

<build>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack</id>
                        <phase>package</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>com.alibaba</groupId>
                                    <artifactId>dubbo</artifactId>
                                    <outputDirectory>${project.build.directory}/dubbo</outputDirectory>
                                    <includes>META-INF/assembly/**</includes>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

生成eclipse项目文件

SET MAVEN_OPTS= -Xms512M -Xmx512M -XX:PermSize=128M -XX:MaxPermSize=128M -XX:ReservedCodeCacheSize=64M
mvn eclipse:clean eclipse:eclipse -Dwtpversion=2.0

发布项目到本地仓库

SET MAVEN_OPTS= -Xms512M -Xmx512M -XX:PermSize=128M -XX:MaxPermSize=128M -XX:ReservedCodeCacheSize=64M
mvn clean install -Dmaven.test.skip=true
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342