Maven - Java 项目管理工具

  • POM (Project Object Model)

    • 定义项目的类型、名字,管理依赖关系,定制插件的行为等等
  • Maven 插件

    • mvn archetype:generate (archetype:generate)就是其中一个插件
  • Maven 生命周期、阶段

    • mvn 生命周期

      1. default 生命期关注的是项目的编译和打包
      2. clean 生命期关注的是从输出目录中删掉临时文件,包括自动生成的源文件、编译后的类文件,之前版本的jar文件等
      3. site 生命期关注的是为项目生成文档。实际上,site 可以使用文档为项目生成一个完整的网站
    • mvn 阶段

      1. 1. validate 验证项目的正确性,以及所有必需的信息都是否都存在。同时也会确认项目的依赖是否都下载完毕。
      2. 2. compile 编译项目的源代码
      3. 3. test 选择合适的单元测试框架,对编译后的源码执行测试;这些测试不需要代码被打包或者部署。
      4. 4. package 将编译后的代码以可分配的形式打包,如Jar包。
      5. 5. install 将项目打包后安装到本地仓库,可以作为其它项目的本地依赖。
      6. 6. deploy 将最终的包复制到远程仓库,与其它开发者和项目共享。
  • Maven 依赖管理

  • Maven 库

  • Maven 工程类型

    • war 网站工程
    • jar 工程
    • pom 聚合工程
    • 父工程使用 pom 工程
    • 定义依赖的 jar 版本
    • maven 插件
    • maven 仓库源

一、安装与配置

1. 安装

  1. 1. 下载二进制的包
  2. Binary tar.gz archive
  3. tar -zxvf /your-path/apache-maven-x.x.x-bin.tar.gz
  4. 2. 连接
  5. sudo ln -s /your-path/apache-maven-x.x.x /usr/local/maven
  6. 3. 环境变量
  7. vim ~/.bashrc
  8. # Maven
  9. # 注意配置 Java Home ,如果 Java Home 不存在的话
  10. # export JAVA_HOME=/java_path
  11. export MAVEN_HOME=/usr/local/maven
  12. export M2_HOME=$MAVEN_HOME
  13. export M2_REPO=$MAVEN_HOME/repository
  14. export PATH=$MAVEN_HOME/bin:$PATH
  15. source ~/.bashrc
  16. 4. 验证
  17. mvn -v
  18. 5. 添加 alibab
  19. vim $MAVEN_HOME/conf/settings.xml
  20. <!-- 阿里源 -->
  21. <mirror>
  22. <id>alimaven</id>
  23. <name>aliyun maven</name>
  24. <mirrorOf>central</mirrorOf>
  25. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  26. </mirror>

2. 配置 settings.xml

  • mvn 环境配置文件
  1. 1. 本地仓库路径修改
  2. mkdir -p $MAVEN_HOME/repository
  3. vim $MAVEN_HOME/conf/settings.xml
  4. # 本地仓库路径
  5. <localRepository>/usr/local/maven/repository</localRepository>

3. Maven 集成到 eclipse

  1. 偏好设置 -> Mavan -> Installations -> add : 添加 Maven 安装目录
  2. -> User Settings -> User Settings -> Browse : 选择 Maven 配置文件
  3. -> Local Repository : 配置仓库目录,与环境变量 $M2_REPO 一致

三、使用案例

