当前位置: 首页 > news >正文

Maven--多模块依赖实例解析(五)

《Maven--搭建开发环境(一)》

《Maven--构建企业级仓库(二)》

《Maven—几个需要补充的问题(三)》

《Maven—生命周期和插件(四)》

《Maven--多模块依赖实例解析(五)》

这是最后一篇,做一个多模块依赖的正式例子,简单的讲一下单元测试、覆盖率以及发布和站点的部署。只想讲讲和Maven 相关的东西,因此,注重看 pom 文件,里面具体的代码就不实现了,下面是我项目骨架:


首先创建一个MavenProject,命名为demo-parent,此为父模块,重要的是如下两步:


所选的的模板是quickstart


pom文件中的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

	 <groupId>com.tgb.demo</groupId>
	 <artifactId>demo-parent</artifactId>
	 <version>0.0.1-SNAPSHOT</version>
	 <packaging>pom</packaging>
	
	 <name>demo-parent</name>
	 <url>http://maven.apache.org</url>

	 <properties>
	   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	   <springframework.version>3.1.1.RELEASE</springframework.version>
	 </properties>

	 <modules>
	 	<module>demo-core</module>
	 	<module>demo-persistent</module>
	 	<module>demo-service</module>
	   <module>demo-web</module>
	 </modules>
  
	<dependencyManagement>
	 	<dependencies>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context-support</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
			    <groupId>junit</groupId>
			    <artifactid>junit</artifactId>
			    <version>4.8.2</version>
			    <scope>test</scope>
			 </dependency>
		</dependencies>
	 </dependencyManagement>
  
	<build>
		<pluginManagement>
			<plugins>
				<plugin>
			        <groupId>org.apache.maven.plugins</groupId>
			        <artifactId>maven-compiler-plugin</artifactId>
			        <version>2.3.2</version>
			        <configuration>
			          <source>1.5</source>
			          <target>1.5</target>
			          <encoding>UTF-8</encoding>
			        </configuration>
				</plugin>
				
				<plugin>  
			       <groupId>org.apache.maven.plugins</groupId>  
			       <artifactId>maven-resources-plugin</artifactId>  
			       <configuration>  
			              <encoding>UTF-8</encoding>  
			       </configuration>  
				</plugin>

			</plugins>
		</pluginManagement>
	</build>
</project>

后面我们会一一讲解上面这个pom文件,接下来,继续创建MavenProject或者MavenModuleModule在创建时需要选择父模块,而Project创建完成之后需要在pom中添加依赖的父模块,没什么区别,将此模块命名为demo-core,之后依次创建demo-persistentdemo-servicedemo-web,值得注意的是,创建demo-web时选择的模板必须是webappdemo-webpom配置如下,其余的都和demo-web差不多,读者可仿照配置:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.tgb.demo</groupId>
    <artifactId>demo-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>com.tgb.demo</groupId>
  <artifactId>demo-web</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>demo-web Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <dependencies>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>student-service</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>
	</dependencies>
	<build>
		<finalName>demo-web</finalName>
		<plugins>
			<plugin>
				<groupId>org.mortbay.jetty</groupId>
				<!-- 使用的是jetty-maven-plugin的插件 -->
				<artifactId>jetty-maven-plugin</artifactId>
				<configuration>
					<scanIntervalSeconds>2000</scanIntervalSeconds>
					<webApp>
					<!-- 上下文路径 -->
						<contextPath>/stu</contextPath>
					</webApp>
					<connectors>
						<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
						<!-- 端口号 -->
							<port>8787</port>
							<maxIdleTime>500000</maxIdleTime>
						</connector>
					</connectors>
				</configuration>
			</plugin>
			<!-- 
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>tomcat-maven-plugin</artifactId>
				<version>1.1</version>
				<configuration>
				    
					<port>8080</port>
					<contextFile>src/main/resources/context.xml</contextFile>
					
				</configuration>
			</plugin> -->
		</plugins>
	</build>
</project>

OK,几个模板创建完成后,我想你的模块有可能在报错,那么接下来需要设置编译、发布等等,我废话不多说,右击你的模块,然后打开Properties窗口,按照下面的图依次设置:

选择javabuild path


再到javacompiler,把编译jdk给改了:


现在来设置WTP



以后设置wtp编译目录:



到此为止我们的大概环境算是配置完成了,那么接下来就需要分析很重要的pom文件了,一些基础的东西我不会讲,大家可上网查,先来分析demo-parentpom文件,在demo-parentpom值得注意的有以下几点:

1.<packaging>pom</packaging>,必须改成pom,不是jar,也不是war,因为他是parent,大家可以想想接口的作用;

