Maven

经过前面ssm等知识的学习,从这篇开始打算着手众筹小项目的练习,用于融合之前学过的知识,以此来记录自己的学习过程;

首先来学习使用maven。

1.Maven简介 

1.1 Maven翻译为“专家”,“内行”

maven project 和Maven module区别 maven项目和java项目的区别_maven

1.2 Maven是跨平台的项目管理工具。作为Apache组织提供的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手。

①项目构建

     <1>什么是项目构建?项目构建指的是程序模块从清理、编译直到部署的整个过程。

maven project 和Maven module区别 maven项目和java项目的区别_maven_02

     <2>什么是理想的项目构建?高度自动化,跨平台,可重用组件,标准化

②依赖管理(这是我们的主要用途)

     <1>应用程序运行时会依赖很多其他应用程序。有些依赖是直接而明确的,例如我们在类中import一个第三方JAR包中的类,缺失所需要的JAR包时编译无法通过;而有些依赖是含蓄而不明显的,例如在使用Strust2时,它的核心Filter,编码时无法发现缺少对应的JAR包,到运行时才会报错,所以依赖管理是十分复杂的,特别是使用第三方程序很多的情况下。

     <2>Maven能够提供自动的依赖管理,将所需要的JAR自动导入到工程中,根据既定的规则很好的解决JAR包之间的冲突。

③项目信息管理

     <1>Maven能够提供高质量的项目信息,包括依赖关系、测试报告、站点信息等详细内容,并自动生成静态页面,拷贝到服务器上就可以直接使用。

 

2 Maven核心概念

2.1 项目对象模型 Project Object Model

2.2 约定的目录结构

2.3 坐标

2.4 依赖管理

2.5 仓库管理

2.6 生命周期

2.7 插件和目标

2.8 聚合和继承

 

3 Maven安装

1.解压部署Maven核心程序
    ①检查JAVA_HOME环境变量

C:\Windows\System32>echo %JAVA_HOME%
         C:\Program Files\java\jdk1.7.0_07
     ②解压Maven的核心程序
         将apache-maven-3.2.2-bin.zip解压到一个非中文无空格的目录下。例如:D:\devsoft\apache-maven-3.2.2
     ③配置环境变量
         M2_HOME D:\devsoft\apache-maven-3.2.2
         path    D:\devsoft\apache-maven-3.2.2\bin
     ④查看Maven版本信息验证安装是否正确
         C:\Windows\System32>mvn -v
         Apache Maven 3.2.2 (45f7c06d68e745d05611f7fd14efb6594181933e; 2014-06-17T21:51:42+08:00)
         Maven home: D:\devsoft\apache-maven-3.2.2\bin\..
         Java version: 1.7.0_07, vendor: Oracle Corporation
         Java home: D:\devsoft\jdk1.7.0_07\jre
         Default locale: zh_CN, platform encoding: GBK
         OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"


2.修改本地仓库
    ①默认本地仓库位置:~\.m2\repository
        ~表示当前用户的家目录,例如:C:\Users\[你当前登录系统的用户名]
    ②指定本地仓库位置的配置信息文件:apache-maven-3.2.2\conf\settings.xml
    ③在根标签settings下添加如下内容:<localRepository>[本地仓库路径,也就是RepMaven.zip的解压目录]</localRepository>

maven project 和Maven module区别 maven项目和java项目的区别_maven概念与安装_03


3.第一个Maven工程

    ①目录结构

  

