Maven学习之maven简介

我爱海鲸 2022-03-03 11:34:46 暂无标签

简介maven的作用以及相关概念

1、开发过程中遇到的问题

   1、都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行?
   2、为什么在我的机器上可以正常打包,而配置管理员却打不出来?
   3、项目组加入了新的人员,我要给他说明编译环境如何设置,但是让我挠头的是,有些细节我也记不清楚 了。
   4、我的项目依赖一些jar包,我应该把他们放哪里?放源码库里?
   5、这是我开发的第二个项目,还是需要上面的那些jar包,再把它们复制到我当前项目的svn库里吧
   6、现在是第三次,再复制一次吧。 ----- 这样真的好吗?
   7、我写了一个数据库相关的通用类,并且推荐给了其他项目组,现在已经有五个项目组在使用它了,今天我 发现了一
         个bug,并修正了它,我会把jar包通过邮件发给其他项目组 -----这不是一个好的分发机制,太多 的环节可能导致出
         现bug
   8、项目进入测试阶段,每天都要向测试服务器部署一版。每次都手动部署,太麻烦了。

2、什么时Maven

   Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项 目管理工
具。Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目 信息管理。

   Maven主要有两个功能:

      - 项目构建

      - 依赖管理

3、什么是构建

4、 项目构建的方式

   Eclipse

   手工操作较多,项目的构建过程都是独立的,很难一步完成。比如:编译、测试、部署等。 开发时每个人的IDE配置都不
同,很容易出现本地代码换个地方编译就出错

   Ant

   Ant只是一个项目构建工具,它没有集成依赖管理。 Ant在进行项目构建时,它没有对项目目录结构进行约定,需要手动
指定源文件、类文件等目录地址。同时它 执行task时,需要显示指定依赖的task,这样会造成大量的代码重复。

   Maven

   - Maven不仅是一个项目构建工具,更是一个项目管理工具。它在项目构建工程中,比ant更全面,更灵活。
   - Maven在进行项目构建时,它对项目目录结构拥有约定,知道你的源代码在哪里,类文件应该放到哪里去。
   - 它拥有生命周期的概念,maven的生命周期是有顺序的,在执行后面的生命周期的任务时,不需要显示的配 置前面任
      务的生命周期。例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程

5、Maven配置时pom.xml文件的说明

   一个pom.xml文件展示

  

project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qf.mr</groupId>
<artifactId>wordcount</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 项目名字 -->
<name>wordcount</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!-- 基本常用变量定义 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- hadoop 包版本 -->
<hadoop.version>2.7.1</hadoop.version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.9</log4j.version>
</properties>
<dependencies>
<!-- junit所依赖jar包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!-- jdk.tools 依赖jar包 -->
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.7</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
<!-- hadoop-common 依赖jar包 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
<scope>provided</scope>
</dependency>
<!-- hadoop-hdfs 依赖jar包 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
<scope>provided</scope>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
</dependencies>
<!-- maven构建的环境设置 -->
<build>
6.2 pom.xml常用元素介绍
Maven中的project 包含的一些约束信息
6.3 对scope包依赖范围的说明
6.3.1 依赖范围
maven中三种classpath:编译,测试,运行 1.compile:默认范围,编译测试运行都有效 2.provided:在编译和测
试时有效 3.runtime:在测试和运行时有效 4.test : 只在测试时有效 5.system : 在编译和测试时有效,与本机系统
关联,可移植性差
6.3.2 注意范围
<!-- 插件管理 -->
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be
moved to parent pom) -->
<!-- 插件列表 -->
<plugins>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

6、pom.xml常用元素介绍

   Maven中的project 包含的一些约束信息

      modelVersion : 指定当前pom的版本
      groupId :(主项目标示,定义当前maven属于哪个项目,反写公司网址+项目名)
      artifactId : (实际项目模块标识,项目名+模块名)
      version(当前项目版本号,第一个0标识大版本号,第二个0标示分支版本号,第三个0标识小版本号,0.0.1,
      snapshot快照,alpha内部测试,beta公测,release稳定,GA正式发布)
      properties : 一些常用属性的声明(包括依赖的版本号,编码,资源位置等)
      name : 项目描述名
      url : 项目地址
      description : 项目描述
      developers : 开发人员列表
      licenses : 许可证
      organization:组织
      dependencies:依赖列表
      dependency:依赖项目 里面放置坐标
      scope:包的依赖范围
      optional :设置依赖是否可选
      exclusions:排除依赖传递列表
      dependencyManagement : 依赖的管理
      build:为构建行为提供支持
      plugins:插件列表
      parent:子模块对父模块的继承
      modules:聚合多个maven项目

7、对scope包依赖范围的说明

   依赖范围

maven中三种classpath:编译,测试,运行 1.compile:默认范围,编译测试运行都有效 2.provided:在编译和测
试时有效 3.runtime:在测试和运行时有效 4.test : 只在测试时有效 5.system : 在编译和测试时有效,与本机系统
关联,可移植性差

   注意范围

问题描述:maven scope 'provided' 和 ‘compile’的区别 2.1 解释 其实这个问题很简单。 对于scope=compile的情况
(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact(模块)对应的jar包在classpath中。 而
对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。换句话说,它只影
响到编译,测试阶段。在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,而在运行阶段,假定目
标的容器(比如我们这里的liferay容器)已经提供了这个jar包,所以无需我们这个artifact对应的jar包了。
2.2 实例(scope=provided) 比如说,假定我们自己的项目ProjectABC 中有一个类叫C1,而这个C1中会import这
个portal-impl的artifact中的类B1,那么在编译阶段,我们肯定需要这个B1,否则C1通不过编译,因为我们的
scope设置为provided了,所以编译阶段起作用,所以C1正确的通过了编译。测试阶段类似,故忽略。 那么最后
我们要吧ProjectABC部署到Liferay服务器上了,这时候,我们到$liferay-tomcat-home\webapps\ROOT\WEBINF\lib下发现,里面已经有了一个portal-impl.jar了,换句话说,容器已经提供了这个artifact对应的jar,所以,我
们在运行阶段,这个C1类直接可以用容器提供的portal-impl.jar中的B1类,而不会出任何问题。
2.3 实际插件的行为 刚才我们讲述的是理论部分,现在我们看下,实际插件在运行时候,是如何来区别对待
scope=compile和scope=provided的情况的。 做一个实验就可以很容易发现,当我们用maven install生成最终的
构件包ProjectABC.war后,在其下的WEB-INF/lib中,会包含我们被标注为scope=compile的构件的jar包,而不会
包含我们被标注为scope=provided的构件的jar包。这也避免了此类构件当部署到目标容器后产生包依赖冲突

你好:我的2025