2.<modules></modules>必须要配上你所有相关的模块,当eclipse导入项目时,就是根据这个标签把相关的模块一起导入进来的;

3.消除重复,在<properties></properties>中,配置了<springframework.version>3.1.1.RELEASE</springframework.version>,下面依赖配置中就可以直接引用此配置了,如果将来改变版本,既改此一处;

4.消除多模块依赖配置重复,我们知道依赖是可以继承的,既父模块中定义的依赖,子模块可自动继承,但是有些子模块需要,有些不需要的情况下该怎么办呢?那就必须用<dependencyManagement>标签了,子模块的pom中就可以<dependency><groupId>junit</groupId><artifactid>junit</artifactId> </dependency>,这样引用,没有引用的就不会自动继承;

5.消除多模块插件配置重复,与dependencyManagement类似的,我们也可以使用pluginManagement元素管理插件。一个常见的用法就是我们希望项目所有模块的使用MavenCompiler Plugin的时候,都使用Java 1.6,以及指定Java源文件编码为UTF-8,如父模块的POM中的配置;这段配置会被应用到所有子模块的maven-compiler-plugin中,由于Maven内置了maven-compiler-plugin与生命周期的绑定,因此子模块就不再需要任何maven-compiler-plugin的配置了。与依赖配置不同的是,通常所有项目对于任意一个依赖的配置都应该是统一的,但插件却不是这样,例如你可以希望模块A运行所有单元测试,模块B要跳过一些测试,这时就需要配置maven-surefire-plugin来实现,那样两个模块的插件配置就不一致了。这也就是说,简单的把插件配置提取到父POMpluginManagement中往往不适合所有情况,那我们在使用的时候就需要注意了,只有那些普适的插件配置才应该使用pluginManagement提取到父POM中。

完成了环境的配置,下面就是单元测试、覆盖率报告和站点的发布了,其实这些都是对插件的应用,单元测试可以用maven-surefire-plugin,覆盖率Maven自带了一个插件,叫做cobertura,可以执行目标cobertura:coberturaweb的发布,有jettytomcat插件,具体用法我已经在上面给出来了,站点的发布有maven-project-info-reports-plugin插件,使用mvnsite可以完成站点的生成,具体用法如下


还有很多插件,三天三夜都说不完,掌握再多也是徒劳,极为重要的是,自己需要什么随时去查,会查,然后能迅速掌握插件的用法,关于Maven到此结束了,这篇写的很粗糙,大家有问题随时留言或邮件。

相关文章:

  • Python解决codeforces ---- 1
  • HDU 2493 Timer 数学(二分+积分)
  • linux printk函数学习
  • HDU 3262 Seat taking up is tough (模拟搜索)
  • 2014各大网络公司校招笔试算法题(收集并更新中)
  • erlang mnesia 数据库查询
  • HDU 3264 Open-air shopping malls (计算几何-圆相交面积)
  • 2014Microsoft 校招笔试真题(找工作的虾米们赶紧做题晒答案喽)
  • 黑马程序员_IO流基本操作(Writer,Reader)
  • aptana 插件离线下载方式
  • Eclipse安装aptana 插件的方法
  • VC写的双人版俄罗斯方块
  • 2014百度校招笔试题之动态链接库静态链接库详解
  • centos 安装与操作
  • win7 防火墙开启ping
  • SegmentFault for Android 3.0 发布
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • docker python 配置
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • learning koa2.x
  • PV统计优化设计
  • QQ浏览器x5内核的兼容性问题
  • React16时代,该用什么姿势写 React ?
  • Sass 快速入门教程
  • vue自定义指令实现v-tap插件
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于HAProxy的高性能缓存服务器nuster
  • 理清楚Vue的结构
  • 马上搞懂 GeoJSON
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 在weex里面使用chart图表
  • kubernetes资源对象--ingress
  • 湖北分布式智能数据采集方法有哪些?
  • 通过调用文摘列表API获取文摘
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • "无招胜有招"nbsp;史上最全的互…
  • #数学建模# 线性规划问题的Matlab求解
  • (06)金属布线——为半导体注入生命的连接
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (6)STL算法之转换
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (八)c52学习之旅-中断实验
  • (转)setTimeout 和 setInterval 的区别
  • (转)母版页和相对路径
  • .NET Reactor简单使用教程
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET导入Excel数据
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @Autowired和@Resource的区别
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @KafkaListener注解详解(一)| 常用参数详解
  • @SentinelResource详解
  • @Transactional 竟也能解决分布式事务?
  • [Android]通过PhoneLookup读取所有电话号码