Maven笔记

Maven

Struts Spring MyBatis

做一个项目,首先需要各个jar包的下载,先到Struts 2官网下载Struts 2 jar包,在到Spring官网下载Spring jar包,还有MyBatis jar包,以及第三方的jar包。在项目还没有开始的时候就已经有了很多的jar包,有用的,没用的,版本冲突的,所以在这个时候出现了优秀的开源的项目管理。

Maven Antgradle优秀的项目管理


Maven快速入门————介绍及环境搭建

Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

登录官网https://maven.apache.org/,下载maven.bin的压缩文件,下载后解压打开。打开apache-maven-3.5.4下的bin文件夹,里面有可以运行的mvn脚本,boot目录包含了一个类加载器的框架,conf下是配置文件的目录,lib下有所有的类库。接下来配置环境变量。

右键我的电脑,属性,选择“高级系统设置”,点击环境变量。在“系统变量”中新创建一个,名为“M3_HOME”,变量值为apache-maven-3.5.4的路径。点击Path,编辑“%M3_HOME%\bin”。点击确定。打开终端,输入“mvn -v”,即可查看电脑所有的信息,配置成功的话就可以看到maven的版本信息。

目录结构

 

常用的构建命令介绍:
mvn -v 查看maven版本
    compile 编译
    test 测试
    package 打包项目

    clean 删除target
    install 安装jar包到我们的目录


自动创建目录骨架:
archetype插件:用于创建符合maven规定的目录骨架

maven规定:
src
    -main
        -java
            -主代码(com.sycu.项目名.作者.包名)

src
    -test
        -测试代码(用来进行测试)


创建目录的两种方式:
1、archetype:generate 按照提示进行选择
2、archetype:generate -DgroupId=组织名,公司网址反写+项目名
                    -DartifactId=项目名-模块名
                    -Dversion=版本号
                    -Dpackage=代码所存在的包名


maven中的座标和仓库
    座标        构建
    所有的构建均通过座标作为其唯一标识

    其中groupId、artifactId、version都是组成项目基本的座标

    仓库:用来管理依赖,分成 本地仓库 和 远程仓库 两种

    maven为我们提供了一个超级pom,在lib下maven-model-builder.XXX.jar中,这里面的pom-XXX.XML,是所有的pom都会继承这个pom

    maven全球中央仓库的地址 url:https://repo.maven.apache.org/maven2

    镜像仓库:maven/conf/settings.xml
    第152行可以看到有mirror
    <mirror>
      <id>maven.net.cn</id>
      <mirrorOf>central</mirrorOf>//这里可以指定仓库名,也可以使用通配符 * 来匹配所有的镜像,一旦配置镜像,所有针对原仓库的访问都会转到镜像仓库,那么原仓库就不能再继续访问
      <name>central mirror in china</name>
      <url>http://maven.net.cn/content/groups/public</url>
    </mirror>

    更改仓库位置:
    maven从远程仓库下载 构建,默认是存放在当前的用户目录中 C:\Users\Administrator\.m2
    最好是不要存放在C盘中,要是重做系统,那么这些数据就会消失
    在别的盘下创建一个文件夹repo,然后打开conf下的settings.xml文件,
    在53行出找到<localRepository>/path/to/local/repo</localRepository>,把他复制粘贴出来,修改成刚才repo的文件夹路径,同时把\替换成/,
    例如:<localRepository>D:/mavenworkspace/repo</localRepository>

    修改成功之后,把settings.xml文件复制到repo文件夹下,然后打开终端,进入到一个项目中,再次输入mvn clean compile,敲回车就OK了。

在Eclipse中安装maven插件以及创建maven项目
    到网站上下载插件,m2e  https://download.csdn.net/download/zk461759809/8817869
    下载好后放在安装eclipse目录下的dropins目录下即可。
    然后打开安装eclipse的文件夹,下面有一个eclipse.ini的文件,打开,在第11行下(也不一定),添加行输入:
    -vm
    C:\Java\jdkXXXXXXX(安装jdk的jdk下的bin文件夹路径)\javaw.exe
    随后打开eclipse->windows->Preferences
    点击Java->Installed JREs。  在这里要选择jdk的安装路径
    点击Maven->Installations。  点击Add,选择maven的安装路径,勾选中,ok
    点击Maven->UserSettings。   User Settings下选择repo下的settings.xml文件

    随后创建一个maven项目,创建完成之后,打开pom.xml,可以发现跟我们之前写的是一样的。
    接着在pom.xml文件上右键,Run As -> Maven build...   再Goals中写入compile就可以编译,在控制台上就可以看到有BUILD SUCCESS,这就完成搭建了。
    如果出现错误:-Dmaven.multiModuleProjectDirectory system propery is not set. XXXXXXXXXXXXXXXXXXXXXX,
    那么打开eclipse->windows->Preferences->Java->Installed JREs,点击jdk,edit,在Default VM arguments中写入:-Dmaven.multiModuleProjectDirectory=$M3_HOME(自己配置的环境变量的名)



