Maven - Java 项目管理工具
POM (Project Object Model)
- 定义项目的类型、名字,管理依赖关系,定制插件的行为等等
Maven 插件
- mvn archetype:generate (archetype:generate)就是其中一个插件
Maven 生命周期、阶段
mvn 生命周期
default 生命期关注的是项目的编译和打包clean 生命期关注的是从输出目录中删掉临时文件,包括自动生成的源文件、编译后的类文件,之前版本的jar文件等site 生命期关注的是为项目生成文档。实际上,site 可以使用文档为项目生成一个完整的网站
mvn 阶段
1. validate 验证项目的正确性,以及所有必需的信息都是否都存在。同时也会确认项目的依赖是否都下载完毕。2. compile 编译项目的源代码3. test 选择合适的单元测试框架,对编译后的源码执行测试;这些测试不需要代码被打包或者部署。4. package 将编译后的代码以可分配的形式打包,如Jar包。5. install 将项目打包后安装到本地仓库,可以作为其它项目的本地依赖。6. deploy 将最终的包复制到远程仓库,与其它开发者和项目共享。
Maven 依赖管理
Maven 库
Maven 工程类型
- war 网站工程
- jar 工程
- pom 聚合工程
- 父工程使用 pom 工程
- 定义依赖的 jar 版本
- maven 插件
- maven 仓库源
一、安装与配置
1. 安装
1. 下载二进制的包Binary tar.gz archivetar -zxvf /your-path/apache-maven-x.x.x-bin.tar.gz2. 连接sudo ln -s /your-path/apache-maven-x.x.x /usr/local/maven3. 环境变量vim ~/.bashrc# Maven# 注意配置 Java Home ,如果 Java Home 不存在的话# export JAVA_HOME=/java_pathexport MAVEN_HOME=/usr/local/mavenexport M2_HOME=$MAVEN_HOMEexport M2_REPO=$MAVEN_HOME/repositoryexport PATH=$MAVEN_HOME/bin:$PATHsource ~/.bashrc4. 验证mvn -v5. 添加 alibab 源vim $MAVEN_HOME/conf/settings.xml<!-- 阿里源 --><mirror><id>alimaven</id><name>aliyun maven</name><mirrorOf>central</mirrorOf><url>http://maven.aliyun.com/nexus/content/groups/public/</url></mirror>
2. 配置 settings.xml
- mvn 环境配置文件
1. 本地仓库路径修改mkdir -p $MAVEN_HOME/repositoryvim $MAVEN_HOME/conf/settings.xml# 本地仓库路径<localRepository>/usr/local/maven/repository</localRepository>
3. Maven 集成到 eclipse
偏好设置 -> Mavan -> Installations -> add : 添加 Maven 安装目录-> User Settings -> User Settings -> Browse : 选择 Maven 配置文件-> Local Repository : 配置仓库目录,与环境变量 $M2_REPO 一致
三、使用案例
1. 运行
* maven 阶段1. 创建 Maven 项目1) mvn -B archetype:generate \-DarchetypeGroupId=com.angejia.dw \-DgroupId=com.angejia.dw.hive.udf \-DartifactId=my-maven-app2) 基于原型(模板工具) 创建项目官方文档: http://maven.apache.org/guides/introduction/introduction-to-archetypes.html# maven-archetype-quickstart (Java Project)# maven-archetype-webapp (Java Web Project)mvn archetype:generate \-DgroupId=com.yiibai.core \-DartifactId=ProjectName \-DarchetypeArtifactId=maven-archetype-quickstart \-DinteractiveMode=false2. compile 编译mvn compile3. test 测试单元mvn test 编译测试资源,并运行运行所有单元测试mvn test-compile 编译测试资源(但不执行测试)mvn -Dtest=AppTest test 运行单个类的测试单元4. package 打包项目,更新代码重新运行mvn clean package 先清理后打包mvn package# 运行java -cp target/dw-hive-udf-1.0-SNAPSHOT.jar com.angejia.dw.hive.udf.App5. install 将项目打包后安装到本地仓库,可以作为其它项目的本地依赖。mvn clean install 先清理后安装mvn install6. clean 清理项目mvn clean*. eclipse IDE 集成mvn eclipse:eclipse 第一次运行、更新 pox.xml 文件需要重新运行*. 把 jar 包放到本地 repository 仓库中管理mvn install:install-file \-Dfile=/your-path/kaptcha-{version}.jar \-DgroupId=com.google.code \-DartifactId=kaptcha \-Dversion={version} \-Dpackaging=jar# pox.xml 使用<dependency><groupId>com.google.code</groupId><artifactId>kaptcha</artifactId><version>2.3</version></dependency>*。 mvn 依赖管理1) 查看当前项目的依赖树mvn dependency:tree2) 查看当前项目的已解析的依赖mvn dependency:list3) 分析当前项目的依赖mvn dependency:analyze4) 强制更新 pox.xmlmvn clean install -Umvn eclipse:eclipse // 如果是 eclipse 项目则需要更新,执行此命令*. 打印所有java系统属性和环境变量mvn help:system
2. pom.xml 文件详解
<!--pom 顶级元素 --><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/maven-v4_0_0.xsd"><!-- POM 的对象模型是使用哪个版本 --><modelVersion>4.0.0</modelVersion><!-- 组织或集团的唯一标识符,通常是基于组织的完全限定域名。例如 org. .maven --><groupId>com.mycompany.app</groupId><!-- 组织下项目 ID, 例如 myapp-1.0.jar--><artifactId>my-maven-app</artifactId><!-- 表示要使用的包类型的工件(例如 JAR, WAR, EAR) --><packaging>jar</packaging><!-- 生成项目的版本1.0.2 (发布版本)1 大版本, 0 小版本, 2 Bug 和修订版本SNAPSHOT (项目阶段)SNAPSHOT < M1 < M2 < RC < GA < RELEASESNAPSHOT 开发版本M[N] 里程碑版本(即将发布版本)RC 发布候选版本GA 基本可以用版本RELEASE 正式版本--><version>1.0.1-SNAPSHOT</version><!-- 用于项目的显示名称。这是常用于Maven生成文档 --><name>my-maven-app</name><!-- 表明项目的网站可以找到。这是常用于Maven生成文档 --><url>http://maven.apache.org</url><!-- 描述基本的项目 --><dependencies><!-- <dependency> 元素包含信息项目的依赖 --><dependency><!-- 依赖组织 --><groupId>junit</groupId><!-- 组织下的项目 id --><artifactId>junit</artifactId><!-- 版本 --><version>4.11</version><!-- 依赖的范围 :compile 编译和打包都需要(默认),provided 编译需要,打包不需要runtime 编译和打包都不需要, 在运行时需要,test 测试在单元测试中需要,--><scope>compile</scope></dependency><!-- 定义一个外部依赖(不在 maven 仓库中) --><dependency><groupId>mydependency</groupId><artifactId>mydependency</artifactId><scope>scope</scope><version>1.0</version><systemPath>${basedir}\war\WEB-INF\lib\mydependency.jar</systemPath></dependency></dependencies><build><plugins><!-- 指定 JDK 版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>
四、打包所有依赖 assembly
1. assembly 命令
mvn clean compile package 打包命令mvn assembly:assemblymvn eclipse:eclipse打包后的 jartarget/xxxx-jar-with-dependencies.jar 会以 jar-with-dependencies 结尾
2. 配置 maven-assembly-plugin 插件到 pox.xml
<!--pom 顶级元素 --><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/maven-v4_0_0.xsd"><!-- POM 的对象模型是使用哪个版本 --><modelVersion>4.0.0</modelVersion><!-- 组织或集团的唯一标识符,通常是基于组织的完全限定域名。例如 org. .maven --><groupId>com.mycompany.app</groupId><!-- 组织下项目 ID, 例如 myapp-1.0.jar--><artifactId>my-maven-app</artifactId><!-- 表示要使用的包类型的工件(例如 JAR, WAR, EAR) --><packaging>jar</packaging><!-- 生成项目的版本 --><version>1.0-SNAPSHOT</version><!-- 用于项目的显示名称。这是常用于Maven生成文档 --><name>my-maven-app</name><!-- 表明项目的网站可以找到。这是常用于Maven生成文档 --><url>http://maven.apache.org</url><!-- 增加额外的源 --><repositories><repository><id>Maven Repository</id><url>http://repo.maven.apache.org/maven2</url></repository><repository><id>Apache Repository</id><url>https://repository.apache.org/content/repositories/releases</url></repository><repository><id>JBoss Repository</id><url>https://repository.jboss.org/nexus/content/repositories/releases/</url></repository><repository><id>Cloudera Repository</id><url>https://repository.cloudera.com/artifactory/cloudera-repos/</url></repository></repositories><!-- 依赖管理 --><dependencies><!-- <dependency> 元素包含信息项目的依赖 --><dependency><!-- 依赖组织 --><groupId>junit</groupId><!-- 组织下的项目 id --><artifactId>junit</artifactId><!-- 版本 --><version>4.11</version><scope>scope</scope></dependency></dependencies><build><!-- 插件 --><plugins><!-- 打包插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- assembly 打包插件 --><plugin><artifactId>maven-assembly-plugin</artifactId><version>2.6</version><configuration><!-- 打包依赖后的 jar 后缀名 --><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><!--描述文件路径<descriptors><descriptor>src/assembly/assembly.xml</descriptor></descriptors>--></configuration><executions><execution><id>make-assembly</id> <!-- this is used for inheritance merges --><phase>package</phase> <!-- bind to the packaging phase --><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build></project>
