目录

Maven小记

命令

  • Clean 清理编译的文件 将target目录清除
  • Compile 编译主目录的文件
  • Test 编译并运行src/test/java目录的代码
  • Package 进行打包 jar or war or pom
  • install 将项目发布到本地仓库
  • Tomcat:run 一键启动

生命周期

  1. Clean生命周期

Clean

  1. Default生命周期

Compile test package install deploy

  1. 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>

分模块开发(父子工程)

  1. 父工程的pom中的package必须是pom
  2. 父工程通常通过定义dependencyManagement来控制子模块的依赖的版本号统一
  3. 父工程可在dependency中定义各子模块都可能用到的依赖,这些依赖会自动被子模块继承,也即子模块可省略在其pom中对这些依赖的引入
  4. 各子模块虽然继承同一父工程,但彼此之间没有任何直接关联关系,如果模块A需要用到模块B的功能,则需现将模块Bmvn install到本地仓库,然后在模块A的pom中引入模块B的坐标

对于任何maven工程,无论是父工程还是子模块,要想其编译成功,其所有依赖必须要能在本地仓库或远程仓库中找得到

创建子模块的方法:右键父工程,选择new module。子模块可以在父工程的目录下,也可以和父工程同一目录,这没有任何影响。是否是父子工程需要看父工程pom中的module定义和子模块pom中的parent定义,子模块的parent中写父工程的groupId、artifactId、version,自己的groupIdversion都将继承父工程的,只需自定义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