Maven的生命周期和插件                                                                                                                                                                        
    之前使用过clean、compile、test、package、install                                                                                               
    一个项目完整的构建过程包括:                                                                                                                                                    
        清理、编译、测试、打包、集成测试、验证、部署
    maven和插件密不可分:maven抽象出一套项目构建的生命周期。而插件是对抽象进行实现。
    maven中定义了三套生命周期:1、clean      清理项目
                            2、default     构建项目
                            3、site        生成项目站点
    这三套生命周期是相互独立的,每个生命周期都包含一些阶段,各个生命周期中的阶段都是有顺序的,且后面的阶段依赖于前面的阶段,执行某一个阶段时,其前面的阶段会顺序执行,但不会触发另外两套生命周期的任何阶段。

    clean清理项目
        pre-clean   执行清理前的工作
        clean       清理上一次构建生成的所有文件
        post-clean  执行清理后的文件

    default构建项目(最核心)
        compile test package install(最为常用,不常用的还有很多)

    site生成项目站点
        pre-site     在生成项目站点前要完成的工作
        site         生成项目的站点文档
        post-site    在生成项目站点后要完成的工作
        site-deploy  发布生成的站点到服务器上    使用source插件:
    <build>
          <plugins>
              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-source-plugin</artifactId>
                  <version>2.4</version>
                  <executions>
                      <execution>
                          <phase>package</phase>
                          <goals>
                              <goal>jar-no-fork</goal>
                          </goals>
                      </execution>
                  </executions>
              </plugin>
          </plugins>
      </build>
      打包的时候系统会自动的进行测试以及打包
                                                                                                                                                                                          
pom.xml是项目的核心管理文件,用于描述、组织管理、依赖管理、构建信息的管理                                             
pom.xml包含了很多的标签                                                                                                                                                                



!!!pom.xml常用的标签!!!      |
<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>com.imooc.hi</groupId>                                                                             
  <!-- 项目名+模块名 -->                                                                                        
  <artifactId>hi</artifactId>
  <!-- 第一个0表示大版本号
          第二个0表示分支版本号
          第三个0表示小版本号
          0.0.1
          snapshot 快照
          alpha    内部测试
          beta     公测
          Release  稳定
          GA       正式发布 -->
  <version>0.0.1-SNAPSHOT</version>
  <!-- 打包方式,默认是jar。
         还有 war zip pom-->
  <packaging>jar</packaging>

  <!-- 项目描述 -->
  <name>hi</name>
  <!-- 项目地址 -->
  <url>http://maven.apache.org</url>
  <!-- 
      项目描述
  <description></description>
      开发人员信息
  <developers></developers>
      许可证的信息
  <licenses></licenses>
      组织信息
  <organization></organization>
  -->
  
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- 依赖列表 -->
  <dependencies>
    <!-- 依赖项 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <!-- 依赖范围 
              test是只有在test测试的范围内有用-->
      <scope>test</scope>
      <!-- 设置依赖是否可选
              里面有true和false
              默认是false
              子项目如果默认是false,子项目默认是继承的
              如果是true,子项目必须写入引用给依赖
      <optional></optional>
      
                  排除依赖传递的列表
      <exclusions>
        <exclusion>
        </exclusion>
      </exclusions>
      <
      -->
    </dependency>
  </dependencies>
  
  <!--
           依赖的管理
      <dependencyManagement>
          <dependencies>
              里面有很多的依赖类表,但是并不会被运行,不会被引入到实际的依赖中。
              这个标签一般是被定义在父模块中的,供子模块所继承用的
          </dependencies>
      </dependencyManagement>
  -->
  
  <build>
    <!-- 插件的列表,可以包含多个plugin -->
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-source-plugin</artifactId>
              <version>2.4</version>
              <executions>
                  <execution>
                      <phase>package</phase>
                      <goals>
                          <goal>jar-no-fork</goal>
                      </goals>
                  </execution>
              </executions>                                                                                    
          </plugin>                                                                                            
      </plugins>                                                                                                
  </build>                                                                                                    
  <!-- 通常用于子模块在父模块中的pom的继承                                                                        
  <parent></parent> -->                                                                                        
  <!-- 用来聚合多个的maven项,可以在module中指定多个模块进行编译                                                    
  <modules>                                                                                                   
      <module>                                                                                                
      </module>                                                                                                
  </modules> -->                                                                                            
</project>                                                                                                    



依赖范围                                                                                                                                                
    <scope>test</scope>                                                                                                                                
    三种classpath:1、编译 2、测试 3、运行                                                                                                                 

    6种scopes
    1、compile:如果没有指定,那么就默认的范围,编译测试运行都有效
    2、provided:在编译和测试时有效,在最后运行的时候不会被加入
    3、runtime:在测试和运行时有效
    4、test:只在测试范围内有效
    5、system:在编译和测试时有效,因为与本地相关联,所以有很大的不可移植性
        可能将项目移动到别的电脑上,会因为路径不一致,而导致错误
    6、import:导入的范围,他只是用在dependencyManagement中,表示从其他的pom中导入dependency的配置

