代码改变世界

使用maven来管理您的java项目

2015-05-01 21:48  hduhans  阅读(1979)  评论(0编辑  收藏  举报

  maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译、构建、测试、发布和报告等。在大型项目开发中,使用maven来管理是必不可少的。

一、安装maven

1、Windows安装

   1) 从官网(http://maven.apache.org/download.cgi)下载需要安装的maven版本,并解压到本地磁盘中;

   2) 在系统环境变量中新建一个变量,名称为M2_HOME,值为maven所在路径,如:D:\apache-maven-3.3.1;

   3) 在环境变量Path中添加maven/bin目录,值为:%M2_HOME%\bin,注意变量之间用分号间隔;

   验证安装:cmd中输入命令mvn -v,如能正确显示版本则说明安装成功

2、Eclipse安装

   1) Eclipse中安装maven,只需要安装插件m2eclipse即可。最好将插件中的maven替换为本地安装的maven,因此通常需要事先安装本地maven

   打开Eclipse,选择Help->Install New Software,输入地址:http://download.eclipse.org/technology/m2e/releases(或:http://download.eclipse.org/technology/m2e/milestones/1.8/),等待安装完成。打开检查windows->Preferences,如果看到maven,则说明安装成功。

   配置Eclipse中的maven:

   ① windows->Preferences->Maven->Installations,新增选择本地安装的Maven目录,然后切换成本地的Maven;

   ② windows->Preferences->Maven->user Settings,更改User Settings为本地安装Maven目录下conf中的settings.xml;

   使用Eclipse新建maven项目时,选择Maven->Maven Project,最常用的ArtifactId为maven-archetype-quickstartconcoon-22-archetype-webapp

   2) 常见Eclipse执行maven命令错误及解决方案

   ① 提示:-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match

    解决:设一个环境变量M2_HOME指向你的maven安装目录(如:M2_HOME=D:\Apps\apache-maven-3.3.1),然后在Window->Preference->Java->Installed JREs->Edit在Default VM arguments中设置-Dmaven.multiModuleProjectDirectory=$M2_HOME

   ② 提示:Unsupported major.minor version 51.0

    解决:由于Maven项目编译JDK与系统安装JDK版本不一致导致,项目右键设置Compiler与安装JDK一致即可