Hello
         |---src
         |---|---main
         |---|---|---java
         |---|---|---resources
         |---|---test
         |---|---|---java
         |---|---|---resources
         |---pom.xml
    ②POM文件内容
 <?xml version="1.0" ?>
 <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.atguigu.maven</groupId>
     <artifactId>Hello</artifactId>
     <version>0.0.1-SNAPSHOT</version>    <name>Hello</name>
       
     <dependencies>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.0</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
 </project>
     ③编写主程序代码
         在src/main/java/com/atguigu/maven目录下新建文件Hello.java,内容如下
         package com.atguigu.maven;
         public class Hello {
             public String sayHello(String name){
                 return "Hello "+name+"!";
             }
         }
     ④编写测试代码
         在/src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java
         package com.atguigu.maven;    
         import org.junit.Test;
         import static junit.framework.Assert.*;
         public class HelloTest {
             @Test
             public void testHello(){
                 Hello hello = new Hello();
                 String results = hello.sayHello("litingwei");
                 assertEquals("Hello litingwei!",results);    
             }
         }
     ⑤运行几个基本的Maven命令
         mvn compile    编译
         mvn clean    清理
         mvn test    测试
         mvn package    打包
         ※注意:运行Maven命令时一定要进入pom.xml文件所在的目录!

 

4 eclipse中使用maven


1)、添加自己已经安装了的maven地址

maven project 和Maven module区别 maven项目和java项目的区别_众筹项目练习_04

maven project 和Maven module区别 maven项目和java项目的区别_apache_05

maven project 和Maven module区别 maven项目和java项目的区别_maven_06

 

2)、使用maven自带的配置文件;

maven project 和Maven module区别 maven项目和java项目的区别_maven_07

 

项目对象模型 Project Object Model;

pom.xml:是maven工程最重要的配置文件。在这个文件中声明了都导入哪些jar包;

 

<?xml version="1.0" ?>
<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">
     
    <!--pom模型标准版本 -->
    <modelVersion>4.0.0</modelVersion>
 
    <!-- groupId -->说明当前项目是哪个公司开发的;公司网址的反转
    <groupId>com.atguigu.maven</groupId>
     
     <!-- artifactId -->说明当前是什么模块;项目名;
    <artifactId>Hello</artifactId>
    
     <!-- version -->说明当前模块的版本号;
    <version>0.0.1-SNAPSHOT</version>
 
    <name>Hello</name>  工程名字
 
<!-- 指定要引入哪些jar包;
    <dependencies>

        <!-- 表示导入junit包 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

jar包的坐标;

- Maven坐标包含三个向量

①groupId:定义当前Maven项目所隶属的项目,通常为公司或组织的域名的倒序+项目名。例如:org.apache.commons

②artifactId:定义实际项目中的一个模块

③version:定义当前项目的当前版本

 

组织名+模块名+版本号就能定位到一个jar包;

我们需要告诉maven导入的jar包的这些信息;maven就会自动去下载这个jar包(如果没有)

 

5、eclispe默认创建的maven工程;默认是jre1.5,

修改一下maven的配置,让其默认创建jdk1.7及以上的工程!

1、找到maven 的配置文件(比如D:\maven\apache-maven-3.3.9\conf\settings.xml);

2、在标签  <profiles>  </profiles>中添加

        

<profile>
                 <id>jdk-1.7</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>

标签就可以啦!!!

我们以后导包步骤;

1、去网站maven respository查询jar包(比如webmvc)的坐标

maven project 和Maven module区别 maven项目和java项目的区别_众筹项目练习_08

maven project 和Maven module区别 maven项目和java项目的区别_apache_09

maven project 和Maven module区别 maven项目和java项目的区别_众筹项目练习_10

2、写在maven工程的pom.xml文件中

3、看到这个jar包以及他运行期间依赖的所有包全进来了;

 

 

Maven程序的下载地址:;下载后直接解压到无中文路径就可以使用,为了使用方便还上传了本地的maven库,免得什么都去远程下载;

 

pom:

Project Object Model:项目对象模型

Document Object Model:文档对象模型;

maven工程中有一个文件pom.xml

     (当前工程所有信息的描述文件)

     1、不仅描述当前工程是哪个组织哪个项目的哪个模块的哪个版本;

     2、当前项目要依赖其他什么jar包

     3、等等....

pom.xml在maven工程中的作用

web.xml在web工程中的作用

 

坐标:

每一个jar就是通过坐标进行定位;

<groupId>com.gome</groupId>:组织名反写;
在实际开发中;一般写  公司域名反写+项目名称