依赖的传递
    在依赖列表中加入一个dependency
    <dependencies>
        <!-- 依赖项 -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          添加上要依赖的标识
          <groupId>com.imooc.XXX</groupId>
          <artifactId>XXX-XXX</artifactId>
          <version>0.0.1-SNAPSHOT</version>
        </dependency>
      </dependencies>
排除依赖
    如果C依赖于B,B依赖于A,那么C就间接性的依赖于A
    但是现在不想让C依赖于A,那么就需要排除依赖
    在dependency依赖项中加入exclusions
    <dependencies>
        <!-- 依赖项 -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          添加上要依赖的标识
          <groupId>com.imooc.XXX</groupId>
          <artifactId>XXX-XXX</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <exclusions>
              <exclusion>
                  <groupId>com.imooc.A</groupId>
                  <artifactId>XXX-A</artifactId>
              </exclusion>
          </exclusions>
        </dependency>
      </dependencies>
    这样就不会依赖于A了

另:想要每新建的项目JRE都是固定的版本号,那么比较简单的方法就是打开maven安装路径下的settings文件,在182行左右,可以看到有profiles,然后输入一段代码:
    <profile>
      <id>jdk-1.8</id>

      <activation>
          <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
      </activation>

      <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
      </properties>
    </profile>
    这样在新建项目的时候就会都变成1.8


依赖冲突:有A和B依赖了一个不同版本的相同构建,对于依赖A B 和 C来说,他究竟依赖的是A和B的哪一种构建?

用来搜索新的依赖下载
https://www.mvnrepository.com

    这里有两条原则:1、短路优先(它会优先解析这个路径短的版本)
                    例子:A->B->C->X(jar)
                            A->D->X(jar)      √                                                                                                        
                        那么它会优先解析下面路径短的版本                                                                                                
                2、先声明先优先(如果路径长度相同,则谁先声明,先解析谁)                                                                                  



聚合和继承                                                                                                                                                        
    聚合是将多个项目整合在一起进行,比如install,避免了分开式的操作,那么在pom.xml中写入:                                                                                |
    <modules>                                                                                                                                                    
        <module>../hongxing-bg</module>                                                                                                                            
        <module>../hongxing-ng</module>                                                                                                                            
        <module>../hongxing-sj</module>                                                                                                                            
    </modules>                                                                                                                                                    
                                                                                                                                                               
    继承                                                                                                                                                            
    要使用继承需要有一个父类的项目,在这个项目中是不需要有main和test的,所以可以将其删除掉,打开pom,在依赖项的外层加一个dependencyManagement,这样就可以被继承了。            
    其中dependency下的version可以放在properties下                                                                                                                    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <junit.version>3.8.1</junit.version>
        </properties>
    然后在dependency下的version中修改成<version>${junit.version}</version>
    最终是以下代码:
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <junit.version>3.8.1</junit.version>
        </properties>
        
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>${junit.version}</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

    随后在子类中dependency下的version和scope去掉,在上面加入parent的标签,parent下是继承的座标粘贴过来:
        <parent>
            <groupId>com.hongxing</groupId>
            <artifactId>hongxing-parent</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    最终子类的代码就是:
        <parent>
            <groupId>com.hongxing</groupId>
            <artifactId>hongxing-parent</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
            <dependency>                                                                                                                                        
                <groupId>commons-io</groupId>                                                                                                                    
                <artifactId>commons-io</artifactId>                                                                                                                
                <version>2.4</version>                                                                                                                            
            </dependency>                                                                                                                                       
        </dependencies>                                                                                                                                            
 



使用maven构建web项目
在最开始创建的web项目中,index.jsp是错误的,因为没有Servlet API的缘故,现在在网站中(https://www.mvnrepository.com)搜索servlet。
启动服务有两种形式:1、jetty 2、Tomcat
                    1、在https://www.mvnrepository.com中搜索jetty maven plugin字样进行搜索,然后选取版本号进行粘贴
                    好用的内容如下:
                     <groupId>org.mortbay.jetty</groupId> 
                     <artifactId>jetty-maven-plugin</artifactId> 
                     <version>8.1.16.v20140903</version>
                     在启动服务的时候输入:jetty:run,同时也可以在打包的时候启动服务,那么需要在build下添加plugins、plugin、executions、execution标签。代码为:
                     <plugins>
                        <plugin>
                            <!-- jetty服务进行启动 <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> 
                                <version>8.1.16.v20140903</version> -->
                            <groupId>org.apache.tomcat.maven</groupId>
                            <artifactId>tomcat7-maven-plugin</artifactId>
                            <version>2.2</version>
                            <executions>
                                <execution>
                                    <!-- 在打包成功后使用jetty:run来运行jetty服务 -->
                                    <phase>package</phase>
                                    <goals>
                                        <goal>run</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                    添加好之后就可以输入clean package进行打包并启动服务了。


                    2、在https://tomcat.apache.org中,左侧有一个Maven Plugin,点击进去选择一个版本粘贴,内容如下:
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章