Maven入门详情

Maven的作用

  1. 在支付被,为了保证编译通过,我们见面处处去寻觅jar包,当编译通过了,运行的早晚,却发现”ClassNotFoundException”,我们想到的是,难道还差jar包?
  2. 每个Java项目之目结构还未曾一个集合的正统,配置文件到处都是,单元测试代码到底应该在那里吗没一个高贵的专业。
  3. 为此,我们且使Maven(使用Ant也得,不过编写Ant的xml脚论比较费心)—-一个型管理工具
  4. Maven主要做了少码事:

  5. 统一开支规范及工具

  6. 集合保管jar包

下我们来对待一下,首先建立一个便的Java工程,是如此的:

图片 1

 这个我们还十分熟悉,src下修包写代码,那么配置文件在何?单元测试代码放在哪里?没有一个统一标准,更多时光都是开发者的自由发挥,每个人有温馨的品格,这并无要命相符团队协作。接下来,看一下运maven构建一个屡见不鲜Java项目下的目结构:

图片 2

瞧下Maven构建的平凡Java项目,对源代码、单元测试代码、资源乃至后续要之文书都起特别的目录规划。

点的末尾有一个pom.xml,这是Maven的着力配置文件,pom称为Project Object
Model(类型对象模型),它用来描述整个Maven项目,所以啊号称Maven描述文件。

本事情不见面这样简单,接下,继续上Maven的世界吧。

 

pom.xml

开辟pom.xml,最基础之是这么的:

<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.xrq.withmaven</groupId>
  <artifactId>withmaven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build/>
</project>

盖是布局文件是Maven的中心,因此发生必要详细解读一下pom.xml,来先看一下端的几乎独:

 

1、modelVersion

  指定了脚下Maven模型的版本号,对于Maven2和Maven3吧,它只能是4.0.0

2、groupId

  顾名思义,这个当是店铺名或是团组织号称。一般的话groupId是出于三单部分构成,每个有内为”.”分隔,第一有些是种用途,比如用来商业的就是”com”,用于非营利性组织的便  是”org”;第二局部是企业称,比如”tengxun”、”baidu”、”alibaba”;第三片段凡是若的种名为

3、artifactId

  可以当是Maven构建的路名为,比如你的型面临有子项目,就可以采取”项目名-子项目名为”的命名方式

4、version

  版本号,SNAPSHOT意为快照,说明该品种还当开中,是未安静之版本。在Maven中甚重要之一点是,groupId、artifactId、version三独因素生成了一个Maven项目之骨干坐标,这可怜主要,我于运及钻研Maven的时累感受及了这点。

以上面的这些要素之外,还有有要素,同样位列一下:

1、packing

  项目打包的类别,可以要jar、war、rar、ear、pom,默认是jar

2、dependencies和dependency

  前者带有后者。前面说了,Maven的一个根本作用就是联保管jar包,为了一个型方可build或运行,项目遭到不可避免的,会靠很多外的jar包,在Maven中,这些靠就吃誉为dependency。

  说到此处,就生出一个地方仓库长途仓库的概念了。官方下载的本地仓库的配置于”%MAVEN_HOME%\conf\settings.xml”里面,找一下”localRepository”就可以了;MyEclipse默认的地头仓库的地方以”{user.home}/.m2/repository”路径下,同样找一下”localRepository”就好找到MyEclipse默认的本土仓库了。

  本地仓库和远程仓库是这般的,Maven工程第一会见从地方仓库被获取jar包,当无法得到指定jar包时,本地仓库会由远程仓库(中央仓库)中下载jar包,并放入当地仓库以备将来使

  举个例证,比方说自己的品种受到之所以到了MyBatis,那么得这么配置:

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.5</version>
    </dependency>
</dependencies>

事先有说过groupId、artifactId、version唯一标识一个Maven项目,有矣即三单元素,我们不怕得错过远程仓库下载MyBatis3.2.5.jar到地面仓库了。回想我们前面的做法,如果只要MyBatis的jar包,发现并未,然后去网上下载一个,需要另外的jar包,然后去网上下载一个,但是来了Maven,就便宜多矣,只待配置jar包对应的dependency依赖,Maven会自动帮我们错过远程仓库中下载jar包到当地仓库被。

3、properties

  properties是因此来定义有配置属性之,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后联合升级。

4、build

  build表示和构建相关的布,比如build下起finalName,表示的就是是最终构建之后的名号。

就解释一下Maven的目录结构:

  • main目录下是项目之显要代码,test目录下存放测试相关的代码
  • 编译输出后的代码会在target目录下
  • src/main/java下存放Java代码,src/main/resources下存放配置文件
  • 此间没webapp,Web项目会起webapp目录,webapp下存放Web应用相关代码
  • pom.xml是Maven项目之部署文件

 

