创建maven project和maven module
- 创建maven project:
- Eclipse->New Maven project
- 在弹出界面中不要选择“Create a simple project”(这样就可以使用archetype来创建项目)
- 使用默认的Archetype (quickstart)
点击完成Finsh创建完毕
此时会有一大堆东西:
进入文件目录把src文件夹删除掉,parent project不需要代码,只是用来管理统一jar包依赖的一个项目
删完之后变成这样,有用的就是pom.xml
修改pom.xml:
<packaging>pom</packaging> 中的jar 改成pom
pom是一个聚合工程,既父工程,可以理解成pom工程师用于管理其余子工程的jar包的工程,并且在实际编译发布打包中都有很大的方便
改完后可能会报错,选择项目右键maven->update project即可
- 创建maven module project
1.选中刚建的父项目,在弹出菜单中点击 New -> Maven Module
;
2.点击next ,默认选中的是quickstart,什么都不要修改直接继续next
3.点击Finsh即创建完毕
这样一个子项目就创建完成了,在文件系统中,子项目会建在父项目的目录中。在父目录中运行mvn test
等命令,所有的子项目都会按顺序执行。
细心一点的人,可能会发现,通过这个步骤创建子项目的同时,会修改父项目的pom.xml
,增加了类似下面的信息:
child01
4.接下来就是优化配置了:
打开子项目的pom.xml可以删除groupid和versionid
甚至Eclipse都在groupid和versionid上给出了黄色警告
鼠标移上去发现提示:Version is duplicate of parent version(版本号已经在父项目中定义过了)
所以子项目的groupid和versionid都可以删掉,下方的url 和properties父项目中也有一模一样的,也可删除
子项目的pom还可以继续优化,<dependencyManagement> 标签 可以进一步优化子pom中的内容,在文章后面的各类标签中有详解
总之,parent 和module 如果是父子关系的话,就是继承关系,可以极大的优化项目结构和pom的内容
groupid和artifactId如何填写
groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找。
groupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactId是tomcat。 比如我创建一个项目,我一般会将groupId设置为cn.kevin,cn表示域为中国,kevin是我个人喜欢的代号,artifactId设置为testPro,表示你这个项目的名称是testPro,依照这个设置,你的包结构最好是cn.snowin.testPro打头的,如果有个UserDao,它的全路径就是cn.kevin.testPro.dao.UserDao
各类标签:
-
<optional>可选依赖
举例:projectA 依赖projectB, projectB 依赖projectC时
projectB的pom.xml如下:
com.projectC projectC 0.0.1-SNAPSHOT true
当projectB的optional=true时, projectA中如果没有显式的引入projectC, 则projectA不依赖projectC, 即projectA可以自己选择是否依赖projectC,默认<optional>的值为false, 既子项目必须依赖
简单来说就是,ProjectB配置了optiona=true,就意味着ProjectB的子项目不能依赖ProjectA,要依赖只能手动依赖
-
<exclusion>排除依赖
传递性依赖会给项目隐式地引入很多依赖,这极大简化了项目依赖的管理,但是有些时候这种特性也会带来问题。
例如,项目A依赖B,而这个B依赖了C,那么这个C就会成为A的传递性依赖,而C由于是不稳定版本SNAPSHOT,会直接影响到当前的项目A。这时就需要排除掉A对C的依赖。这就是排除依赖。
A的pom.xml:
com.projectB project-B 1.0.0 com.projectC project-C
-
<dependencyManagement> 统一管理依赖
dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器
举例:B继承自A,A中集中管理Jar版本,B中就无需再声明version,直接从A中继承。如果有C,D继承A,也无需声明version。若需要升级某个Jar版本,也只需要在A中修改一次即可,无需B,C,D一个个项目改过来。
若子项目中某个jar声明了version,这个jar就不会从dependencyManagement中继承,而是按照声明的来,也很灵活
父项目A 的pom.xml:
2.5 4.10.3 joda-time joda-time ${joda-time.version}
子项目B的pom.xml:
joda-time joda-time <--!从父项目继承version,不用再声明version-->
遇到的问题:
pom.xml报错:Missing artifact joda-time:joda-time:jar:4.12
其实原因很简单,就是joda-time.jar这个jar包版本没到4.12,最高版本也就2.几,所以无法正常下载,version改成2.5即可正常下载
Maven在eclipse下安装配置: