一、MAVEN整合Eclipse

  MAVEN是非常优秀,但是总是要开命令行敲命令是比较不爽的,我们已经习惯了使用IDE,所以还有一种将MAVEN整合到Eclipse的方法。

  详情查看:http://www.eclipse.org/m2e/http://download.eclipse.org/technology/m2e/releases

  其中,后者也是该插件的更新地址;安装完成之后要重启Eclipse,然后对几项MAVEN的插件进行设置:

  首先需要修改maven仓库的位置,因为默认是保存到C盘的:

  1. <localRepository>D://maven_repository</localRepository>

  找到window->preferences->Maven,需要修改两处地方:

  详情查看http://blog.sina.com.cn/s/blog_924d6a570102w2kf.html  

  安装并配置完成之后,将之前的两个项目(Hello,HelloFriend)导入到Eclipse中:

  

二、依赖管理

  依赖管理是MAVEN最核心的功能,也是MAVEN最出彩的地方。POM中关系包括下面几部分:依赖(包括传播性依赖)、继承和聚合。MAVEN中有一个传统,那就是即使是最简单的项目可能也会有非常复杂的依赖关系管理。MAVEN通过MAVEN库解决了jar包的错误依赖问题和jar包冲突的问题。

  在MAVEN中,我们只需要在pom.xml配置文件中声明需要依赖的jar包即可,如果本地MAVEN库中有该jar包,则会被直接引用;如果没有该jar包,那么就会自动到互联网上的MAVEN中央仓库下载;MAVEN刚刚安装完成之后,运行mvn compile命令,会出现很多下载的提示也是因为这个原因。

  1.排除依赖

  MAVEN使用传播性依赖,这样会导致冲突等问题的发生,所以可以在dependencies标签下使用<exclusions>标签来排除掉需要排除的依赖,可以使用通配符全部排除。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.maven</groupId>
  4. <artifactId>maven-embedder</artifactId>
  5. <version>2.0</version>
  6. <exclusions>
  7. <exclusion>
  8. <groupId>org.apache.maven</groupId>
  9. <artifactId>maven-core</artifactId>
  10. </exclusion>
  11. </exclusions>
  12. </dependency>
  13. ...
  14. </dependencies>
  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.maven</groupId>
  4. <artifactId>maven-embedder</artifactId>
  5. <version>3.1.0</version>
  6. <exclusions>
  7. <exclusion>
  8. <groupId>*</groupId>
  9. <artifactId>*</artifactId>
  10. </exclusion>
  11. </exclusions>
  12. </dependency>
  13. ...
  14. </dependencies>

  2.继承

  继承是MAVEN的一大亮点,使用它能够很方便的实现项目的升级等功能。Ant也有继承的概念,但是MAVEN在这里将概念进行了升华,MAVEN中的继承是基于项目的继承。

  (1)创建父工程

  首先在Eclipse中创建一个新的MAVEN项目,名为HelloParent,它的作用是作为父工程给Hello工程和HelloFriend工程提供依赖;创建成功之后,只是修改pom.xm配置文件:

  1. <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">
  2. <modelVersion>4.0.0</modelVersion>
  3. 3 <groupId>com.kdyzm.hello</groupId>
  4. <artifactId>HelloParent</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. 6 <packaging>pom</packaging>
  7. <description>The parent of Hello project and HelloFriend project</description>
  8. <dependencies>
  9. <dependency>
  10. <groupId>junit</groupId>
  11. <artifactId>junit</artifactId>
  12. <version>4.9</version>
  13. <scope>compile</scope>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.kdyzm.hello</groupId>
  17. <artifactId>Hello</artifactId>
  18. <version>0.0.1-SNAPSHOT</version>
  19. <scope></scope>
  20. </dependency>
  21. </dependencies>
  22. </project>

  这里需要注意的是第三行和第六行的代码,第三行将groupId设置为com.kdyzm.hello,该groupId和Hello项目以及HelloFriend项目中设置的groupId是相同的,这样安装之后(mvn install)在Maven仓库中找到的一定是三个并列的文件夹;第六行的packaging标签中的值是pom,该值默认是jar类型,但是作为父工程,必须将该值设置为pom,这是maven的硬性规定。

  然后一定要记得执行mvn install,将该项目安装到Maven仓库,否则其它项目是没有办法获得该父工程的依赖的。

  (2)修改HelloFriend工程

  修改pom.xml配置文件,这时候由于需要继承HelloParent,而且version和groupId和父工程中的是相同的,所以可以将这两项声明去掉,否则的话就需要重新定义不能和父工程总的定义重复,否则会警告声明无效。

  

  另外,使用parent标签声明父类,需要具体到哪一个版本;注意relativePath标签,该标签声明了父工程中pom.xml配置文件的位置,为什么是../HelloParent,原因在其groupId和artifactId的声明上,注意使用这两个标签的值确定relativePath的值。

  只要保存好pom.xml配置文件,相应的maven依赖就会自动添加到classpath,如下图所示:

  

  然后右键项目run As即可:

  

  3.部分依赖

  如果是用 2中的方式直接全部继承,实际上会出问题,如果父工程中定义了非常多的依赖,那么全部继承首先一定有大量的依赖用不着,而且如果是本工程继承了父工程,而且同时父工程又引用了本工程的依赖,那么这样不仅仅是用不着的问题了,而是不合逻辑了。

  MAVEN使用依赖管理器对依赖进行管理,比如Hello/pom.xml配置文件,如果直接继承了父工程,那就变成了自己引用自己,显得非常的滑稽

  (1)首先需要配置父工程

    添加依赖管理器后,默认子工程不会继承父工程中的任何依赖;依赖管理器的标签是<dependencyManagement>

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.kdyzm.hello</groupId>
  5. <artifactId>HelloParent</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>pom</packaging>
  8. <description>The parent of Hello project and HelloFriend project</description>
  9. <properties>
  10. <argLine>-Dfile.encoding=UTF-8</argLine>
  11. </properties>
  12. 12 <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.9</version>
  18. <scope>compile</scope>
  19. </dependency>
  20. <dependency>
  21. <groupId>com.kdyzm.hello</groupId>
  22. <artifactId>Hello</artifactId>
  23. <version>0.0.1-SNAPSHOT</version>
  24. <scope>compile</scope>
  25. </dependency>
  26. </dependencies>
  27. 27 </dependencyManagement>
  28. <modules>
  29. <module>../Hello</module>
  30. <module>../HelloFriend</module>
  31. </modules>
  32. </project>

  (2)配置子项目声明对父工程中依赖的引用

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <artifactId>Hello</artifactId>
  5. <name>Hello</name>
  6. <parent>
  7. <artifactId>HelloParent</artifactId>
  8. <groupId>com.kdyzm.hello</groupId>
  9. <version>0.0.1-SNAPSHOT</version>
  10. <relativePath>../HelloParent</relativePath>
  11. </parent>
  12. <!-- 依赖管理器 -->
  13.   <dependencies>
  14.     <dependency>
  15.       <groupId>junit</groupId>
  16.       <artifactId>junit</artifactId>
  17.     </dependency>
  18.   </dependencies>
  19. </project>

  注意上面重点强调的部分,在dependency标签中MAVEN坐标三元素本应该一个都不能少,但是这里只是写了两个,而且scope标签也没有写,这些都需要继承父类的。

  疑问:搞了半天,好不容易不用写依赖的配置代码了,最后又得手写配置代码,这么做的话要父工程还有什么意义?

    正如上面所说的,使用父工程继承之后,可以不用写scope标签和version标签了,scope标签可以视情况而定决定是否覆盖父工程中的配置,但是Version标签就不能写了,一定要继承父工程中的才行,这么做的好处就是能够快速实现项目升级,比如项目经理说要将Junit升级到5.0(当然还没有这个版本?),如果每个成员都配置了version标签,那么全部的人都得手动修改配置文件;但是如果使用继承了的话,根本就不需要修改配置文件,项目经理直接将父工程中的配置文件修改一下就行了,每个小组成员什么配置都不需要修改jar包就已经升级了。

  4.聚合

  一个项目很有可能会有多个子项目,如果对子项目一个一个的进行测试就有违maven高度自动化的设计原则,最理想的情况就是能够在一个pom.xm配置文件中进行所有字模块工程的测试,当然这个pom.xml配置文件一定是父工程的配置文件了。

  使用<modules>标签实现该功能:

  1. <modules>
  2.   <module>../Hello</module>
  3.   <module>../HelloFriend</module>
  4. </modules>

  这里使用相对路径找到两个子项目;这样直接对着父项目右键测试,那么所有的子项目都会自动进行测试并报告结果:

  

  

