maven基础知识学习总结

https://github.com/laker1/maven-learning-notes 

一、Maven下载:http://maven.apache.org/download.cgi
二、插件目录结构:
bin目录:包含mvn的运行脚本,在命令行中用mvn可调用
boot目录:包含一个类加载器的框架,Maven使用它来加载主流类库
conf目录:配置文件目录,常用的有settings.xml
lib目录:依赖类库

三、配置环境变量:
M2_HOME:D:\JAVA\apache-maven-3.5.4
Path:%M2_HOME%\bin;
验证:命令行下输入:mvn -v

四、maven项目的目录结构:
src
    -main
        -java
            -package
    -test
        -java
            -package
    resources
pom.xml

五、pom.xml文件
可采用struts的lib目录下struts2-core-2.2.3.jar包解压后的META-INF/maven/org.apache.struts/struts2-core/pom.xml文件作为pom.xml的模板:

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
    // 基本4要素
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.imooc.maven01</groupId> // 项目的包名
    <artifactId>maven01-model</artifactId> // 模块名
    <version>0.0.1SNAPSHOT</version> // 版本名
    
    <dependencies>
        <dependency>  // 从中央仓库添加junit依赖
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>  // 从本地仓库添加jar包依赖
            <groupId>com.imooc.maven02</groupId>
            <artifactId>maven02-model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    
</project>

六、常用命令
编译:mvn compile
测试:mvn test
打包:mvn package
删除:mvn clean   删除target(包含编译的字节码文件和测试报告),但不删除本地仓库
安装:mvn install 安装jar包到本地仓库中(包含了compile和package过程)


用插件生成maven项目目录结构:
方式一:mvn archetype:generate 自动生成maven目录结构(需按提示录入选项)
方式二:mvn archetype:generate -DgroupId=com.imooc.maven04 -DartifactId=maven04-demo -Dversion=0.0.1-SNAPSHOT -Dpackage=com.imooc.maven04.demo

groupId表示组织名(公司网址反写+项目名)
artifactId表示项目名(项目名-模块名)
version表示版本号
package代码所存在的包名


<!--设置镜像中央仓库为阿里云-->
<mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</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中的坐标和仓库

构件:任何一个依赖、插件、项目构件输出都可以称之为构件,所有构件都通过坐标作为其唯一标识。
maven中,任何构件坐标都是由groupId、artifactId、version来唯一标识的
建议创建maven项目时,java的包名应该与pom.xml中groupId和artifactId命名相吻合

仓库:用来管理和存放所有项目的构件和依赖。可分两种:本地仓库和远程仓库(包括中央仓库和其它镜像仓库)
如果本地仓库找不到就会去中央仓库查找,查找到依赖就会下载到本地仓库供我们使用
一旦设置镜像仓库,所有对原仓库的访问都将转到镜像仓库访问,原默认仓库将不会再被访问

超级pom.xml:在maven的安装目录下/lib/maven-model-builder-3.5.4.jar包
解压后在 org\apache\maven\model 目录中有一个pom.xml,所有maven项目都会继承这个超级pom
它含有中央仓库的地址

更改本地仓库默认位置:
默认:【本地仓库目录 ———— c:/user/用户名/.m2/repository】
修改本地仓库默认位置方法:
在maven安装目录找到conf/settings.xml文件,添加修改如下:
<localRepository>D:/JAVA/repo</localRepository>
建议:将该文件修改后保存到本地仓库中,以防maven升级后设置被覆盖

八、eclipse配置Maven项目
preference->Java->Installed JREs选择自已下载的JDK
          ->Maven->Installations选择自己下载的Maven
          ->Maven->User Settings选择自已设置的目录(不一定要用在maven安装目录的conf下那个)
File->New->Maven Project新建一个maven项目
鼠标在项目的pom.xml文件上右键->Run As->Maven build...弹出框中:Goals框中输入命令 compile或package即可编译或生成包    
      
九、maven三个生命周期
clean:清理项目
    pre-clean    clean    post-clean
default:构建项目(最核心)
    compile test package install
site:生成项目站点
    pre-site    site    post-site    site-deploy

十、关于maven插件示例:http://maven.apache.org/plugins/maven-source-plugin/
build中使用的插件是执行命令用的,也放在中央仓库中,其坐标定位方式和dependency一样
jar-no-fork主要用来创建项目的源码jar包,绑定到生命周期package后,运行package,调用目标,生成source.jar的源码包
  <build>  
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-source-plugin</artifactId>
              <version>3.0.1</version>
              <executions>
                  <execution>
                      <phase>package</phase>
                      <goals>
                          <goal>jar-no-fork</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
      </plugins>
  </build>
★可能遇到的问题:参考 https://blog.csdn.net/lslk9898/article/details/73836745
1、Preference->Java->Installed JREs应选择jdk目录(不是jre目录)  
2、Build Path->Configure Build Path->Libraries->JRE System Library
    ->"Edit"->Alternate JRE:选择第1步中的jdk目录
3、Maven->Update project(应该放在第2步,因为更新maven后,原第2步设置会被还原)

