Maven总结

来源:互联网 发布:好视通网络要求 编辑:程序博客网 时间:2024/06/07 08:34

一、概念

Maven是一个项目管理和构建自动化工具。Maven提供了开发人员构建一个完整的生命周期框架,开发团队可以自动完成项目的基础工具建设。一个Maven项目的结果如下图所示:
  这里写图片描述
maven项目采用“约定优于配置”的原则,src/main/java约定用于存放源代码,src/main/test用于存放单元测试代码,src/target用于存放编译、打包后的输出文件。

二、常用命令

  • mvn archetype:create 创建Maven项目
  • mvn compile 编译源代码
  • mvn deploy 发布项目
  • mvn-test-compile 编译测试源代码
  • mvn test 运行应用程序中的单元测试
  • mvn site 生成项目相关信息的网站(以网页的形式显示项目的依赖信息)
  • mvn clean 清除target目录中的生成结果
  • mvn package 根据项目生成的jar
  • mvn install 在本地Repository中安装jar
  • mvn eclipse:eclipse 生成eclipse项目文件
  • mvn jetty:run 启动jetty服务
  • mvn tomcat:run 启动tomcat服务
  • mvn clean package -Dmaven.test.skip=true (清除以前的包后重新打包,跳过测试类)

三、POM 文件

Maven的POM文件是一个xml文件,描述项目用到的资源,包括源代码目录、测试代码目录等的位置,以及项目依赖的外部jar包。

POM文件描述的是构建“什么”,而不是“如何”构建。如何构建是取决于Maven的构建阶段和目标。当然,如果需要,你也可以向Maven构建阶段中添加自定义的目标。

每一个项目都有一个POM文件。POM文件即pom.xml,应该放在项目的根目录下。一个项目如果分为多个子项目,一般来讲,父项目有一个POM文件,每一个子项目都有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。

<project xmlns=”http://maven.apache.org/POM/4.0.0xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd”><modelVersion>4.0.0</modelVersion><groupId>com.jenkov</groupId><artifactId>java-web-crawler</artifactId><version>1.0.0</version></project>

modelVersion属性表示使用的POM模型的版本。选择和你正在使用的Maven版本一致的版本即可。版本4.0.0适用于Maven 2和3。

groupId属性是一个组织或者项目(比如开源项目)的唯一ID。大多数情况下,用公司+项目相关的名称作为group ID。groupId不一定非要使用Java的包名,也不一定要使用.分隔符来分隔ID中的词。但是,如果你这么使用,项目将会位于Maven仓库的结构化目录中,该结构化目录与group ID匹配。每一个.是一个目录分隔符,每一个词都表示一个目录。group ID为com.jenkov的项目将位于目录MAVEN_REPO/com/jenkov中。目录路径中的MAVEN_REPO表示Maven仓库的路径。

artifactId属性包含你正在构建的项目的名称。artifact ID是Maven仓库中group ID目录下的子目录名。artifact ID也是构建完项目后生成的jar包的文件名的一部分。构建过程的输出,即构建结果,在Maven中成为构件(artifact)。通常它就是一个jar包、war包或者EAR包,但它也可以是别的。

versionId包含项目的版本号。版本号是artifact ID目录下的子目录名。版本号也用作构建结果名称的一部分。

1、传递性依赖
传递性依赖是Maven2.0的新特性。假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖库的项目文件实现的。一般的,这些项目的所有依赖都会加入到项目中,或者从父项目继承,或者通过传递性依赖。
传递性依赖的嵌套深度没有任何限制,只是在出现循环依赖时会报错。

2、依赖范围
依赖范围会影响传递性依赖,同时也会影响项目构建任务中使用的classpath。
Maven有以下6种依赖范围:

  • compile
    这是默认范围。如果没有指定,就会使用该依赖范围。编译依赖对项目所有的classpath都可用。此外,编译依赖会传递到依赖的项目。
  • provided 和compile范围很类似,但provided范围表明你希望由JDK或者某个容器提供运行时依赖。例如,当使用JavaEE构建一个web应用时,你会设置对Servlet API和相关的Java EEAPIs的依赖范围provided,因为web容器提供了运行时的依赖。provided依赖只对编译和测试classpath有效,并且不能传递。
  • runtime
    runtime范围表明编译时不需要依赖,而只在运行时依赖。此依赖范围对运行和测试classpath有效,对编译classpath无效。
  • test test范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。
  • system
    系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。
  • import(Maven2.0.9及以上)
    import范围只适用于pom文件中的< dependencyManagement >部分。表明指定的POM必须使用< dependencyManagement >部分的依赖。因为依赖已经被替换,所以使用import范围的依赖并不影响依赖传递。
原创粉丝点击