3、说明配置

   mvn的全球资源库为:http://mvnrepository.com/,默认的中央仓库路径:https://repo.maven.apache.org/maven2来自apache-maven-xxx/lib/maven-model-builder-xxx.jar/org/apache/maven/model/pom-4.0.0.xml中Central Repository的url值)。

   maven搜索资源时,会现在本地的仓库中进行搜索,不存在对应的jar资源,则到中央仓库中搜索并下载到本地仓库中。

   本地仓库默认路径为:{用户文档}/.m2/,通常需要修改到指定位置,只要修改apache-maven-xxx/conf/settings.xml文件中的localRepository值,如:<localRepository>D:\java-learn\mvn-repository</localRepository>

   在项目中添加需要的jar,可在官方资源库(http://search.maven.org/)中搜索,然后将需要的jar的GAV配置信息复制到你的pom.xml配置中即可。

二、maven常用命令

   mvn compile 编译项目

   mvn package 打包发布(生成的jar包名称默认为:{artifactId}-{version}.jar,如:maven-test01-0.0.1-SNAPSHOT.jar)

   mvn package -Dmaven.test.skip=ture 打包时跳过测试

   mvn clean 清理(删除target目录)

   mvn install 在本地Repository中安装jar(项目被依赖时必须先将项目打包到资源repository中)

   mvn test 运行应用程序中的单元测试

   mvn archetype:generate 快速生成一个maven项目,根据提示输入groupId、artifactId、version可自动创建一个包含基本架构的maven项目
Choose a number or apply filter (format: ...): 直接回车,然后选择版本,接着分别输入groupId、artifactId、version

   mvn archetype:generate -DgroupId-{groupId} -DartifactId-{artifactId} -Dversion-{version} 指定GAV快速创建maven项目,如mvn archetype:generate -DgroupId-com.hicoor.maven -DartifactId-maven-test03 -Dversion-0.0.1-SHAPSHOT

三、maven项目文件结构与pom.xml标签介绍

1、maven项目文件结构

   所有使用maven管理的项目,其文件结构都是固定的,这相当于给项目的文件结构制定了一个通用规范,使得项目更加容易理解。maven项目结构如图1所示。

 图1 maven项目文件结构

    进入项目根目录(也就是pom.xml文件所在路径),执行编译命令:mvn compile,会在项目根目录中创建一个target文件夹,里面包含已编译的文件;执行编译测试:mvn test,会在target中设生成编译源码和测试报告,实测报告在surefire-reports目录中。

2、pom.xml文件结构与标签含义

   pom.xml文件内容结构如:

<?xml version="1.0" encoding="utf-8"?>
<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.hicoor.maven</groupId>
     <artifactId>maven-test01</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     
     <dependencies>
        <dependency>
          <groupId>..</groupId>
          <artifactId>..</artifactId>
          <version>..</version>
        </dependency>
      </dependencies>
     
</project>
View Code

   其中部分标签与含义如下:

   1) project,pom.xml文件中的顶层元素;

   2) modelVersion,指明POM使用的对象模型的版本,值很少改动;

   3) groupId,指明创建项目的组织或者小组的唯一标识。GroupId是项目的关键标识,典型的,此标识以组织的完全限定名来定义。比如,org.apache.maven.plugins是所有Maven插件项目指定的groupId;

   4) artifactId,模块名称)指明此项目产生的主要产品的基本名称。项目的主要产品通常为一个JAR文件。第二,象源代码包通常使用artifactId作为最后名称的一部分。典型的产品名称使用这个格式: <artifactId><version>;

   5) version,版本号,格式通常为x.x.x-里程碑。通常情况下,第一个x表示程序架构上发生重大变化,第二个x表示程序架构中的分支变化,第三个x表示程序改动的次数。常见的里程碑有如下值:① SNAPSHOT,快照版,正在开发的版本;② Alpha,是内部测试版,一般不向外部发布,会有很多Bug,一般只有测试人员使用;③ Beta,公共测试版,通常有客户单位参与的测试;④ Release,即Release Candidate,候选版本,RC版不会再加入新的功能了,主要着重于除错;⑤ GA,即General Availability,正式发布的版本。

四、maven依赖特性

   依赖特性在<scope></scope>中配置,如: 

<dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <scope>compile</scope>
         <!--排除依赖,当多个间接依赖冲突时使用-->
         <exclustions>
            <exclustion>
                <groupId>xx_groupId</groupId>
                <artifactId>xx_artifactId</artifactId>
            </exclustion>
         </exclustions>
    </dependency>
</dependencies>
View Code

1、scope依赖关系的值

   1) compile(编译范围),缺省值,适用于所有阶段,会随着项目一起发布;

   2) provided(已提供范围),类似compile,打包时会将该包排除,期望JDK、容器或使用者会提供这个依赖。如servlet.jar;

   3) runtime(运行时范围):依赖在运行和测试系统的时候需要,但在【编译】的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC;

   4) test(测试范围),只在测试时使用,用于编译和运行测试代码。不会随项目发布;

   5) system(系统范围),类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它;

2、依赖的传递 

   当一个项目依赖另一个项目时,会将被依赖项目中的所有compile的依赖传递过来 。

   1) (当依赖级别相同的时候)间接依赖存在先后性

   假设项目A依赖了xx-1.6.jar,项目B依赖了xx-2.3.jar。当项目C同时依赖A和B时,在xx对于项目C是间接依赖,C会加载1.6还是2.3的版本取决于C先依赖A还是先依赖B,即Maven不会自动判断间接依赖的包的版本。

   2) (当依赖级别不同的时候)优先依赖级别少的那个依赖

   假设项目A依赖了项目D,项目D中有依赖yy-3.3.jar,项目B依赖了yy-4.3.jar。当项目C同时依赖A和B时,由于C->A->D->yy为三级依赖,C->B->yy为二级依赖,所以项目C会间接依赖yy-4.3.jar。