十一、pom.xml解析
<groupId></groupId>
<artifactId></artifactId>
<version></version> // 大版本号.分支版本号.小版本号
                    // snapshot快照  alpha测试  beta公测  release稳定  ga正式发布
<packaging>jar</packaging>
// 打包类型默认是jar,还有war,zip,pom等类型
<name></name> // 项目描述名
<url></url> // 项目地址
<description></description>
<developers></developers>
<licenses></licenses>
<organization></organization>
<dependencies>
    <dependency>
        ...坐标3要素
        <type></type>
        <scope>test</scope> // 指依赖范围,test表示用于测试范围
        <optional></optional>
// 设置依赖是否可选,默认是false,表示子项目是继承的,若为true,子项目必须显式引用该依赖
        <exlusions> // 排除依赖传递的列表
            <exclusion></exclusion>
        </exclusions>
    </dependency>
</dependencies>
<dependencyManagement> // 依赖管理坐标组件的版本号
    <dependencies>
        <dependency></dependency>
// 不会被运行(不会被引入到实际的依赖),主要用来定义在父模块中,让子模块来继承
    </dependencies>
</dependencyManagement>
<build> // 主要用来对构件的行为提供插件支持
    <plugins>
        <plugin>
            ...坐标3要素
            <executions></executions> // 行为定义管理
        </plugin>
    </plugins>
</build>
<parent>...坐标3要素</parent> // 通常用于指定当前子模块对父模块的pom的继承
<modules> // 用来聚合运行多个maven项(指定多个模块一起编译)
    <module></module>
</modules>

十二、依赖范围
共有6种,
compile: 默认范围,编译测试运行都有效
provided: 在编译和测试时有效
runtime: 在测试和运行时有效
test: 只有测试时有效,比如junit
system: 同provided,但与本机系统相关联,可移植性差
import: 只能用于<dependencyManagement>标签中,表示从其它pom中继承过来的依赖

十三、依赖传递与依赖冲突
1、短路优先
2、如果路径长度相同,则谁先声明,先解析谁


十四、聚合和继承

A、聚合操作:
新建hongxing-aggregation的maven项目(供自身用)
1、pom.xml中的<package>改为pom类型
2、添加<modules>标签
<modules>
      <module>../hongxing-bge</module>
      <module>../hongxing.nge</module>
      <module>../hongxing-shanji</module>
  </modules>
3、Run as->maven build->compile

B、继承操作:
新建hongxing-parent的maven项目(供子项目用)
1、父项目pom.xml中的<package>改为pom类型
2、父项目中添加<dependencyManagement>标签管理所有子项目的依赖(直接包裹原<dependencies>标签即可)
注意:并不实现引入,因此子项目仍需要显式声明需要用到的依赖
3、父项目中可统一管理子项目依赖的版本属性:
a、将父项目的pom.xml文件中:<properties>中添加属性<junit.version>3.8.1</junit.version>,
将junit的依赖的版本属性替换为<version>${junit.version}</version>,统一管理版本
b、将子项目的junit依赖中的<version>和<scope>删除,保留<groupId>和<artifactId>即可,
这样子项目就继承了父项目的版本,如果子项目需要另外的一个版本,只需要声明<version>就可
4、子项目中添加<parent>标签指明父项目的坐标:
<parent>
    <groupId>com.hongxing</groupId>
    <artifactId>hongxing-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
5、将父项目中的src/test/java目录删除掉,以免报错(因为不需要测试目录)


十五、补充部分
1、当子项目声明一个依赖(必须描述groupId和artifactId信息),如果groupid和artifactId以外的一些信息没有被描述,则通过groupId和artifactId匹配到父类的依赖,并使用这里的依赖信息。

2、POM是最简单的打包类型。不像一个JAR,SAR,或者EAR,它生成的构件只是它本身。
没有代码需要测试或者编译,也没有资源需要处理。打包类型为POM的项目的默认目标
生命周期阶段        目标
package             site:attach-descriptor
install             install:install
deploy              deploy:deploy
注意:pom 项目里没有java代码,也不执行任何代码,只是为了聚合工程或传递依赖用的。

3、dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。
这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改 ;另外如果某个子项目需要另外的一个版本,只需要声明version就可。

4、其实继承的作用远不止如此,子项目继承父项目的东西还很多,如下:
groupId :项目组 ID ,项目坐标的核心元素;  
version :项目版本,项目坐标的核心元素;  
description :项目的描述信息;  
organization :项目的组织信息;  
inceptionYear :项目的创始年份;  
url :项目的 url 地址  
develoers :项目的开发者信息;  
contributors :项目的贡献者信息;  
distributionManagerment :项目的部署信息;  
issueManagement :缺陷跟踪系统信息;  
ciManagement :项目的持续继承信息;  
scm :项目的版本控制信息;  
mailingListserv :项目的邮件列表信息;  
properties :自定义的 Maven 属性;  
dependencies :项目的依赖配置;  
dependencyManagement :醒目的依赖管理配置;  
repositories :项目的仓库配置;  
build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;  
reporting :包括项目的报告输出目录配置、报告插件配置等。  

猜你喜欢

转载自blog.51cto.com/maplebb/2312355
今日推荐