`

初学 Maven

阅读更多
一,使用maven命令生成项目
mvn archetype:generate
-DgroupId=xxxx
-DartifactId=xxx
-DpackageName=xxxx
-Dversion=xxx
goal是maven中最小的执行单元, 如此例的goal是  generate
一些编号(版本3.0.5):
306- simple web


二, pom文件结构
执行 mvn help:effective-pom 来查看effective pom
所有的pom都继承自super pom,而effective pom 就包含super pom

1) Project是所有pom.xml的根元素,并且在里面定义了命名空间和xsd元素
<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">

2)ModelVersion 当前pom模型的版本
<modelVersion>4.0.0</modelVersion>

3)GroupId定义当前maven项目隶属的实际项目
<groupId>com.test.mvn</groupId>

4)ArtifactId定义项目中的某个模块名称
<artifactId>MavenTest</artifactId>

5)Version 定义maven项目当前所处的版本号
<version>0.0.1-SNAPSHOT</version>

6)Packaging定义maven项目的打包方式。
<packaging>jar</packaging>
如:
<groupId>org.pango.user</groupId>
<artifactId>user </artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
在空间中的格式:groupId:artifactId:packaging:version,
如: org.pango.user:user:jar:0.0.1-SNAPSHOT

7)Dependencies 元素底下就是加入依赖包的地方

8)每个dependency都是一个依赖包,依赖包也就是在dependency里面定义各个依赖包的坐标,这样maven就会从网上下载依赖包到你本地仓库中,有所不同的是dependency元素包含了一个子元素,这个就是对maven生命周期的一个说明,当然除了上面四个子元素外,还包含几个其他的元素:
(1) type说明依赖的类型
(2) optional标记依赖是否可选
(3) exclusions 用来排斥传递依赖
<dependency>
<groupId>实际项目</groupId>
<artifactId>模块</artifactId>
<version>版本</version>
<type>依赖类型</type>
<scope>依赖范围</scope>
<optional>依赖是否可选</optional> <!—主要用于排除传递性依赖-->
<exclusions>
  <exclusion>
   <groupId>…</groupId>
   <artifactId>…</artifactId>
  </exclusion>
</exclusions>
</dependency>

三, MVN常用命令
1)mvn clean -->表示运行清理操作(会默认把target文件夹中的数据清理)
2)mvn clean compile-->表示先运行清理之后运行编译,会见代码编译到target文件夹中
3)mvn clean test-->运行清理和测试
4)mvn clean package-->运行清理和打包
5)mvn clean install-->运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用
6)mvn clean deploy-->运行清理和发布(发布到私服上面)

四,传递依赖规则
1) 最短路径原则:如果A对于依赖路径中有两个相同的jar包,那么选择路径短的那个包;
2) 第一声明优先原则:如果A对于依赖路径中有两个相同的jar包,路径也相同,那么依赖写在前面的优先;
3)可选依赖不会传递,如A->B,B->C,B->D,A对B直接依赖,B对C和D是可选依赖,那么在A中不会引入C和D;

查看依赖列表:
1, mvn dependency:resolve   平滑的打印出你的项目所有依赖包
2, dependency:tree     依赖树的形式打印出
3, mvn install –X  全部显示,包含被reject了的artifact文件

五,依赖范围(<scope>)
1)test范围指的是测试编译和执行期间有效,在编译和打包时都不会使用这个依赖
2)compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去
3)provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突
4)runtime在运行的时候依赖,在编译的时候不依赖

scope      编译期  测试期   运行期 说明
*compile V V V     默认scope
test V       只在测试期依赖,如junit包
provided V V       运行期由容器提供,如servlet-api包
runtime V V       编译期间不需要直接引用
system V V       编译和测试时由本机环境提供


六,聚合
<modelVersion>4.0.0</modelVersion>
<groupId>org.pango.user</groupId>
<artifactId>user-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>     ///必须是pom

<modules>
<module>../user-core</module>
<module>../user-log</module>
<module>../user-dao</module>
<module>../user-service</module>
</modules>

七,继承
假设前面已经有写好的一个父pom.xml, 可以用过这样来继承
<parent>
<groupId>org.pango.user</groupId>
<artifactId>user-parent</artifactId>    //父模块的gid和aid
<version>0.0.1-SNAPSHOT</version>
<relativePath>../user-parent/pom.xml</relativePath>
</parent>

选择继承:
pom中pluginManagement(dependencyManagement)标签下的配置只是定义, 并不会被使用.子模块中需要显式的激活.
将依赖放入dependencyManagement
<dependencyManagement>
<dependencies>
  <dependency>
    ...
  </dependency>
</dependencies>
</dependencyManagement>
把继承的配置加入到dependencyManagement中,对于继承的项目,我需要引入依赖的声明,但不需要进行版本声明,如下:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>

可继承的POM元素:
1.groupId :项目组ID ,项目坐标的核心元素;
2.version :项目版本,项目坐标的核心元素;
3.description :项目的描述信息;
4.organization :项目的组织信息;
5.inceptionYear :项目的创始年份;
6.url :项目的url 地址
7.developers :项目的开发者信息;
8.contributors :项目的贡献者信息;
9.distributionManagerment :项目的部署信息;
10.issueManagement :缺陷跟踪系统信息;
11.ciManagement :项目的持续继承信息;
12.scm:项目的版本控制信息;
13.mailingListserv :项目的邮件列表信息;
14.properties :自定义的Maven 属性;
15.dependencies :项目的依赖配置;
16.dependencyManagement:醒目的依赖管理配置;
17.repositories :项目的仓库配置;
18.build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
19.reporting :包括项目的报告输出目录配置、报告插件配置等。

八, 生命周期
生命周期包含项目的清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等几乎所有的过程。
maven包括三套生命周期,分别是:
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle 生成项目报 告,站点,发布站点。

1,Clean生命周期一共包含了三个阶段:
- pre-clean 执行一些需要在clean之前完成的工作
- clean 移除所有上一次构建生成的文件
- post-clean  执行一些需要在clean之后立刻完成的工作
如果我们运行mvn post-clean,那么 pre-clean,clean 都会被运行 (向前包含)。

2,Site生命周期的各个阶段:
- pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上

3,Default生命周期:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并处理资源文件,至目标目录,准备打包。
- compile 编译项目的源代码。
- process-classes
- generate-test-sources 
- process-test-sources
- enerate-test-resources
- process-test-resources 复制并处理资源文件,至目标测试目录。
- test-compile 编译测试源代码。
- process-test-classes
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
- prepare-package
- package 接受编译好的代码,打包成可发布的格式,如JAR。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖。
- deploy

九,插件(以测试插件surefire为例)
http://maven.apache.org/plugins/index.html 插件地址。
对于匹配测试类,maven会去src/test/java 下面去寻找类,此文件下面的类需要符合以下
的规则:
- Test*.java:任何目录以Test开头的类
- *Test.java:任何以Test结尾的类
- *TestCase.java:任何以TestCase结尾的类

1,Surefire的test goal,它默认会执行src/test/java下面的 所有/Test*.java, /Test.java和/*/*TestCase.java文件;并且会生成报告目录 surefire-reports.
配置surefire插件:
<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>   //surefire plugin
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.15</version>
    <configuration>
<testFailureIgnore>true</testFailureIgnore>  //错误仍然继续执行
    </configuration>
<executions>        //executions用于配置测试阶段
           <execution>
              <id>default-test</id>
              <phase>test</phase>        //test阶段
              <goals>
                 <goal>test</goal>      
              </goals>
            <!-- Disable unit test execution by setting skip=true -->           
              <configuration>
                <skip>true</skip>         //跳过测试步骤
              </configuration>
           </execution>
            <execution>
               <id>default-cli</id>
               <phase>integration-test</phase>
               <goals>
                  <goal>test</goal>
               </goals>
               <configuration>
                  <skip>false</skip>
                  <systemPropertyVariables>
                    <webdriver.port>${webdriver.port}</webdriver.port>
                    <webdriver.driver>${webdriver.driver}</webdriver.driver>
                    <webdriver.url>${webdriver.url}</webdriver.url>
                  </systemPropertyVariables>
                  <includes>
                    <include>**/CC/AA/*.java</include>
                    <include>**/BB/*.java</include>
                  </includes>
                </configuration>
              </execution>
    </executions>
   </plugin>
<plugins>
</build>

2,打包生成jar 的plugin:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>   //assembly plugin
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
或使用  mvn install assembly:assembly

2,将assembly goal 加到package阶段:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>      //assembly plugin
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>     
<execution>
<id>simple-command</id>
<phase>package</phase>
<goals>
<goal>attached</goal>     //assembly:attached 在package会被执行
</goals>
</execution>
</executions>
</plugin>

3,使用compile pulgin:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>     // compile plugin
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration> 
</plugin>

4,配置jetty plugin:
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
</plugin>
这里需要先配置一下servlet依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>   //表示这个包已被servlet容器提供了,不需要再去下载它
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
使用mvn jetty:run 来启动jetty服务来启动服务, 然后http://localhost:8080/simple-webapp/simple 看看成功没

十,公共依赖
1,在父模块中使用,将公共的依赖放进<dependencyManagement>:
<dependencyManagement>     //公共模块放入dependencyManagement
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.0.7</version>
</dependency>
     ...
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.3.0.ga</version>
</dependency>
</dependencies>
</dependencyManagement>
同样也可以将公共的插件放到父模块中, 使用pluginManagement

2, 分析插件冲突
mvn dependency:analyze

十一,远程仓库配置
<repositories>    //repositories下声明一个或多个repository子元素
<repository> 
      <id>jboss</id>                  //id必须唯一
      <name>JBoss Repository</name> 
      <url>http://repository.jboss.com/maven2/</url>    //地址
      <releases> 
        <enabled>true</enabled> 
      </releases> 
    <snapshots> 
      <enabled>false</enabled>        //快照版的下载支持
      <updatePolicy>daily</updatePolicy>   //远程仓库更新的频率如daily,always等 
      <checksumPolicy>ignore</checksumPolicy> //配置检验文件的策略,下载构件的时候会校验文件,如果失败的时候会怎么办,如果为warn 会警告,fail就失败,ignore忽略
    </snapshots> 
<layout>default</layout> 
</repository> 
  </repositories>

十二, 设置代理
<settings> 
  ... 
  <proxies> 
    <proxy> 
      <id>my-proxy</id> 
      <active>true</active> 
      <protocol>http</protocol> 
      <host>127.0.0.1</host> 
      <port>8087</port> 
      <!-- 
        <username>***</username> 
        <password>***</password> 
        <nonProxyHosts> 
          repository.mycom.com|*.google.com 
        </nonProxyHosts> 
      --> 
    </proxy> 
  </proxies> 
  ... 
</settings>

十三, 手动注册jar包到本地库
mvn install:install-file
-DgroupId=com.danga
-DartifactId=memcached
-Dversion=2.0.1
-Dfile=java_memcached-release_2.0.1.jar
-Dpackaging=jar
-DgeneratePom=true

十四, maven提示内存溢出
找到文件%M2_HOME%\bin\mvn.bat ,这就是启动Maven的脚本文件
加上 set MAVEN_OPTS=-XX:MaxPermSize=128M
分享到:
评论

相关推荐

    初学Maven小例子--使用greenmail测试邮件

    本篇文章将通过一个初学者友好的小例子——使用greenmail测试邮件,来介绍如何结合Maven进行实际的开发工作。 首先,让我们了解Maven的核心概念。Maven使用Project Object Model (POM)来描述项目,POM中包含了项目...

    简单的ssm-maven项目,供初学者学习

    一个基础的maven项目,供给初学maven的同学检阅如何配置maven项目,采用jdk1.8,maven3.5.2,使用阿里云maven服务器导入jar包,内涵基础ssm的pom文件,包括跨域访问,供给大家学习交流使用。

    maven整合ssm的demo

    maven整合ssm的简单demo,代码命名规范,逻辑简单,所用jar都是最新版的已经在pom.xml中配置好,数据库脚本在resource中,直接运行即可,代码适合初学maven整合ssm的童鞋,如有问题请私信我。

    Maven 简易安装到项目搭建教程

    在工作过程中,由于接触的项目多了,就想自己先搭一个私服练一下,顺便把整个过程稍微记录一下,然后整理成文档,共享给大家,把用到的全部打包,希望可以对初学MAVEN的有所帮助,不足的地方请大家指出,共通学习...

    初学者配置maven及使用SSM框架创建maven项目

    这是一个压缩包。这是一个maven项目,使用Java语言开发的web工程,使用了SpringMVC+Spring+Mybatis,建议初学者入手。

    apache-maven-3.6.2_maven_

    对于初学者来说,Maven简化了项目结构,通常遵循标准的目录布局,如src/main/java存放源代码,src/main/resources存放资源文件,src/test/java存放测试代码。这种结构使得团队协作变得更加清晰和有序。 与IDE的集成...

    maven历史版本下载

    **正文** Maven是Java开发领域中不可或缺的项目管理和构建工具,由Apache Software Foundation开发并维护。...因此,无论是初学者还是经验丰富的开发者,都应该掌握Maven的使用技巧,以适应快速变化的软件开发环境。

    maven初学者利器

    具体介绍了maven初学搭建项目一个流程,内容详细,并且介绍主流maven插件比如cargo,checkstyle,findbugs以及在tomcat上项目的运行

    Maven初学笔记

    ### Maven初学笔记 #### Maven概述 **Apache Maven** 是一款功能强大的软件项目管理和综合工具。它基于项目对象模型(Project Object Model, POM)的概念,能够从一个中心信息源管理项目的构建、报告以及文档。这...

    Maven学习极品,对于初学者而言非常好的资料,极力推荐

    【 Maven学习极品:初学者的完美指南】 Maven,一个由Apache软件基金会开发的项目管理工具,是Java世界中不可或缺的一部分。它简化了构建过程,通过自动管理项目的依赖关系,使得开发者可以专注于编写代码,而不是...

    maven分模块小demo

    在软件开发过程中,Maven作为一个强大的项目管理和构建工具,被广泛...对于初学者而言,这是一个理解Maven工作原理和实践项目组织的良好起点。通过深入研究这个demo,开发者可以更好地掌握Maven在实际开发中的运用。

    maven3.6.2版本

    对于初学者,了解Maven的命令行界面(CLI)是至关重要的。常见的命令有`mvn clean`用于清理构建输出,`mvn compile`用于编译源代码,`mvn test`运行测试,`mvn package`打包应用,以及`mvn install`将项目安装到本地...

    maven离线安装包(含环境配置文件)

    Maven是一款强大的Java项目管理工具,它能够帮助开发者构建、管理和部署Java项目。在这个"maven离线安装包(含环境配置...无论你是初学者还是经验丰富的开发者,掌握Maven的离线安装和配置都是提升工作效率的重要步骤。

    apache-maven-3.9.6-bin

    Apache Maven 是一个强大的项目管理工具,广泛用于Java应用程序的构建、管理和依赖管理。Maven 3.9.6 是该工具的一个稳定版本,提供了一系列改进和...无论是初学者还是经验丰富的开发者,都能从Maven的强大功能中受益。

    maven3.5.0.zip

    Maven是Java世界中的一款项目管理和综合工具,它通过提供一套标准化的构建流程,极大地简化了项目的构建、依赖管理和部署过程。...无论你是初学者还是经验丰富的开发者,Maven3.5.0都是值得信赖的项目管理工具。

    阿里云maven 3.6.3稳定版

    对于初学者(小白)来说,使用阿里云Maven可以避免因网络问题导致的构建困扰,更快地熟悉和掌握Maven的使用。 Apache Maven 3.6.3是该版本的具体型号,它是Maven发展的一个稳定阶段,包含了之前版本的改进和修复。...

Global site tag (gtag.js) - Google Analytics