3、依赖的排除

   当多个依赖存在冲突的时候,可以使用exclustion,将不需要的间接依赖排除掉。

五、maven的聚合和继承

1、聚合多个模块

   一个项目中可能存在多个模块,将他们聚合到一个maven项目中可同时编译多个模块,避免大量重复操作。

   聚合方法:在模块的同级目录中新建一个简单Maven项目,只包含一个pom.xml配置文件,使用<modules></modules>聚合需要的模块(位于标签<project></project>内),聚合示例如:

<modules>
     <!--根据相对路径使用../-->
     <module>../maven-test01</module>
     <module>../maven-test02</module>
</modules>
View Code

2、pom.xml配置文件的继承

   在多个maven项目中可能存在大量的重复的pom.xml配置内容,可以将这些重复的内容放到一个基本maven项目中,然后在其他maven项目中使用标签<parent></parent>继承。

   如新建了一个maven-parent基础配置项目,则其他项目继承时在pom.xml中添加如下内容:

<parent>  
    <!--通过GAV定位parent项目-->
    <groupId>com.hicoor.maven</groupId>  
    <artifactId>maven-parent</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <relativePath>../maven-parent/pom.xml</relativePath>  
</parent>  
View Code

   在maven-parent中不仅可以添加常用的配置,也可以添加dependencyManagement依赖管理,每个子项目需要添加父项目管理的依赖时,可不指定项目版本号,maven在编译时会自动向上去寻找版本号。

   例如在maven-parent的pom.xml中指定<project></project>内容:

<dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>mysql</groupId>  
            <artifactId>mysql-connector-java</artifactId>  
            <version>5.1.2</version>  
           </dependency>
           <!-- 添加其他依赖 -->
       </dependencies>
  </dependencyManagement>
View Code

   则在其他继承项目中可以直接引用mysql依赖而不用指定版本号,如:

<dependencies>  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
    </dependency>  
</dependencies>  
View Code

   这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改。另外如果某个子项目需要另外的一个版本,只需要声明version就可

   注意:使用parent结构后,打包命令要基于parent/pom.xml,会自动给子项目打包。

六、搭建maven私有服务器Nexus

   在公司内多人联合开发maven项目时,为避免版本换乱,最好搭建一个局域网内部maven资源服务器,所有的项目会自动搜索使用该服务器内的资源。 甚至有些公司内部不允许访问互联网,此时搭建maven私有服务器就显得更有必要了。

1、搭建安装Nexus(参考:http://www.cnblogs.com/quanyongan/archive/2013/04/24/3037589.html

   1) 去官网(http://www.sonatype.org/nexus)下载免费OSS版本,并解压到本地磁盘,注意Pro版本是收费的;

   2) 添加Path环境变量,如:D:\java-learn\nexus-2.11.1-01-bundle\nexus-2.11.1-01\bin;

   3) 安装nexus服务,在cmd中输入nexus install,或在nexus-2.11.1-01-bundle\nexus-2.11.1-01\bin\jsw\windows-x86-64中双击运行install-nexus.bat;

   4) 启动服务后,访问web管理界面http://localhost:8081/nexus/,默认登录用户admin,默认密码admin123;

2、web界面说明

   左侧菜单点击Repositories,右侧List中有一列为Type,其值与含义如下:

   1) hosted,为内部服务,面向局域网;

   2) 3rd party,用来保存第三方jar(典型的oracle数据库的j驱动包);

   3) Snapshots,用来保存项目组内部的快照;

   4) Releases,用来保存项目组内部的发布版;

   5) Central,中央工厂下载的所有jar存放与此;