<artifactId>hello02</artifactId>
在实际开发中一般写模块名称;
以Spring的这些jar为例

本地仓库里面
本地仓库\org\springframework\spring-aop\4.0.0.RELEASE\存了jar包以及源码等....
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>4.0.0.RELEASE</version>

<version>0.0.1</version>
gav:jar包的坐标

 

仓库:

maven用来保存jar包的;

本地仓库:在自己电脑上的maven仓库;默认在用户目录/.m2/repository;

修改了本地目录;去maven的conf文件夹下的setting.xml

直接看有一个注释了的LocalRepository标签。把它打开;配置自己的仓库

私服:局域网范围的一个仓库;

远程仓库:

     maven的官方仓库在英国的一个中央仓库;

     镜像仓库:中央仓库的本地化;在某个国家本地有一个镜像;

maven自动下jar包的步骤;

     去本地仓库看------>私服------->中央仓库;

配置镜像仓库:

     在setting.xml中找到mirros标签,在他里面加上

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

maven project 和Maven module区别 maven项目和java项目的区别_maven概念与安装_11

 

麻烦的问题怎么解决:

1)、联网;

2)、如果报各种maven-plugins;

本地仓库的\org\apache\maven文件夹下把plugins整个删掉,让maven重新下载plugins

3)、一但有报错,看problems问题;如果发现有提示

     maven-->update project;

我们就在工程上右键,选中maven--->update project;

选中

maven project 和Maven module区别 maven项目和java项目的区别_maven_12

生命周期插件: 

mvn运行各种命令都是插件完成的;

比如 mvn clean;mvn compile;

 

每个生命周期的各个环节都是由各种插件完成
    - clean生命周期:清理工程:
①pre-clean 执行一些需要在clean之前完成的工作
②clean 移除所有上一次构建生成的文件
③post-clean 执行一些需要在clean之后立刻完成的工作
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building hello02 0.0.1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ hello02 ---
[INFO] Deleting F:\0325EE\hello02\target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.359 s
[INFO] Finished at: 2017-07-01T10:25:55+08:00
[INFO] Final Memory: 6M/121M
[INFO] ------------------------------------------------------------------------

          
    - Site生命周期:生成站点信息;
①pre-site 执行一些需要在生成站点文档之前完成的工作
②site 生成项目的站点文档
③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
④site-deploy 将生成的站点文档部署到特定的服务器上
          mvn site:帮我们生成站点的文档(站点信息,依赖..)
               
    - Default生命周期:
Default生命周期
Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-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将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
       
mvn clean:清理编译的项目
mvn compile:编译项目
mvn test:测试项目(运行测试类)
mvn package:负责将我们的项目打包
mvn install:将这个项目安装到仓库中;

我们尝试用eclipse运行maven命令出现这个问题; 

-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.

 解决办法:jre不知道maven的安装目录;设置jre运行参数

maven project 和Maven module区别 maven项目和java项目的区别_maven概念与安装_13

 

 依赖的范围(scope):

compile、编译范围

test、测试范围

provided、

maven project 和Maven module区别 maven项目和java项目的区别_xml_14

maven创建web工程;

web工程创建是选中war:

maven project 和Maven module区别 maven项目和java项目的区别_众筹项目练习_15

1)、创建一个普通maven工程 

maven project 和Maven module区别 maven项目和java项目的区别_maven概念与安装_16

2)、先掉对号,再打上对号;

maven project 和Maven module区别 maven项目和java项目的区别_xml_17

3)、自动生成web.xml 

maven project 和Maven module区别 maven项目和java项目的区别_apache_18

web工程还是在pom.xml中导包; 

maven-web工程一但创建jsp页面,或者写servlet都会报错;

maven project 和Maven module区别 maven项目和java项目的区别_众筹项目练习_19

原因:tomcat里面的jar包有解析jsp,servlet的类定义;

解决办法:

第一种)、绑定tomcat运行环境

maven project 和Maven module区别 maven项目和java项目的区别_apache_20

maven project 和Maven module区别 maven项目和java项目的区别_maven概念与安装_21

 