三、私服

  搭建私服非常麻烦,暂时存档

四、项目练习地址

https://github.com/kdyzm/MavenDemo

【Java EE 学习 82 下】【MAVEN整合Eclipse】【MAVEN的一些高级概念】的更多相关文章

  1. Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理

    转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Jav ...

  2. Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理

    转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava E ...

  3. Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库

    参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 ...

  4. Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring

    参考:https://my.oschina.net/gaussik/blog/513353 注:此文承接上一文:Java EE 学习(5):IDEA + maven + spring 搭建 web(1 ...

  5. Java EE 学习(5):IDEA + maven + spring 搭建 web(1)

    参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html http://www.ctolib.com/docs-IntelliJ-IDEA-c--1590 ...

  6. Java EE 学习(4):IDEA + maven 搭建 web(2)

    参考:http://www.bubuko.com/infodetail-1855067.html 现使用 Maven 创建项目:本节接Java EE 学习(3):IDEA + maven 搭建 web ...

  7. 【Java EE 学习 82 上】【MAVEN基本安装和使用方法】

    一.Maven概述 1.什么是Maven? Maven中文意思是"行家"."专家",它是一种跨平台的项目管理工具. 2.Maven有什么作用? Maven能够实 ...

  8. 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】

    一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...

  9. 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】

    一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...

