Maven 常识与命令

基本命令

  • 打印系统所有的系统属性和环境变量:mvn help:system
  • 查看版本:mvn -v mvn -version
  • 编译:mvn compile
  • 删除 target :mvn clean
  • 安装构件到本地仓库:mvn install
  • 发布构件到远程仓库:mvn deploy
  • 发布构件(不包含子模块): mvn clean deploy -N
  • 打包:mvn package
  • 只打 jar 包:mvn jar:jar
  • 已解析依赖树:mvn dependency:tree
  • 已解析依赖列表:mvn dependency:resolve mvn dependency:list
  • 分析依赖:mvn dependency:analyze
  • 获取插件帮助
  • 跳过Test:-DskipTests(编译但是不运行) -Dmaven.test.skip=true(不编译不运行)
  • build一个失败后,继续执行其他:-fn
  • 已解析的插件树: mvn dependency:resolve-plugins
  • 下载Sources文件: mven dependency:sources
  • FS常用: mvn -am -U clean package -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -pl <artifactId>

archetype插件

  • 创建mvn项目:mvn archetype:generate mvn archetype:generate -DgroupId=<your-groupId> -DartifactId=<your-artifactId> -Dversion=<version> -Dpackage=<package-name>

web容器中间件插件

  • 运行项目于 jetty 上:mvn -Djetty.port=<port> jetty:run
  • 运行项目于 tomcat上:mvn -Dmaven.tomcat.port=<port> tomcat7:run

依赖

依赖范围

依赖范围 对于编译classpath是否有效 对于测试classpath是否有效 对于运行classpath是否有效 例子
compile Y Y Y spring-core
test - Y - junit
provided Y Y - servlet-api
runtime - Y Y JDBC驱动实现
system Y Y - 本地的,maven仓库之外的类库文件

传递性依赖

第一依赖↓\第二依赖→ compile test provided runtime
compile compile - _ runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

依赖调解

  • 第一原则:路径最近者优先;
  • 第二原则:第一声明者优先;

生命周期

  • clean生命周期:清理项目
    1. pre-clean: 执行一些清理前需要完成的工作;
    2. clean: 清理上一次构建生成的文件;
    3. post-clean:执行一些清理后需要完成的工作;
  • default生命周期:构建项目
    1. validate
    2. initialize
    3. generate-sources
    4. process-sources:处理项目主资源文件。一般来说是对/src/main/resources目录的内容进行变量替换等工作,复制到项目输出的主classpath目录中。
    5. genarate-resources
    6. compile:编译项目的主源码。一般来说是编译/src/main/java目录下得Java文件到项目输出的主classpath目录中。
    7. process-classes
    8. generate-test-sources
    9. process-test-sources:处理项目测试资源文件。一般来说是对/src/test/resources目录的内容进行变量替换等工作,复制到项目输出的测试classpath目录中。
    10. generate-test-resources
    11. test-compile:编译项目的测试源码。一般来说是编译/src/test/java目录下得Java文件到项目输出的测试classpath目录中。
    12. process-test-classes
    13. test:使用单元测试框架运行测试,测试代码不会被打包或部署。
    14. prepare-package
    15. package:接受编译好的代码,打包成可发布的格式,如JAR。
    16. pre-integration-test
    17. integration-test
    18. post-integration-test
    19. verify
    20. install:将包安装到Maven本地仓库,供本地其他Maven项目使用。
    21. deploy:将最终的包复制到远程仓库。
  • site生命周期:建立项目站点
    1. pre-site:执行一些在生成项目站点之前需要完成的工作。
    2. site:生成项目站点文档。
    3. post-site:执行一些在生成项目站点之后需要完成的工作。
    4. site-deploy:将生成的项目站点发布到服务器上。

继承

可继承的元素

  • groupId:项目组ID,项目坐标的核心元素;
  • version:项目版本,项目坐标的核心元素;
  • description:项目的描述信息;
  • organization:项目的组织信息;
  • inceptionYear:项目的创始年份;
  • url: 项目的URL地址;
  • developers:项目的开发者信息;
  • contributors:项目的贡献者信息;
  • distributionManagement:项目的部署配置;
  • isssueManagement:项目的绝仙跟踪集成系统;
  • ciManagement:项目的持续集成系统信息;
  • scm:项目的版本控制系统信息;
  • mailingLists:项目的邮件列表;
  • properties:自定义的Maven属性;
  • dependencies:项目的依赖配置;
  • dependencyManagement:项目的依赖管理配置;
  • repositories:项目的仓库配置;
  • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
  • reporting:项目的报告输出目录配置、报告插件配置等;

属性

  • 内置属性:
    • ${basedir}表示项目根目录,即pom.xml所在的目录,
    • ${version}表示项目版本;
  • POM属性:
    • ${project.groupId}:项目的groupId;
    • ${project.artifactId}:项目的artifactId;
    • ${project.version}:项目的版本;
    • ${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java
    • ${project.build.testSourceDireactory}:项目的测试源码目录,默认为src/test/java
    • ${project.build.directory}:项目构建输出目录,默认为target/
    • ${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes
    • ${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes;
    • ${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}
  • 自定义属性
  • Settings属性:settings.xml文件元素的值,如${settings.localRepository}表示用户本地仓库的地址;
  • Java系统属性:所有Java系统属性都可以使用Maven属性引用,例如${user.home}指向了用户目录。可以通过mvn help:system来查看所有的系统变量;
  • 环境变量属性:以env.开头的maven属性引用,例如${env.JAVA_HOME}指向了JAVA_HOME环境变脸的值,可以通过mvn help:system查看所有的环境变量;

标签详解

dependency标签

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<classifier></classifier>
<optional></optional>
<scope></scope>
<systemPath></systemPath>
<exclusions></exclusions>
</dependency>
  • groupId
  • artifactId
  • version
  • type
    • 依赖的类型,可选jar,war,pom,默认jar
  • classifier
    • 构建类型,比如sources,javadoc,jdk17,jdk18等;
  • optional

    • 有依赖A -> B -> C,如果A不想依赖C,那么在B依赖C的时候,声明C的optional为true,则A引入B依赖的时候,不会引入C依赖;
      1
      2
      3
      4
      5
      6
      7
      pom.xml(ProjectB)
      <dependency>
      <groupId>sample.ProjectC</groupId>
      <artifactId>ProjectC</artifactId>
      <version>1.0-SNAPSHOT</version>
      <optional>true</optional>
      </dependency>
  • exclusions

    • 依赖排除,就是有时候引入某一个依赖的时候,该依赖下有jar包冲突,可以排除掉,不引用该jar;
  • scope
    • 可选 compile、test、runntime、provided,system,import;默认 compile;
  • systemPath
    • 当maven依赖本地而非repository中的jar包,sytemPath指明本地jar包路径;
      1
      2
      3
      4
      5
      6
      7
      <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
      <version>1.5</version>
      <scope>system</scope>
      <systemPath>${basedir}/WebContent/WEB-INF/lib/hamcrest-core-1.3.jar</systemPath>
      </dependency>