Toc
  1. 关于Maven
  2. 项目配置和标签解释
    1. 生命周期&基本命令
    2. 依赖冲突
    3. 依赖继承
    4. 标签解释
Toc
0 results found
Espada
Apache Maven标签详解

现在真的空,能不能给我点任务?

关于Maven

Apache Maven发布于2004年。目的是解决码农使用Ant所带来的一些问题。

Maven作为Java开发者最常用的构建工具之一,就相当于前端的npm和yarn,现在任何项目自动化对团队来说是非常普遍和重要的。大多数Java开发者对Maven来说是比较熟悉的了,因为在Spring框架覆盖几乎整个Java后端开发的环境里,很多时候复杂、晦涩的配置也有大量的共性,所以基本上可以演变成一部分人完成,几代人模仿使用。

虽然没用过Gradle,但是各大论坛的反映都是比Maven友好,构建越复杂Gradle的优势越明显,貌似Android开发基本都是使用Gradle,以后Gradle可能就是主流了呢。

Springboot提倡干掉XML,用Bean配置类注入的方式,而Maven的独立核心配置文件pom.xml依然是采用XML语言作为编写构建配置的文件格式,不过好在Maven中的pom.xml的还是比较好用的,除了插件会麻烦点。

项目配置和标签解释

Apache Maven官方文档https://maven.apache.org/pom.html

我对于Maven的了解,也就停留在知其然而不知其所以然,连很多标签的含义都没有完全熟悉,之前travis-ci持续集成的过程中就因为Maven打包跳过javadoc环节出了问题而半天不清楚问题的源头在哪。
不同类型的项目在初始化创建的过程中生成的pom.xml可能略有不同,下面拿实际的例子来解释。

生命周期&基本命令

生命周期

一共三套生命周期,每套生命周期都包含一些命令:

  • clean:清理项目
    • clean:这个应该很熟悉,清理上一次构建生成的文件,在Intellij IDEA就相当于target(单个module编译后)
  • default:构建项目
    • compile:编译项目主源码,将src/main/resources目录的内容经过处理后,复制到项目输出的主classpath目录中。
    • test:这个也应该很熟悉,使用单元测试框架运行测试,测试代码不会被打包或部署。
    • package:将编译好的代码,打包成可发布的格式。
    • install:发布到本地仓库
    • deploy:发布到远程仓库
    • verify:运行任何检查,验证包是否有效且达到质量标准。
    • validate:验证工程是否正确,所有需要的资源是否OK。
  • site:建立和发布项目
    • site:生成项目站点文档

packageinstall命令的看起来好像实现的功能都一样,都是编译打包,但是package命令其实进行了打包步骤,而install命令同时把打好的可执行包布署到本地Maven仓库,但没有布署到远程Maven私服仓库。假设B项目依赖A项目,A项目仅仅是package将发布的包发布在target下,这时候编译目标B项目,就会GG报找不到A项目依赖的问题~所以要先把A项目install发布在本地仓库后,即可编译(compile)、打包、部署。如下图该jar是我执行install命令后在本地仓库部署的结果。

执行install命令

自写的jar或者收费产品添加到本地仓库:mvn install:install-file -Dfile=${jar包的位置} -DgroupId=${设置groupId} -DartifactId=${设置artifactId} -Dversion=${设置version} -Dpackaging=jar
比如ojdbc6.jar添加到本地仓库。

<dependency>
<groupId>com.oracle.ojdbc_6groupId>
<artifactId>com.oracle.ojdbc_6artifactId>
<version>1.0version>
dependency>

其他还有一些命令比较好用,比如mvn dependency:tree:打印依赖目录树。
Maven命令

打印结果

依赖冲突

项目中的多jar同时引用了相同的jar时,如果以来的版本不一致就可能产生依赖冲突。

由于Maven采用短路优先的策略,假如project-->A-->B-->C(1.0)project-->D-->C(1.1)那么实际最终依赖C的版本是1.1,因为他的依赖路径最短,那如果一样路径的情况下,则是声明优先,谁先被声明就优先被使用。一般来说,只要不是太久太老的依赖,出现这个问题还是好解决的,可以通过锁定版本一致,或者排除某个依赖。太旧的依赖容易造成版本一致却引起其他依赖无法正常工作。