1. 运行

  1. * maven 阶段
  2. 1. 创建 Maven 项目
  3. 1) mvn -B archetype:generate \
  4. -DarchetypeGroupId=com.angejia.dw \
  5. -DgroupId=com.angejia.dw.hive.udf \
  6. -DartifactId=my-maven-app
  7. 2) 基于原型(模板工具) 创建项目
  8. 官方文档: http://maven.apache.org/guides/introduction/introduction-to-archetypes.html
  9. # maven-archetype-quickstart (Java Project)
  10. # maven-archetype-webapp (Java Web Project)
  11. mvn archetype:generate \
  12. -DgroupId=com.yiibai.core \
  13. -DartifactId=ProjectName \
  14. -DarchetypeArtifactId=maven-archetype-quickstart \
  15. -DinteractiveMode=false
  16. 2. compile 编译
  17. mvn compile
  18. 3. test 测试单元
  19. mvn test 编译测试资源,并运行运行所有单元测试
  20. mvn test-compile 编译测试资源(但不执行测试)
  21. mvn -Dtest=AppTest test 运行单个类的测试单元
  22. 4. package 打包项目,更新代码重新运行
  23. mvn clean package 先清理后打包
  24. mvn package
  25. # 运行
  26. java -cp target/dw-hive-udf-1.0-SNAPSHOT.jar com.angejia.dw.hive.udf.App
  27. 5. install 将项目打包后安装到本地仓库,可以作为其它项目的本地依赖。
  28. mvn clean install 先清理后安装
  29. mvn install
  30. 6. clean 清理项目
  31. mvn clean
  32. *. eclipse IDE 集成
  33. mvn eclipse:eclipse 第一次运行、更新 pox.xml 文件需要重新运行
  34. *. jar 包放到本地 repository 仓库中管理
  35. mvn install:install-file \
  36. -Dfile=/your-path/kaptcha-{version}.jar \
  37. -DgroupId=com.google.code \
  38. -DartifactId=kaptcha \
  39. -Dversion={version} \
  40. -Dpackaging=jar
  41. # pox.xml 使用
  42. <dependency>
  43. <groupId>com.google.code</groupId>
  44. <artifactId>kaptcha</artifactId>
  45. <version>2.3</version>
  46. </dependency>
  47. *。 mvn 依赖管理
  48. 1) 查看当前项目的依赖树
  49. mvn dependency:tree
  50. 2) 查看当前项目的已解析的依赖
  51. mvn dependency:list
  52. 3) 分析当前项目的依赖
  53. mvn dependency:analyze
  54. 4) 强制更新 pox.xml
  55. mvn clean install -U
  56. mvn eclipse:eclipse // 如果是 eclipse 项目则需要更新,执行此命令
  57. *. 打印所有java系统属性和环境变量
  58. mvn help:system

2. pom.xml 文件详解

  1. <!--pom 顶级元素 -->
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  4. <!-- POM 的对象模型是使用哪个版本 -->
  5. <modelVersion>4.0.0</modelVersion>
  6. <!-- 组织或集团的唯一标识符,通常是基于组织的完全限定域名。例如 org. .maven -->
  7. <groupId>com.mycompany.app</groupId>
  8. <!-- 组织下项目 ID, 例如 myapp-1.0.jar-->
  9. <artifactId>my-maven-app</artifactId>
  10. <!-- 表示要使用的包类型的工件(例如 JAR, WAR, EAR) -->
  11. <packaging>jar</packaging>
  12. <!-- 生成项目的版本
  13. 1.0.2 (发布版本)
  14. 1 大版本, 0 小版本, 2 Bug 和修订版本
  15. SNAPSHOT (项目阶段)
  16. SNAPSHOT < M1 < M2 < RC < GA < RELEASE
  17. SNAPSHOT 开发版本
  18. M[N] 里程碑版本(即将发布版本)
  19. RC 发布候选版本
  20. GA 基本可以用版本
  21. RELEASE 正式版本
  22. -->
  23. <version>1.0.1-SNAPSHOT</version>
  24. <!-- 用于项目的显示名称。这是常用于Maven生成文档 -->
  25. <name>my-maven-app</name>
  26. <!-- 表明项目的网站可以找到。这是常用于Maven生成文档 -->
  27. <url>http://maven.apache.org</url>
  28. <!-- 描述基本的项目 -->
  29. <dependencies>
  30. <!-- <dependency> 元素包含信息项目的依赖 -->
  31. <dependency>
  32. <!-- 依赖组织 -->
  33. <groupId>junit</groupId>
  34. <!-- 组织下的项目 id -->
  35. <artifactId>junit</artifactId>
  36. <!-- 版本 -->
  37. <version>4.11</version>
  38. <!-- 依赖的范围 :
  39. compile 编译和打包都需要(默认),
  40. provided 编译需要,打包不需要
  41. runtime 编译和打包都不需要, 在运行时需要,
  42. test 测试在单元测试中需要,
  43. -->
  44. <scope>compile</scope>
  45. </dependency>
  46. <!-- 定义一个外部依赖(不在 maven 仓库中) -->
  47. <dependency>
  48. <groupId>mydependency</groupId>
  49. <artifactId>mydependency</artifactId>
  50. <scope>scope</scope>
  51. <version>1.0</version>
  52. <systemPath>${basedir}\war\WEB-INF\lib\mydependency.jar</systemPath>
  53. </dependency>
  54. </dependencies>
  55. <build>
  56. <plugins>
  57. <!-- 指定 JDK 版本 -->
  58. <plugin>
  59. <groupId>org.apache.maven.plugins</groupId>
  60. <artifactId>maven-compiler-plugin</artifactId>
  61. <version>2.3.2</version>
  62. <configuration>
  63. <source>1.8</source>
  64. <target>1.8</target>
  65. </configuration>
  66. </plugin>
  67. </plugins>
  68. </build>
  69. </project>

