zoukankan      html  css  js  c++  java
  • maven

    Maven in 5 Minutes  Maven实战 Maven中央仓库 maven概念  pom元素描述

    1.下载安装maven,解压缩后,设置环境变量M2_HOME到maven目录;在path中增加maven的bin目录。

       命令行输入mvn -version验证是否安装成功
       linux下安装时先检查以前是否有过IDE内嵌安装,whereis mvn
       若存在mvn: /usr/bin/mvn /opt/apache-maven-3.0.4/bin/mvn /usr/share/man/man1/mvn.1.gz则重新创建链接到/usr/bin下:
        ln -s /opt/apache-maven-3.0.4/bin/mvn /usr/bin/mvn
       #MAVEN
         export M2_HOME=/opt/apache-maven-3.0.4
         export M2=$M2_HOME/bin
         export MAVEN_OPTS="-Xms256m -Xmx512m"
         export PATH=$M2:$PATH
       复制 M2_HOME/conf/settings.xml 文件到~/.m2/settings.xml

    2.网络设置
        maven运行时需要网络环境。如果需要网络代理,则在maven安装目录下conf/settings.xml中找到<proxies>节点进行设置

    3.在命令行中输入你要创建的工程:
        mvn archetype:create -DgroupId=com.cms -DartifactId=cms
        若运行成功则生成:
        cms
         ├─pom.xml
         ├─src
         └─main
          └─java
           └─com
            └─cms
             └─App.java
         └─test
          └─java
           └─com
            └─cms
             └─AppTest.java
     mvn package默认打包生成的 jar 是不能够直接运行的,因为带有 main 方法的类信息不会添加到 manifest中,生成可执行的 jar 文件,我们需要借助 maven-shade-plugin,配置该插件如下:     

    <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.cms</groupId>
      <artifactId>cms</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>cms</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
      <build>
       <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer
                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.cms.App</mainClass>
                        </transformer>
                    </transformers>
                </configuration>
                </execution>
            </executions>
        </plugin>
       </plugins>
      </build>
    </project>

         再执行mvn package可看到cms-1.0-SNAPSHOT.jar、original-cms-1.0-SNAPSHOT.jar,前 者 是 带 有Main-Class 信息的可运行 jar,后者是原始的 jar
         执行java -jar target\cms-1.0-SNAPSHOT.jar

    4.maven坐标包括groupId、artifactId、version、packaging、classifier
       maven:"groupId=org.testng;artifactId=testng;version=5.8;classifier=jdk15"
       groupId:隶属的实际项目名与包名类似
       artifactId:实际项目中的一个模块名即实际项目名
       version:项目的版本
       packaging[可选]:项目打包方式,默认jar
       classifier[可选]:帮助定义构建输出的一些附属构件,附属构件与主构件对应,不能直接定义项目的classifier因为附属构件不是项目直接默认生成的而是由附加的插件帮助生成

    5.基于spring framework的account-email实例的pom :
       mvn archetype:create -DgroupId=com.cms.account -DartifactId=account-email

    <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.cms.account</groupId>
      <artifactId>account-email</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>
      <name>Account Email</name>
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
      <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>              #以下为spring依赖注入必要库
          <artifactId>spring-core</artifactId>
          <version>2.5.6</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>2.5.6</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>2.5.6</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-support</artifactId>
          <version>2.5.6</version>
        </dependency>
        <dependency>
          <groupId>javax.mail</groupId>                        #邮件实现支持库
          <artifactId>mail</artifactId>
          <version>1.4.1</version>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.7</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>com.icegreen</groupId>                      #开源邮件服务测试套件
          <artifactId>greenmail</artifactId>
          <version>1.3.1b</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
      <build>
       <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>           #开启java5支持
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <source>1.5</source>
            <target>1.5</target>
          </configuration>
        </plugin>
       </plugins>
      </build>
    </project>

    6.maven命令:
        命令行输入mvn -h ,显示mvn帮助,其中usage: mvn [options] [<goal(s)>] [<phase(s)>]表明了mvn命令的结构。options:可选的参数,goal(s): 表示maven构建的“目标”,Phase(s):阶段-表示maven构建生命周期

    7.maven会执行生命周期中该阶段之前的所有命令:

    • validate: 验证项目是否正确以及相关信息是否可用
    • compile: 编译
    • test: 通过junit进行单元测试
    • package: 根据事先指定的格式(比如jar),进行打包
    • integration-test: 部署到运行环境中,准备进行集成测试
    • verify: 对包进行有效性性和质量检查
    • install: 安装到本地代码库
    • deploy: 在集成或发布环境,将包发布到远程代码库

        在“默认”的生命周期之外,还有两个“阶段”:

    • clean: 清除以前的构建物。
    • site: 生成项目文档

    8.pom.xml 文件基本节点介绍

     <project > :文件的根节点
     <modelversion > : pom.xml 使用的对象模型版本
     <groupId > :创建项目的组织或团体的唯一 Id
     <artifactId > :项目的唯一 Id, 可视为项目名
     <packaging > :打包物的扩展名,一般有 JAR,WAR,EAR 等 
     <version > :产品的版本号
     <name > :项目的显示名,常用于 Maven 生成的文档
     <url > :组织的站点,常用于 Maven 生成的文档
     <de.ion > :项目的描述,常用于 Maven 生成的文档

    9.常用命令

        mvn archetype:create :创建 Maven 项目 
        mvn compile :编译源代码
        mvn test-compile :编译测试代码
        mvn test : 运行应用程序中的单元测试
        mvn site : 生成项目相关信息的网站
        mvn clean :清除目标目录中的生成结果
        mvn package : 依据项目生成 jar 文件
        mvn install :在本地 Repository 中安装 jar
        mvn eclipse:eclipse :生成 Eclipse 项目文件
        mvn -Dwtpversion=1.0 eclipse:eclipse : 生成Wtp插件的Web项目
        mvn -Dwtpversion=1.0 eclipse:clean : 清除Eclipse项目的配置信息(Web项目)
        mvn eclipse:clean : 清除eclipse的一些系统设置
        mvn idea:idea : 生成Intellij idea项目文件
        mvn jar:jar : 只打包jar
        mvn test -skipping compile -skipping test-compile : 只测试而不编译,也不测试编译
        mvn jetty:run : 运行项目于jetty上
        mvn -e : 显示详细错误信息
        建一个 JAVA 项目 : mvn archetype:create -DgroupId=com.demo -DartifactId=demo
        建一个 web 项目 : mvn archetype:create -DgroupId=com.demo -DartifactId=web-demo  -DarchetypeArtifactId=maven-archetype-webapp
        Eclipse WTP 项目执行 : mvn eclipse:eclipse –Dwtpversion=1.0 ( wtp1.0 以上版本均可用)

        一般使用情况是这样,首先通过cvs或svn下载代码到本机,然后执行mvn eclipse:eclipse生成ecllipse项目文件,然后导入到eclipse就行了;修改代码后执行mvn compile或mvn test检验,也可以下载eclipse的maven插件。更改Maven缺省的本地仓库地址:修改${user.home}/.m2/settings.xml

        <settings>  
          ...   
          <localRepository>/opt/maven/repository</localRepository>  
          ...   
        </settings>  

    10.依赖范围

    compile默认范围-编译、测试、运行三种classpath都有效,如spring-core
    test只对测试classpath有效,如Junit
    provided对编译、测试classpath有效,如servlet-api
    runtime对测试、运行classpath有效,如JDBC驱动
    system对编译、测试classpath有效,使用本地库(maven仓库之外的类库文件)与本机系统绑定,可能造成不可移植,可引用环境变量
    import不会对编译、测试、运行三种classpath产生影响

    11.依赖传递性

      compile test provided runtime
    compile √  - -
    test
    provided - - -
    runtime - -

    路径最近者优先

    A->B->C->X(1.0) A->D->X(2.0) 使用X2.0
    第一声名者优先
    A->B->Y(1.0) A->C->Y(2.0) 使用Y1.0

    12.可选依赖
    A->B、B->X(可选)、B->Y(可选) X、Y不会对A有任何影响
    例如B是一个持久层隔离工具包,支持MongoDB、postgresql,在构建这个工具包时,需要这两种数据库驱动,但在使用这个工具包时只会依赖其中一种
    <project...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cms.b</groupId>
    <artifactId>project-b</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
    <dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>casbah_2.9.2</artifactId>
    <version>2.4.1</version>
    <optional>true</optional>
    </dependency>
    <dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.1-901-1.jdbc4</version>
    <optional>true</optional>
    </dependency>
    </dependencies>
    </project>

    <project...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cms.account</groupId>
    <artifactId>project-a</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
    <dependency>
    <groupId>com.cms.b</groupId>
    <artifactId>project-b</artifactId>
    <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.1-901-1.jdbc4</version>
    </dependency>
    </dependencies>
    </project>

    13.最佳实践
    传递依赖会给项目隐式的引入很多依赖,这简化了项目依赖的管理,但有时会带来问题,如项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,而SNAPSHOT的不稳定性会直接影响当前的项目,这时就需要排除该SNAPSHOT
    排除传递性依赖:
    A->B,由于一些原因B不想引入传递性依赖C而是自身显式地声名对项目C1.1.0的依赖
    <project...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cms.account</groupId>
    <artifactId>project-a</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
    <dependency>
    <groupId>com.cms.b</groupId>
    <artifactId>project-b</artifactId>
    <version>1.0-SNAPSHOT</version>
    <exclusions> #排除依赖
    <exclusion>#不需要version元素
    <groupId>com.cms.c</groupId>
    <artifactId>project-c</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>com.cms.c</groupId>
    <artifactId>project-c</artifactId>
    <version>1.1.0</version>
    </dependency>
    </dependencies>
    </project>

    14.归类依赖

        #env.X:引用环境变量${env.PATH}
        #project.x:.表示路径将包含相应的元素的值。例如:<project><version>1.0</version></project>可以通过${project.version}访问
        #settings.x:.表示路径将包含相应的元素的值。例如:<settings><offline>false</offline></settings>可以通过${settings.offline}访问
        #Java System Properties:可通过java.lang.System.getProperties()访问的所有属性都都可用作POM属性,如${java.home}
    #pom中<properties/>下的<someVar>元素可直接${someVar}引用

    <project...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cms.account</groupId>
    <artifactId>account-email</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
    <springframework.version>2.5.6</springframework.version>
    </properties>
    <dependencies>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${springframework.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${springframework.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${springframework.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-support</artifactId>
    <version>${springframework.version}</version>
    </dependency>
    </dependencies>
    </project>

    15.优化依赖
    已解析依赖列表mvn dependency:list
    已解析依赖树mvn dependency:tree
    已解析依赖分析(只会分析编译和测试需要的依赖)mvn dependency:analyze

  • 相关阅读:
    UCSC genome browser 个人track 安装
    C++遍历二维数组的四种方法
    生物结构变异分析软件meerkat 0.189使用笔记(一)
    R语言从小木虫网页批量提取考研调剂信息
    使用R语言将微信记录制作成词云(简洁)--情人节奥义
    判断数据是否服从某一分布(二)——简单易用fitdistrplus包
    判断数据是否服从某一分布(一)
    如何正确地写出单例模式
    使用 JavaScript 将网站后台的数据变化实时更新到前端-【知乎总结】
    C#实时读取数据----局部页面刷新【转】
  • 原文地址:https://www.cnblogs.com/wen12128/p/2791115.html
Copyright © 2011-2022 走看看