随机推荐

  1. MongoDB笔记

    mongodb简介 MongoDB 是一个基于分布式文件存储的数据库.存储的是Bson结构的文档(二进制的JSON),内部执行引擎为JS解释器,把文档存储为BSON结构,在查询时,转换为JS对象,可以 ...

  2. Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务

    前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然使用上一季的的项目背景(系列地址http://www.cnblogs.com/fzrain/p/34 ...

  3. RabbitMQ学习系列(二): RabbitMQ安装与配置

    上一篇,简单介绍了RabbitMQ的情况还有一些相关的概念,这一篇,会讲讲 RabbitMQ安装与配置. 1.安装 Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装RabbitM ...

  4. coreseek+sphinx+mysql+thinkphp整合

    1.安装coreseek 1.1首先升级或安装系统依赖库 yum install make gcc g++ automake libtool mysql-client libmysqlclient15 ...

  5. 1. web前端开发分享-css,js入门篇

    关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...

  6. Java 时间的表示

    //不建议的方式 out.println("<p>结束Servlet的时间:" + new Date().toLocaleString() + "</p ...

  7. CH模拟赛 皇后游戏

    /* 做的时候手推了一下n=2的四种情况,再排一下序就可以了,证明不是很严谨,但我想这就行了,毕竟全是套路 */ #include<iostream> #include<cstdio ...

  8. Sql Cursor example

    USE [EUC]GO/****** Object:  StoredProcedure [dbo].[SP_SME_QueryAuditLog]    Script Date: 02/05/2015 ...

  9. WPF这样的界面应该如何编写呢?

    如上图: 外围是一个Border,内部填充一个Grid,Grid分成两行,第一行有一个按钮可以进行操作(主要是操作ListBox的数据源:增加和删除对象),第二行填充一个ListBox,绑定数据源并根 ...

  10. the operation was attempted on an empty geometry Arcgis Project异常

    处理gis数据,投影变换时出现异常: the operation was attempted on an empty geometry 解决思路: arcgis的repair geometry方法:删 ...