zoukankan      html  css  js  c++  java
  • maven 基本配置

        Maven在工作中几乎是个必备技能,项目团队用这个工具保证整个项目的依赖版本以及更迭,在这里总结一下最常用的技能。

        首先,当然是下载安装啦。maven官方的网址是http://maven.apache.org/,这里可以下载到最新以及历史版本的包,linux和windows的src(源码)以及bin(二进制)文件。由于Maven依赖于java,所以首先要安装好jdk,配置好java的环境;之后windows下需要在环境变量中配置maven路径,包括MAVEN_HOME以及Path中的%MAVEN_HOME%in;而在linux环境下要在/etc/profile中设置:

    M2_HOME=/opt/maven/apache-maven-3.2.1  
    export M2_HOME  
    PATH=$PATH:$M2_HOME/bin  
    export PATH  

    并在保存退出后执行命令:source /etc/profile。之后用mvn -v来检验是否安装成功。如果需要在eclipse中很方便地使用maven的相关工具进行测试/打包/发布则需要在eclipse中添加该插件,搞定后比较重要的设置如图,Installations是maven安装的位置,而User Settings中则需要设置maven的settings.xml文件。

        安装很简单,网上的教程一抓一把,但是使用之前最好把原理了解清楚。

        什么是maven?它的主要功能是什么?--基于java平台的项目构建、依赖管理工具(其实是废话,不懂的还是懵逼)。给几个实际的场景,有好几个项目,需要用到很多很多的jar包,能不能用一个仓库来搞定呢?项目代码中测试方法能不能一次运行?怎样把一个模块的功能放到一个仓库里,尤其是公共的服务?...

        maven可以在本机建立一个jar包的仓库,存储着本机maven历史使用过的jar包,工程中的配置文件pom.xml中的<dependency/>就指向了这些jar包,可以做到jar包的重用,该标签的版本就能够准确地定义该jar包的版本,方便团队协调管理。如果本机的仓库没有这个jar包,那么它会自动地根据安装maven时自动创建的.m2文件中的settings.xml文件在私服(也是方便团队管理依赖)或者中央库中找到这个jar包。它们的关系如图:

       

        在.m2中的settings.xml可以控制maven一旦在本机找不到jar包后是到私服去找还是到互联网中寻找该jar包,顺便一提,互联网中的<dependency/>可以在http://mvnrepository.com/中搜索,非常方便。默认的settings.xml文件会直接到互联网中央库中寻找需要的jar包,而私服需要自行配制,<profile/>中配置id以及地址等,并用<activeProfiles/>激活,如果配置镜像<mirrors/>可以保证maven只在私服中寻找本地缺失的依赖,找不到即寻找失败,不会到网络中寻找,这也是推荐的做法。

        前文提到的场景,jar包的管理只是其一,后面的可否测试则涉及到了maven的生命周期。如图:

    clean compile test report install deploy
    ========================================》
    Maven的生命周期

        用maven命令构建项目时,它的默认顺序就是依次执行周期中的每一环。关于这一点,比较常见的是在开发初期,常常会跳过测试进行编译打包,命令如下:

    mvn install -Dmaven.test.skip=true

    所以自动构建中,整个项目是会从target中清除之前的结果,编译,测试,报告,打包甚至到发布(需要配置)一次跑通,当然你可以只跑其中一部分。在eclipse安装插件后,可以在工程中run as中看到这些选项,或者在maven build...选项的Goals中添加构建目标。

        再看第三个问题,将公共的服务发布到私服中,共享给团队的其它成员。这就是如何将项目打包,而后发布到私服中。涉及到几个问题,一个是maven项目的约定,即项目结构;二是打包,以及发布的配置;第三就是maven对于jar包的定位标签。一个一个来看,maven的项目结构如图,pom是配置文件,target中存放打包之后产生的文件:

        要注意的是,原生的maven工程并不能够直接导入eclipse中,需要用命令mvn eclipse:eclipse做个转换。

        打包,需要选择最终打包的形态为jar、war或者pom,以jar为例,需要现在settings.xml中配置好<server/>以及<mirrors/><profile/>,并在<pom/>中配置好<distributionManagement/>。

        <server/>中可以根据pom中的版本号(是否为snapshot)而将jar包发布到不同的库中。

    <servers>
      <server>
          <id>rcsRelases</id>
          <username>admin</username>
          <password>admin123</password>
      </server>
      <server>
          <id>rcsSnapshots</id>
          <username>admin</username>
          <password>admin123</password>
      </server>
    </servers>

    <mirrors/>

    <mirrors>
      <mirror>
        <id>central</id>
        <mirrorOf>*</mirrorOf>
        <name>Human Readable Name for this Mirror.</name>
        <url>http://10.3.30.41:8089/nexus/content/groups/public/</url>
      </mirror>
    </mirrors>

    <profile/>与<activeProfiles/>

    <profiles>
        <profile>  
            <id>jdk17</id>  
            <activation>  
                <activeByDefault>true</activeByDefault>  
                <jdk>1.7</jdk>  
            </activation>  
                <properties>  
                <maven.compiler.source>1.7</maven.compiler.source>  
                <maven.compiler.target>1.7</maven.compiler.target>  
                <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>  
            </properties>   
         </profile>    
         <profile>
          <id>central-repos</id>
          <repositories>
            <repository>
              <id>central</id>
              <name>Central</name>
              <url>http://central</url>
              <releases>
                    <enabled>true</enabled>
              </releases>
              <snapshots>
                    <enabled>true</enabled>
             </snapshots>
            </repository>
          </repositories>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>central-repos</activeProfile>
    </activeProfiles>

    其中设置了所有maven项目默认使用jdk1.7作为开发环境。

         而在pom中,需要指定:

    <distributionManagement>
        <repository>
            <id>rcsSnapshots</id>
            <name>rcsSnapshots</name>
            <url>http://10.3.30.41:8089/nexus/content/repositories/rcsSnapshots</url>
        </repository>
    </distributionManagement>

        要注意的是,该标签中的id要和server中的id一致,并且需要相关权限,才能发布到nexus中。

         maven如何定位jar包呢?很简单,通过标签所约定的坐标:groupId约定包,artifact约定依赖的名称,version约定依赖的版本,通过这三个坐标就能找到该jar包在本地仓库的位置。

         最后,maven可以将一个工程核心代码打包和该项目依赖分离开来,通过在pom中设置,可以达到效果,这样就可以在本地上传代码时,只传一次依赖(通常很多很大)而多次修改核心代码jar包(通常很小)而节省上传到服务器上的时间:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.changjiang.data.service.center.sync.module.consumer.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

      本篇介绍到这里,基本的概念原理和命令都概括到了,如果以后遇到其它问题,可以在随记2中进行积累。

  • 相关阅读:
    最大回文子串
    找出不含重复字符的最长子串的长度
    链表表示的2个数相加
    如何胜任一个小型公司的技术总监?我的感想
    React 的坑
    MobX 学习
    摘要
    AI 帮助涂鸦
    计算机的前世今生
    常用编辑器实用技巧(pycharm、sublimeText、vim、vscode、Jupyter)
  • 原文地址:https://www.cnblogs.com/bruceChan0018/p/5783608.html
Copyright © 2011-2022 走看看