生命周期/插件/目标
生命周期就是各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行。
Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。
Maven 有三套相互独立的生命周期,分别是:
①Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 ②Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
③Site Lifecycle 生成项目报告,站点,发布站点。
它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。当然你也可以 直接运行 mvn clean install site 运行所有这三套生命周期。
每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比 如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。
Clean 生命周期一共包含了三个阶段:
①pre-clean 执行一些需要在 clean 之前完成的工作
②clean 移除所有上一次构建生成的文件
③post-clean 执行一些需要在 clean 之后立刻完成的工作
Site 生命周期
①pre-site 执行一些需要在生成站点文档之前完成的工作
②site 生成项目的站点文档
③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
④site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这可是 Maven 相当强大 的功能,Manager 比较喜欢,文档及统计数据自动生成,很好看。
Default 生命周期
Default 生命周期是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里, 只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
Maven核心程序为了更好的实现自动化构建,按照这一的特点执行生命周期中的各个阶段:不论现在要执行生命周期中的哪一个阶段,都是从这个生命周期最初的位置开始执行。
插件和目标
[1]生命周期的各个阶段仅仅定义了要执行的任务是什么。
[2]各个阶段和插件的目标是对应的。
[3]相似的目标由特定的插件来完成。
[4]可以将目标看作“调用插件功能的命令"
在eclipse中使用Maven
首先一般不是太低级的eclipse都会内置Maven插件
但是内置的Maven插件需要设置一些参数,
- installations:这是指定Maven核心程序的位置,不建议使用插件自带的Maven程序,而是使用我们自己在电脑安装的
- user settings:指定conf/settings.xml的位置,进而获取本地仓库的位置
设置通过Maven创建的工程的JDK版本
[1]打开settings.xml文件
[2]找到profiles标签
[3]加入如下配置
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>
创建Java工程
一般将Create a simple project(skip archetype selection)勾选上,这个选项主要是创建约定的目录结构使用的插件是什么,如果没有勾选接下来就是叫你选择插件
创建web工程
前面还是和创建java工程一样,但是这里选择的打包的方式不一样,就是将jar改成war
其实生成的工程目录和Java工程的差不多,就是src/main下面多了个webapp,但是实际上我们创建web工程有WEB-INF等目录的
所以我们得这样设置,首先在项目中的properties中找到project Facets,在其中就有Dynamic Web Moudule,本来应该是勾选上的,先取消勾选,apply,然后再勾选上,出现这个配置,点击
改成
apply后就生成META-INF和WEB-INF等web目录
如果你再webapp里面新建jsp页面,你会发现报错The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
这就是首先项目中没有servlet-api的jar包,对于Maven来说也没有依赖,所以我们得在Maven中加入依赖
现在我们 加入三个不同范围的依赖,servlet-api的依赖可以让报错信息没有
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
在tomcat运行后,回发现生成的部署文件中只有log4j的jar包,其他的都没有生成,证明了只有complie范围依赖回进行部署
解决jar包冲突的问题
比如现在需要在jsp里面写el表达式,所以需要加入相关的依赖信息
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1.3-b06</version>
<scope>provided</scope>
</dependency>
如果将上面的以来信息改成compile依赖,这时就会出现依赖冲突的问题,就是项目本身就有jsp-api的jar包,这时候Tomcat的servlet容器又会提供相对应的jsp-api,不知道使用哪一个而出现NullpointException之类的异常
继承
现在的情景是:
Hello依赖的junit:4.0
HelloFriend依赖的junit:4.0
MakeFriends依赖的junit:4.9
由于test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致。
②需求:统一管理各个模块工程中对junit依赖的版本
③解决思路:将junit依赖统一提取到“父”工程中,在子工程中声明junit依赖时不指定版本,以父工程中统一设定的为准。同时也便于修改。
④操作步骤
-
创建一个Maven工程作为父工程。注意:打包的方式pom
-
在子工程中声明对父工程的引用
<parent>
<groupId>jane</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 指定从当前子工程的pom.xml文件出发,查找父工程的pom.xml的路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
-
将子工程的坐标中与父工程坐标中重复的内容删除
-
在父工程中统一junit的依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 在子工程中删除junit依赖的版本号部分
聚合
作用:就是类似于一键安装各个模块工程
配置方式:在一个"总的聚合工程"中配置各个参与聚合的模块
//配置聚合
<modules>
//指定各个子工程的相对路径
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
使用就直接再聚合工程的pom.xml上进行maven install就行了
推荐的Maven网站
http://mvnrepository.com/