zoukankan      html  css  js  c++  java
  • 使用maven来管理您的java项目

      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%in,注意变量之间用分号间隔;

       验证安装: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:Appsapache-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-learnmvn-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 exus-2.11.1-01-bundle exus-2.11.1-01in;

       3) 安装nexus服务,在cmd中输入nexus install,或在nexus-2.11.1-01-bundle exus-2.11.1-01injswwindows-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.xconf下的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.xconfsettings.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资源路径下orgapachemavenplugins内清空,再次操作即可。

       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
  • 相关阅读:
    寻找完全数(C++)
    莱布尼兹三角形(C++)
    简单的素数问题(C++)
    ubuntu17.04下安装LNMP
    ubuntu下连接mysql出现Access denied for user 'rose'@'localhost' (using password: NO)的解决方法
    快速理解面向对象的PHP编程--基础篇
    百度电面总结
    操作系统基础知识
    快速理解C语言指针
    新手学习MongoDB的基本命令
  • 原文地址:https://www.cnblogs.com/hanganglin/p/4471228.html
Copyright © 2011-2022 走看看