Maven使用详解

创建maven project和maven module

  • 创建maven project:
  1. Eclipse->New Maven project
  2. 在弹出界面中不要选择“Create a simple project”(这样就可以使用archetype来创建项目)
  3. 使用默认的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,增加了类似下面的信息:

  <modules>
      <module>child01</module>
  </modules>

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如下:

<dependency> 
  <groupId>com.projectC</groupId> 
  <artifactId>projectC</artifactId> 
  <version>0.0.1-SNAPSHOT</version>
  <optional>true</optional> 
</dependency>

当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:

  <dependency>
      <groupId>com.projectB</groupId>
      <artifactId>project-B</artifactId>
      <version>1.0.0</version>
      <exclusions>
            <exclusion>
             <groupId>com.projectC</groupId>
              <artifactId>project-C</artifactId>
            </exclusion>
      </exclusions>
  </dependency>
  • <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:

        <!-- 集中定义依赖版本号 -->
	<properties>
		<joda-time.version>2.5</joda-time.version>
		<solrj.version>4.10.3</solrj.version>
	</properties>

	<!-- 只定义依赖的版本,并不实际依赖 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>joda-time</groupId>
				<artifactId>joda-time</artifactId>
				<version>${joda-time.version}</version>
			</dependency>
        </dependencyManagement>
		

子项目B的pom.xml:

<dependency>
         <groupId>joda-time</groupId>
	 <artifactId>joda-time</artifactId>
         <--!从父项目继承version,不用再声明version-->
</dependency>

 

遇到的问题:

pom.xml报错:Missing artifact joda-time:joda-time:jar:4.12

其实原因很简单,就是joda-time.jar这个jar包版本没到4.12,最高版本也就2.几,所以无法正常下载,version改成2.5即可正常下载

Maven在eclipse下安装配置:https://blog.csdn.net/wcc27857285/article/details/81812304

原文地址:https://www.cnblogs.com/kevinWu7/p/10163472.html