为了营造这个冲突效果我特地试验了两个依赖,项目引入了5.1.8.RELEASEspring-webmvc,同时引入了5.1.1.RELEASEspring-security-web。可以看到spring-security-web的依赖关系是5.1.1.RELEASEspring-security-core,并提示omitted for duplicate,因为spring-security-web的依赖路径较长,根据短路优先原则,所有相同的依赖被重写成了5.1.8.RELEASE版本。

依赖冲突

依赖继承

当一个项目比较大的时候,通常会拆分成多个module,多个module同时运行就称为聚合。

<modules>
<module>coremodule>
<module>frameworkmodule>
<module>marketmodule>
<module>paymentmodule>
<module>sendermodule>
modules>

当这些被聚合的项目需要引入相同的jar时(这是很常见的事吧!),可以将这些jar写入父pom中,各个子项目继承该pom即可。

父pom:以下依赖将会被子pom继承~

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.oracle.ojdbc_6groupId>
<artifactId>com.oracle.ojdbc_6artifactId>
<version>1.0version>
dependency>
dependencies>
dependencyManagement>

子pom:父pom的坐标

<parent>
<groupId>父pom所在项目的groupIdgroupId>
<artifactId>父pom所在项目的artifactIdartifactId>
<version>父pom所在项目的版本号version>
parent>

标签解释

<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.0http://maven.apache.org/maven-v4_0_0.xsd">

<parent>

<artifactId/>

<groupId/>

<version/>

<relativePath/>
parent>

<modelVersion>4.0.0modelVersion>

<groupId>cn.erhuowanggroupId>

<artifactId>erhuowang-maven2artifactId>

<packaging>warpackaging>

<version>1.0-SNAPSHOTversion>

<name>erhuo-mavenname>

<url>http://erhuowang.cnurl>

<description>A maven project to study maven.description>

<prerequisites>

<maven/>
prerequisites>

<issueManagement>

<system>erhuowangsystem>

<url>http://erhuowang.cnurl>
issueManagement>

<ciManagement>

<system/>

<url/>

<notifiers>

<notifier>

<type/>

<sendOnError/>

<sendOnFailure/>

<sendOnSuccess/>

<sendOnWarning/>

<address/>

<configuration/>
notifier>
notifiers>
ciManagement>

<inceptionYear/>

<mailingLists>

<mailingList>

<name>Demoname>

<post>chaibozhou@163.compost>

<subscribe>chaibozhou@163.comsubscribe>

<unsubscribe>chaibozhou@163.comunsubscribe>

<archive>chaibozhou@163.comarchive>
mailingList>
mailingLists>

<developers>

<developer>

<id>HELLO WORLDid>

<name>chaimmname>

<email>chaibozhou@163.comemail>

<url/>

<roles>
<role>Project Managerrole>
<role>Architectrole>
roles>

<organization>demoorganization>

<organizationUrl>http://erhuowang.cnorganizationUrl>

<properties>
<dept>Nodept>
properties>

<timezone>-5timezone>
developer>
developers>

<contributors>

<contributor>
<name/><email/><url/><organization/><organizationUrl/><roles/><timezone/><properties/>
contributor>
contributors>

<licenses>

<license>

<name>Apache 2name>

<url>http://www.baidu.com/erhuwoang/LICENSE-2.0.txturl>

<distribution>repodistribution>

<comments>A business-friendly OSS licensecomments>
license>
licenses>

<scm>

<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
connection>

<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
developerConnection>

<tag/>

<url>http://svn.baidu.com/banseonurl>
scm>

<organization>

<name>demoname>

<url>http://www.erhuowang.cnurl>
organization>

<build>

<sourceDirectory/>

<scriptSourceDirectory/>

<testSourceDirectory/>

<outputDirectory/>

<testOutputDirectory/>

<extensions>

<extension>

<groupId/>

<artifactId/>

<version/>
extension>
extensions>

<defaultGoal/>

<resources>

<resource>

<targetPath/>

<filtering/>

<directory/>

<includes/>

<excludes/>
resource>
resources>

<testResources>

<testResource>
<targetPath/><filtering/><directory/><includes/><excludes/>
testResource>
testResources>

<directory/>

<finalName/>

<filters/>

<pluginManagement>

<plugins>

<plugin>

<groupId/>

<artifactId/>

<version/>

<extensions/>

<executions>

<execution>

<id/>

<phase/>

<goals/>

<inherited/>

<configuration/>
execution>
executions>

<dependencies>

<dependency>
......
dependency>
dependencies>

<inherited/>

<configuration/>
plugin>
plugins>
pluginManagement>

<plugins>

<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
execution>
executions>
<dependencies>

<dependency>
......
dependency>
dependencies>
<goals/><inherited/><configuration/>
plugin>
plugins>
build>

<profiles>

<profile>

<id/>

<activation>

<activeByDefault/>

<jdk/>

<os>

<name>Windows XPname>

<family>Windowsfamily>

<arch>x86arch>

<version>5.1.2600version>
os>

<property>

<name>mavenVersionname>

<value>2.0.3value>
property>

<file>

<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/exists>

<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/missing>
file>
activation>

<build>
<defaultGoal/>
<resources>
<resource>
<targetPath/><filtering/><directory/><includes/><excludes/>
resource>
resources>
<testResources>
<testResource>
<targetPath/><filtering/><directory/><includes/><excludes/>
testResource>
testResources>
<directory/><finalName/><filters/>
<pluginManagement>
<plugins>

<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
execution>
executions>
<dependencies>

<dependency>
......
dependency>
dependencies>
<goals/><inherited/><configuration/>
plugin>
plugins>
pluginManagement>
<plugins>

<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
execution>
executions>
<dependencies>

<dependency>
......
dependency>
dependencies>
<goals/><inherited/><configuration/>
plugin>
plugins>
build>

<modules/>

<repositories>

<repository>
<releases>
<enabled/><updatePolicy/><checksumPolicy/>
releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
snapshots>
<id/><name/><url/><layout/>
repository>
repositories>

<pluginRepositories>

<pluginRepository>
<releases>
<enabled/><updatePolicy/><checksumPolicy/>
releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
snapshots>
<id/><name/><url/><layout/>
pluginRepository>
pluginRepositories>

<dependencies>

<dependency>
......
dependency>
dependencies>

<reports/>

<reporting>
......
reporting>

<dependencyManagement>
<dependencies>

<dependency>
......
dependency>
dependencies>
dependencyManagement>

<distributionManagement>
......
distributionManagement>

<properties/>
profile>
profiles>

<modules/>

<repositories>

<repository>

<releases>

<enabled/>

<updatePolicy/>

<checksumPolicy/>
releases>

<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
snapshots>

<id>banseon-repository-proxyid>

<name>banseon-repository-proxyname>

<url>http://192.168.1.169:9999/repository/url>

<layout>defaultlayout>
repository>
repositories>

<pluginRepositories>

<pluginRepository>
......
pluginRepository>
pluginRepositories>


<dependencies>
<dependency>

<groupId>org.apache.mavengroupId>

<artifactId>maven-artifactartifactId>

<version>3.8.1version>

<type>jartype>

<classifier>classifier>

<scope>testscope>

<systemPath>systemPath>

<exclusions>
<exclusion>
<artifactId>spring-coreartifactId>
<groupId>org.springframeworkgroupId>
exclusion>
exclusions>

<optional>trueoptional>
dependency>
dependencies>

<reports>reports>

<reporting>

<excludeDefaults/>

<outputDirectory/>

<plugins>

<plugin>

<groupId/>

<artifactId/>

<version/>

<inherited/>

<configuration/>

<reportSets>

<reportSet>

<id/>

<configuration/>

<inherited/>

<reports/>
reportSet>
reportSets>
plugin>
plugins>
reporting>

<dependencyManagement>
<dependencies>

<dependency>
......
dependency>
dependencies>
dependencyManagement>

<distributionManagement>

<repository>

<uniqueVersion/>
<id>banseon-maven2id>
<name>banseon maven2name>
<url>file://${basedir}/target/deployurl>
<layout/>
repository>

<snapshotRepository>
<uniqueVersion/>
<id>banseon-maven2id>
<name>Banseon-maven2 Snapshot Repositoryname>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshoturl>
<layout/>
snapshotRepository>

<site>

<id>banseon-siteid>

<name>business api websitename>

<url>
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
url>
site>

<downloadUrl/>

<relocation>

<groupId/>

<artifactId/>

<version/>

<message/>
relocation>

<status/>
distributionManagement>

<properties/>
project>
龙鸣
"老罗"
本文作者:Espada
版权声明:本文首发于Espada的博客,转载请注明出处!