3、Nexus配置

   1) 配置只在当前maven项目中使用nexus私服,在pom.xml中添加如下内容:

<repositories>      
    <repository>          
        <id>nexus</id>          
        <name>Nexus Repository</name>         
        <url>http://localhost:8081/nexus/content/groups/public/</url>      
    </repository>  
</repositories>
View Code

   2) 配置使所有的maven项目默认使用nexus服务器,打开maven安装目录apache-maven-x.x.x\conf下的settings.xml,在<profiles></profiles>标签中添加如下内容:

<profile>
      <id>nexusProfile</id>
      <repositories>
        <repository>
            <id>nexus</id>
            <name>Nexus Repository</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
            <!-- releases和snapshots依赖默认是关闭的,需要手动打开 -->
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
      </repositories>
</profile>
View Code

     并在<settings></settings>标签中激活使用哪种profile,配置如下:

<activeProfiles>
      <!-- 只有激活之后才会生效 -->
      <activeProfile>nexusProfile</activeProfile>
</activeProfiles>
View Code

4、发布项目到Nexus

   将自己的maven项目发布到nexus中,步骤如下:

   1) 在项目pom.xml中添加如下配置:

 <distributionManagement>
      <repository>
          <id>hicoor-release</id>
          <name>Releases</name>
          <url>http://localhost:8081/nexus/content/repositories/releases/</url>
      </repository>
      <snapshotRepository>
          <id>hicoor-snapshot</id>
          <name>Snapshots</name>
          <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
      </snapshotRepository>
 </distributionManagement>
View Code

   2) 打开文件apache-maven-x.x.x\conf\settings.xml,在<servers></servers>标签内添加如下内容(注意id要与项目pom.xml中的id对应):

<server>
      <id>hicoor-release</id>
      <username>deployment</username>
      <password>deployment123</password>
    </server>
    <server>
      <id>hicoor-snapshot</id>
      <username>deployment</username>
      <password>deployment123</password>
</server>
View Code

   3) 在Eclipse发布项目,pom.xml->Run As->Maven bulid,输入clean deploy,即可将项目发布到nexus中。

7、使用Maven创建WebApp项目

   参考:https://www.cnblogs.com/noteless/p/5213075.html

   错误处理:

   1) 创建Maven项目过程报错,错误信息“could not calculate build plan: plugin maven-war-plugin..”,解决办法是:将maven资源路径下org\apache\maven\plugins内清空,再次操作即可。

   2) Maven项目创建完后,右键->Properties->Project Facets,选择Dynamic Web Module时,如果提示错误“Dynamic Web Module 3.0 requires Java 1.6 or newer”,解决办法是,在项目的pom.xml的<build></build>标签中加入如下内容,然后保存,项目构建完成后在项目文件夹上点右键,选择Maven->Update Project Configuration,问题解决。

<plugins>  
    <plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-compiler-plugin</artifactId>  
        <version>2.3.2</version>  
        <configuration>  
            <source>1.6</source>  
            <target>1.6</target>  
        </configuration>  
    </plugin>  
</plugins>  
View Code
七、eclipse-maven常见错误及解决方案

1、升级maven-jar-plugin后pom.xml报错误:m2e error in MavenArchiver.getManifest()

   解决方案,升级eclipse m2e扩展,操作步骤,eclipse -> Help > Install New Software,使用下述其中一个资源进行安装:① http://repo1.maven.org/maven2/.m2e/connectors/m2eclipse-mavenarchiver/0.17.2/N/LATEST/; ② https://otto.takari.io/content/sites/m2e.extras/m2eclipse-mavenarchiver/0.17.2/N/LATEST/

   参考:http://stackoverflow.com/questions/37555557/m2e-error-in-mavenarchiver-getmanifest

八、使用阿里云镜像

   修改maven根目录下的conf文件夹中的setting.xml文件,内容如:

<mirrors>
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>
        http://maven.aliyun.com/nexus/content/groups/public/
        </url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>
View Code