maven project 和Maven module区别 maven项目和java项目的区别_众筹项目练习_22

maven project 和Maven module区别 maven项目和java项目的区别_maven概念与安装_23

 

添加后可以用浏览器访问到index.jsp

第二种)、导入这些jsp、servlet、el表达式等要用的jar(这里推荐第二种)

这种方法也很简单,就是直接都让jsp、servlet的相关依赖,方法我们前边提到过,就是去Maven Repository网站搜索jsp需要的 jar包,添加到pom.xml文件中就可以了

maven project 和Maven module区别 maven项目和java项目的区别_xml_24

maven project 和Maven module区别 maven项目和java项目的区别_xml_25

 

maven project 和Maven module区别 maven项目和java项目的区别_apache_26

 

maven project 和Maven module区别 maven项目和java项目的区别_xml_27

 

maven project 和Maven module区别 maven项目和java项目的区别_众筹项目练习_28

 

问题也轻松的解决了,嘻嘻。。。

provided范围体验;

只有compile范围的jar包,在项目打包的时候才会带上,其他都不会;

非compile范围的包,maven在打包项目的时候,不会带上;runtime除外;

依赖的传递、排除、依赖原则;

1)、依赖传递

02工程依赖01工程;01工程自己所用的jar包,默认02工程也能用;

非compile范围的jar包不会依赖传递下去;

2)、依赖排除

<dependencies>
        <dependency>
            <groupId>com.atguigu.maven</groupId>
            <artifactId>maven-01</artifactId>
            <version>0.0.1-beta</version>
            <!-- 可以依赖这个jar的时候,将这个jar所依赖的其他包去除掉 -->
            <exclusions>
                <!-- 排除一个包 -->
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

3)、依赖原则?

maven project 和Maven module区别 maven项目和java项目的区别_apache_29

maven project 和Maven module区别 maven项目和java项目的区别_xml_30

maven project 和Maven module区别 maven项目和java项目的区别_xml_31

 

统一管理依赖的版本号;

我们可以先定义一个变量spring.version来统一管理版本号

<properties>
        <spring.version>4.3.9.RELEASE</spring.version>
</properties>

<dependencies>
        <!-- 导入spring的所有模块 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- 运行环境 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

    </dependencies>

 

继承

1、依赖:

工程的几个方式:

jar:打包成一个普通的jar

war:打包成一个web工程的war包

pom:当前工程不会被打包成什么,这个工程就是保存一些配置;

项目之间可以有父子关系;

子工程里面的配置可以是继承于父工程(父工程必须是pom形式);

父工程里面的东西子工程都是继承来的;

1、创建一个父工程

maven project 和Maven module区别 maven项目和java项目的区别_maven_32

2、注意点:

1、安装到仓库

1)、父子工程:先安装父,在安装子,否则报错

如果说我们要把子工程安装到maven仓库中,方便别人引用;

就必须先把父工程安装进仓库;

因为我们使用的是gav坐标,maven默认先从本地仓库找;

2)、工程依赖;

安装到仓库;先安装被依赖的这些包,再安装本工程;

 

聚合

1、在父工程里面写;聚合的子工程

<modules>
    <module>child01</module>
    <module>child02</module>
  </modules>

2、在子工程里面写;parent;说明当前是继承哪个父工程;

<parent>
    <groupId>com.atguigu.maven</groupId>
    <artifactId>parent01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>child02</artifactId>

3、聚合的好处:我们可以让maven打包或者部署的时候,自动解决依赖的先后顺序,这样我们只需要对父工程进行编译、清除、安装等操作,就不用先操作依赖工程了,maven会自动帮我们查找并添加依赖的工程;

后来开发;分模块开发;

某个模块;

user:

     子模块;

     子模块;

     子模块;

 

order:

     子模块;

     子模块;

     子模块;

 

manager:

     子模块;

     子模块;

     子模块;

----------------------------------------------------------------------------------

maven类似的项目构建工具(依赖管理)

maven,gradle,ant,xxx;