当Maven中见面涉嫌到几乎栽仓库:

1
工作空间
,即我们的路工,这中或者会见放正pom.xml文件,这个pom.xml就是maven的安排文件

2
本地仓库
,本地仓库用于存放jar包,其实Jar包并无是直放入工作空间的,它是存于地面仓库,然后以实施发布打包的时候,添加依赖路径

3
私库
:私库是使用者自己搭建之maven仓库,用于解决频繁打外网下载jar包资源的压力。而且使用私库作为缓存层,也相对安全有。

4
共享仓库
:书被所说之中央仓库或者有常用的镜像网站还属于这种,国内比较有名的oschina以及163且是正确的maven仓库。

 

Maven入门使用大规模问题

1、我从SVN上下载了一个因为Maven构建的工程,下载了没有jar包怎么处置?

由资源库上下载下来的Maven工程,是绝非jar包的,此时好这么做:

(1)删除Maven工程,但是去的时刻绝不去本地工程中的Maven工程,只去MyEclipse中的Maven工程

(2)右键Import->Maven4MyEclipse->Existing Maven
Projects,导入你的Maven工程,此时MyEclipse在构建工程的时候,假如你的当地仓库被没有dependcy中之jar包,便会失去远程仓库下载jar包到地面仓库着。你的工程导入完毕之后,Library应该是这般的:

图片 3

2、重新下载Maven工程所依之jar包、导入jar包都得触发Maven工程的build
workspace,那么什么样才会触发Maven工程的build workspace?

找到一个pom.xml,随便修改一下,加一个空格、减一个空格什么的,ctrl+s保存一下,便会触发Maven工程的build
workspace了

3、本地仓库的目录结构是什么则的?

groupId、artifactId、version确定一个唯一的Maven,比方说自家来一个mybatis的dependcy:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.5</version>
</dependency>

那mybatis的jar包应该以%Maven仓库地址%\org\mybatis\mybatis\3.2.5\立刻一起径下,看到了吧,先groupId,再mybatis,最后version,每个名字还是一个文件夹的名字

4、有些jar包在dependcy里面有配备,Import了Maven工程,下充斥了工程所依赖的jar包之后,发现当地仓库里面也尚无,怎么惩罚?

唯恐是本下载jar包的当儿发生了什么问题,从artifactId目录开始去以下的保有文件/文件夹,然后触发一不成Maven工程的build
workspace就好了

5、本地仓库着规定已经有jar包了,工程中却报错,说找不顶jar包,该怎么收拾?

应来不少解决办法,目前缓解之一模一样种植方法是,MyEclipse->Window->Preferences->搜索Maven->User
Settings,Update
Settings和Reindex点一下即便吓了。另外,可以尝试一下管地面Maven仓库内之jar包删除一下,然后再次build
workspace,可能吗堪。

6、在maven项目受到,出现jar冲突,该怎么处置?

  这是于运用maven开发项目的进程中,经常会赶上的jar重复加载或者jar冲突的题材,是由于有些jar是由maven的倚重加载自动加载进来的,而不是开发者自己布置的。

可能您所依之是一个jar包A,但是maven会将jar包A所波及的别样jar包也受下载下来了。

  出现是由产生几乎点:

  1、如果项目受到存在对同一jar不同版本依赖之时节,maven
2根据最近法,默认引用最靠近项目版本的jar,maven
2.0.9会晤冲头声明原则
来引用相应版本的jar;无论那种办法,都见面面世jar包冲突。

  2、项目面临,经常会面遇上ClassNotFound,NoSuchMethod异常,第一影响往往是类似路径不对,jar没有正确的援。第一步判断jar是否加载,还是
加载的jar由于maven依赖管理有传递依赖,造成依赖之jar版本号不对,相应的类找不顶,或者是相应类版本不对,没有对号入座的点子。

  于化解这主意之前,首先来学一个个别只主要字:Dependencies 和
Exclusions

  Dependencies:是可选依赖(Optional Dependencies) 
  Exclusions:是因排除(Dependency Exclusions)

在一个jar依赖中,如果无思量凭借是jar包中的另保险就得使用Exclusions属性,使用方法:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectC</groupId>
          <artifactId>Project-C</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>
</project>

  现在言归正传,首先看错误原因:Caused
by: Java.lang.NoClassDefFoundError: Could not initialize
class org.apache.log4j.Log4jLoggerFactory

  然后基于错误原因备受的要害字(log4j)去pom.xml文件中曾经Dependency
Hierarchy(依赖列表)中查看jar包的依靠层次关系

  然后之所以要字(log4j)去追寻,会意识,在左手出现2独版本一样之jar包,把中一个exclusions即可。

图片 4

 

图片 5

 

网站地图xml地图