• 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

  • 相关阅读:
    Linux下使用rm删除文件,并排除指定文件
    使用use index优化sql查询
    PHP面试中经常出现的composer 问题总结
    MySQL全局锁库锁表
    《MySQL必懂系列》全局锁、表级锁、行锁
    Redis面试题(2020最新版)
    What is stabs?
    链接与加载
    MachO之Segment初探
    为什么要在预编译头中加__OBJC__?
  • 原文地址:https://www.cnblogs.com/kevinWu7/p/10163472.html
Copyright © 2020-2023  润新知