#Maven约定 默认情况下,在maven中路径为 source code ${basedir}/src/main/java
资源路径: ${basedir}/src/main/resources
Tests: ${basedir}/src/test
编译文件路径: ${basedir}/target/classes
打包JAR文件: ${basedir}/target
#Maven Features
- Dependency Mangement 项目依赖管理
- Remote Repositories
- Universal Reuse of Build Logic
- Tool Portability/Integration
- Easy Searching and Filtering of Project Artifacts
#Maven目录文件
LICENESE.txt NOTICE.txt README.txt bin/ boot/ conf/ lib/
lib/ 目录下包含一个JAR文件(maven-core-3.0.3-uber.jar),是maven的核心文件。 *conf/*目录下包含了maven的配置文件
#插件与Goals(目标) Maven插件(Plugin):一个或多个goals的集合。 maven插件可以是由java、ant、Groovy、beanshell、Ruby等语言编写的 目标(goal):代表一个特殊的任务,既可以是一个可单独执行的任务,也可以由多个小任务组成的大任务。goal是maven的“工作单元”(unit of work)。
Jar Plugin:是maven的一个核心插件,目标是创建jar文件。 Compiler plugin:目标包含了编译源文件、单元测试。 Suerfire:目标包含单元测试和生成测试报告。
mvn archetype:generate archetype代表maven插件的名字;generate代表goal。
#Maven生命周期 maven有一系列的生命周期,而插件的goal都依附于特定的生命周期。当执行maven的某个生命周期时,该什么周期中依附的goal都会被执行。
site 阶段: 执行maven site,会在target/site目录下生成一系列的html文件,它们包含了对于项目基本信息的描述,依赖关系的描述、单元测试报告、Javadoc 项目API等等。 #Maven Coordinates 由groupId, artifactId, packaging, version组成,用来唯一标识一个项目。
#Maven Repositories Maven resources:resource 目标会从远程库中下载最新的插件、依赖库等项目。
#Maven 依赖管理 maven会解析POM文件,查找当前项目依赖的库;然后,再解析被依赖项目的POM文件,找到它们所依赖的项目,如此递归下去。 利用命令查看项目完整POM配置
mvn help:effective-pom
依赖范围(scope)
- test: 依赖关系会在 Compiler:testCompile 和surefire:test目标中,被加入classpath,而其在执行其他目标时,是不可见的。
- provided: 依赖关系在编译过程中有效,但是不会被集成到最终的打包文件中。
mvn dependency:resolve 查看项目依赖情况
mvn dependecy:tree 查看项目依赖树
maven debug标志 -X eg: mvn install -X
#Maven单元测试 ##单元测试类文件,放在src/test目录下和被测试类相同的路径中,例如
被测试文件路径: src/main/java/com/simple/Simple.java 测试文件路径: src/test/java/com/simple/SimpleTest.java
##测试中所用到的资源文件放在
src/test/resources
##执行单元测试
mvn test
##忽略单元测试错误 方法一、POM文件中配置surefire插件
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
方法二、命令行配置
mvn test -Dmaven.test.failure.ignore=true
##跳过单元测试 方法一、POM文件配置
<configuration>
<skip>true</skip>
</configuration>
方法二、命令行配置
mvn install -Dmaven.test.skip=true
生命周期不一定是install
#打包命令行应用
- 配置Assembly Descriptor插件
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef><!--打包后jar文件后半部分的名称-->
</descriptorRefs>
</configuration>
</plugin>
- 执行打包命令
mvn install assembly:assembly
在install生命周期内执行打包
将打包目标附着到maven生命周期中
在执行 mvn package 时会执行配置的assembly:attached命令, 由于package先于install, 所以执行mvn install同样会完成打包
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef><!--打包后jar文件后半部分的名称-->
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>simple-command</id>
<phase>package</phase> <!--指定插件的生命周期为package-->
<goals>
<goal>attached</goal> <!--在package阶段会执行assembly:attached-->
</goals>
</execution>
</executions>
</plugin>
#构建Web项目
- 利用 mvn archetype:generate 命令构建web项目时,选择的原型的artifactId为maven-archetype-webapp
- 配置maven编译器的版本
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
项目的打包文件类型为war,打包后文件的名称为 $ {artifactId}-$ {version}.war 如果设置了finalName元素的话,打包后的文件名称为 $ {finalName}.war
- 在src/main/java目录下编写项目源代码
- 配置web.xml文件,添加servlet等参数
- 在POM文件中添加servlet-api支持
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
因为scop为provided,所以不会将servlet-api打包到war文件中
#Maven多模块项目 ##父模块POM配置 最上层的父模块的配置文件与普通POM.xml基本相同,除了两个地方
- 打包类型为pom
- modules中填写直属的子模块artifactId
<packaging>pom</packaging>
<modules>
<module>simple-parent</module>
</modules>
##子模块配置 在子模块的最开始添加父模块信息,子模块同时也可以是其他模块的父模块。
<parent>
<groupId>org.sonatype.mavenbook.multi</groupId>
<artifactId>parent</artifactId>
<version>0.8-SNAPSHOT</version>
</parent>
如果某一个子模块对其他模块有依赖关系,需要在POM的dependency中添加依赖信息
<dependency>
<groupId>org.sonatype.mavenbook.multispring</groupId>
<artifactId>simple-weather</artifactId>
<version>0.8-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.sonatype.mavenbook.multispring</groupId>
<artifactId>simple-persist</artifactId>
<version>0.8-SNAPSHOT</version>
</dependency>
当maven对含有子模块的项目进行打包等操作时,它会先载入父模块的POM文件,然后找到所有子模块的POM文件。maven会把这些POM文件加载到Reactor中,分析各个模块的信赖关系,Reactor会保证各个相互依赖模块按照顺序被编译、安装。
#POM优化 多个模块组成的项目,各模块之间的第三方包依赖情况,各模块版本信息都有可能重复设置,这些分散的设置有可能导致项目潜在的不稳定风险,所以需要多项目POM进行优化。 ##依赖优化 如果第三包在多个子模块中有依赖的情况,那么应该将依赖信息提取到父POM中,在子模块的POM文件中只保留groupId和artifactId两项。 在对于其他模块的依赖中,使用内建的项目groupId和version信息,以确保项目个子模块的groupId和版本信息能够保持同步。
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>simple-weather</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>simple-persist</artifactId>
<version>${project.version}</version>
</dependency>
##插件配置优化 如果多个子模块中存在相同的插件配置,可以把配置信息提取到父POM文件的pluginManaement中。