目录
Maven小记
命令
- Clean 清理编译的文件 将
target
目录清除 - Compile 编译主目录的文件
- Test 编译并运行
src/test/java
目录的代码 - Package 进行打包
jar
orwar
orpom
- install 将项目发布到本地仓库
- Tomcat:run 一键启动
生命周期
- Clean生命周期
Clean
- Default生命周期
Compile test package install deploy
- Site生命周期
Site
不同的生命周期的命令可以同时执行 如: mvn clean package 并且运行某个生命周期阶段 会运行它及之前所有的前期阶段
依赖范围
- Compile struts2-core
编译(compile)时需要 测试时需要,运行时需要,打包时需要
- Provided jsp-api.jar servlet-api.jar
编译(compile)时需要,测试(test)时也需要 ,运行时不需要,打包时不需要
- Runtime 数据库驱动包
编译时不需要,测试时需要,运行时需要,打包时需要
- Test junit.jar
编译时不需要,测试时需要,运行时不需要,打包也不需要
依赖版本冲突解决
第一声明优先原则
用的是spring-bean-4.2.4
<dependencies>
<!-- spring-beans-4.2.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- spring-beans-3.0.5 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
</dependency>
路径近者优先
自己添加jar包
排除原则
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
版本锁定原则
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<struts.version>2.3.24</struts.version>
</properties>
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
分模块开发(父子工程)
- 父工程的
pom
中的package
必须是pom
- 父工程通常通过定义
dependencyManagement
来控制子模块的依赖的版本号统一 - 父工程可在
dependency
中定义各子模块都可能用到的依赖,这些依赖会自动被子模块继承,也即子模块可省略在其pom
中对这些依赖的引入 - 各子模块虽然继承同一父工程,但彼此之间没有任何直接关联关系,如果模块A需要用到模块B的功能,则需现将模块B
mvn install
到本地仓库,然后在模块A的pom
中引入模块B的坐标
对于任何maven工程,无论是父工程还是子模块,要想其编译成功,其所有依赖必须要能在本地仓库或远程仓库中找得到
创建子模块的方法:右键父工程,选择new module
。子模块可以在父工程的目录下,也可以和父工程同一目录,这没有任何影响。是否是父子工程需要看父工程pom
中的module
定义和子模块pom
中的parent
定义,子模块的parent
中写父工程的groupId、artifactId、version
,自己的groupId
和version
都将继承父工程的,只需自定义artifactId
dependencyManager
用来统一管理版本号,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement
元素的项目,然后它就会使用在这个dependencyManagement
元素中指定的版本号
问题
- MojoFailureException
遇见这个是执行命令时遇到了的错误是由插件生成的。一般来说,插件使用这个错误来表示构建失败,因为项目的依赖项或源代码有问题,例如编译
或测试失败
根据具体执行的结果报告去解决错误
- NoGoalSpecified Exception
Maven不知道做什么 你可以调用生命周期 或者调用一个插件 亦或者无版本的插件坐标 总之要至少指定一个阶段以让Maven继续运行
<project>
...
<build>
<defaultGoal>install</defaultGoal>
...
</build>
...
</project>
Link:https://cwiki.apache.org/confluence/display/MAVEN/NoGoalSpecifiedException