四、打包所有依赖 assembly

1. assembly 命令

  1. mvn clean compile package 打包命令
  2. mvn assembly:assembly
  3. mvn eclipse:eclipse
  4. 打包后的 jar
  5. target/xxxx-jar-with-dependencies.jar 会以 jar-with-dependencies 结尾

2. 配置 maven-assembly-plugin 插件到 pox.xml

  1. <!--pom 顶级元素 -->
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  4. <!-- POM 的对象模型是使用哪个版本 -->
  5. <modelVersion>4.0.0</modelVersion>
  6. <!-- 组织或集团的唯一标识符,通常是基于组织的完全限定域名。例如 org. .maven -->
  7. <groupId>com.mycompany.app</groupId>
  8. <!-- 组织下项目 ID, 例如 myapp-1.0.jar-->
  9. <artifactId>my-maven-app</artifactId>
  10. <!-- 表示要使用的包类型的工件(例如 JAR, WAR, EAR) -->
  11. <packaging>jar</packaging>
  12. <!-- 生成项目的版本 -->
  13. <version>1.0-SNAPSHOT</version>
  14. <!-- 用于项目的显示名称。这是常用于Maven生成文档 -->
  15. <name>my-maven-app</name>
  16. <!-- 表明项目的网站可以找到。这是常用于Maven生成文档 -->
  17. <url>http://maven.apache.org</url>
  18. <!-- 增加额外的源 -->
  19. <repositories>
  20. <repository>
  21. <id>Maven Repository</id>
  22. <url>http://repo.maven.apache.org/maven2</url>
  23. </repository>
  24. <repository>
  25. <id>Apache Repository</id>
  26. <url>https://repository.apache.org/content/repositories/releases</url>
  27. </repository>
  28. <repository>
  29. <id>JBoss Repository</id>
  30. <url>https://repository.jboss.org/nexus/content/repositories/releases/</url>
  31. </repository>
  32. <repository>
  33. <id>Cloudera Repository</id>
  34. <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
  35. </repository>
  36. </repositories>
  37. <!-- 依赖管理 -->
  38. <dependencies>
  39. <!-- <dependency> 元素包含信息项目的依赖 -->
  40. <dependency>
  41. <!-- 依赖组织 -->
  42. <groupId>junit</groupId>
  43. <!-- 组织下的项目 id -->
  44. <artifactId>junit</artifactId>
  45. <!-- 版本 -->
  46. <version>4.11</version>
  47. <scope>scope</scope>
  48. </dependency>
  49. </dependencies>
  50. <build>
  51. <!-- 插件 -->
  52. <plugins>
  53. <!-- 打包插件 -->
  54. <plugin>
  55. <groupId>org.apache.maven.plugins</groupId>
  56. <artifactId>maven-compiler-plugin</artifactId>
  57. <version>2.3.2</version>
  58. <configuration>
  59. <source>1.8</source>
  60. <target>1.8</target>
  61. </configuration>
  62. </plugin>
  63. <!-- assembly 打包插件 -->
  64. <plugin>
  65. <artifactId>maven-assembly-plugin</artifactId>
  66. <version>2.6</version>
  67. <configuration>
  68. <!-- 打包依赖后的 jar 后缀名 -->
  69. <descriptorRefs>
  70. <descriptorRef>jar-with-dependencies</descriptorRef>
  71. </descriptorRefs>
  72. <!--描述文件路径
  73. <descriptors>
  74. <descriptor>src/assembly/assembly.xml</descriptor>
  75. </descriptors>
  76. -->
  77. </configuration>
  78. <executions>
  79. <execution>
  80. <id>make-assembly</id> <!-- this is used for inheritance merges -->
  81. <phase>package</phase> <!-- bind to the packaging phase -->
  82. <goals>
  83. <goal>single</goal>
  84. </goals>
  85. </execution>
  86. </executions>
  87. </plugin>
  88. </plugins>
  89. </build>
  90. </project>