Maven概述
为什么使用Maven?
在未使用Maven工具时也可以创建项目,只不过在开发中可能存在的问题有:
-
一个项目就是一个工程
创建一个项目,在包下写具体的代码,可能分service包,handler包等等,若是多个模块可能就是多个这样的重复包,显得项目特臃肿。这时不适合使用package来划分模块。而一般我们企业中的JavaEE项目,更多的是一个项目小组负责某个模块,如果能将庞大的项目分成一个个小模块,每个小组负责一个模块,相当于一个工程,就分工明确,效率更高了
利用之前的技术没办法将一个项目分成多个工程,多个模块,并且这多个模块之间还要互相访问,不能彻底独立,之间没沟通,这时可以借助Maven来将一个项目拆分成多个工程。
-
项目中需要的jar包必须手动“复制”,“粘贴”到WEB-INF/lib目录下
可能同样的jar包文件重复出现在不同的项目工程中,一方面浪费存储空间,另外也让项目比较臃肿
借助Maven,可以将jar包仅仅保存在仓库中,有需要使用的工程“引用”这个文件接口,并不需要真的把jar包复制过来。
-
jar包需要别人替我们准备好,或到官网下载
不同技术的官网提供的jar包下载的形式也是五花八门的;
有些技术的官网就是通过Maven或SVN等专门的工具提供下载的
以不规范的方式下载的jar包,其中的内容也有可能不规范
而借助Maven可以以一种规范的方式下载jar包,因为所有知名框架或第三方工具的jar包按照统一规范存放在了Maven的中央仓库中。
-
jar包往往不是孤立存在的,一个jar包依赖的其他的jar包也需要自己手动加入到项目中。
典型例子,文件上传,commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar,如果没有IO包,FileUpload包就不能正常工作。如果所有的jar包之间的依赖关系都需要程序员自己清楚地了解,就会增加学习成本
Maven会将依赖的jar包全部导入进来。
Maven是什么?
Maven是一款服务于java平台的自动化构建工具。
构建
概念:以“java源文件”,“框架配置文件”,“JSP”,“HTML”,“图片”等资源为“原材料”,去“生产”一个可以运行的项目的过程。
编译,java源文件>编译>Class文件>交给JVM去执行;
部署:
一个BS项目最终运行的并不是动态web工程本身,而是这个动态web工程“编译的结果”;需要通过浏览器访问java程序时必须将包含java程序的web工程编译的结果拿到服务器上,并启动服务器才行,这个拿的过程叫部署。
开发过程中,所有的路径或配置文件中配置的路径等都是以编译结果的目录结构为准的。
eclipse工具里src下存放的是源代码,即.java文件,build目录下存放的是编译后的.class文件。
创建动态web工程时,一定要有运行时环境,没有Apache Tomcat的这个环境的话,servlet的jar包可能就不支持,这两个其实是一组jar包的引用,并没有把jar包本身复制到工程中,所以不是目录。
eclipse中Servers下的Tomcat Server,右键,选择Browse Deployment Location插件,回到盘符中,将同名项目弄到eclipse中进行对比。
插件安装,tc_server整个目录复制到eclipse解压安装目录下的dropins目录下即可
构建过程中的各个环节:
- 清理:将先前编译得到的.class文件删除,为下次编译做准备;
- 编译:将java程序编译成class字节码文件
- 测试:自动测试,自动调用junit程序
- 报告:测试程序执行的结果
- 打包:动态web工程打war包,java工程打jar包
- 安装:被打包得到的文件复制到"仓库"中的指定位置
- 部署:将动态web工程生成的war包复制到servlet容器的指定目录下,使其可以运行
安装Maven核心程序
-
maven本身也是java所写的,需要运行在java虚拟机中,所以首先需要通过检查JAVA_HOME环境变量,找到jdk安装在哪里
-
解压maven的核心程序的压缩包,最好放在一个非中文无空格的路径下,减少不必要的麻烦
-
配置maven的环境变量
D:\JAVA\apache-maven-3.6.2\bin
-
运行mvn -v命令查看Maven版本
Maven核心概念
约定的目录结构
创建约定的目录结构
- 根目录: 工程名
- ---------src 源码
- ----------------main 存放主程序
- -------------------------java 存放java源文件
- -------------------------resources 存放框架的配置文件或其他资源
- -----------------test 存放测试程序
- -------------------------java
- -------------------------resources
- --------pom.xml Maven工程的核心配置文件
为什么要遵守约定的目录结构
- maven要负责项目的自动化构建,以编译为例,maven要想自动进行编译,那么必须知道java源文件保存在哪里
- 如果自定义的东西想让框架或工具知道,有两种方式
- 以配置的方式明确告诉框架
- 遵守框架的约定
- 约定 > 配置 > 编码
POM
坐标
maven使用如下几个要素来唯一定位某一输出物:groupId,artifactId,packaging,version.具体介绍如下:
1.groupId
团体,公司,小组,项目或者其他团体。团体标识的约定是以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个com.sonatype开头的groupId,而Apache Software的项目有以org.apache开头的groupId。
2.artifactId
在groupId下的表示一个单独项目的唯一标识符。比如我们的tomcat,commons等。注意不要在artifactId中包含点号(.)
3.version
一个项目的特定版本发布的项目有一个固定的版本标识来指向该项目的某一个特定版本。而正在开发中的项目可以用一个特殊的标识。则这种标识给版本加上一个”SNAPSHOT”的标识。虽然项目的打包格式也是maven坐标的重要组成部分,但是它不是唯一标识符的一个部分。一个项目的groupId,artifactId,version使之成为一个独一无二的项目,你不能同时有一个拥有同样的groupId,artifactId,version标识的项目。
4.packaging
项目的类型,默认为jar。描述了项目打包后的输出,类型为jar的项目产生一个jar文件,类型为war的项目产生一个web应用。
5.classifier
很少使用的坐标。
也可参考maven坐标元素描述
仓库
首先介绍一下,maven仓库分为三种。本地仓库,第三方仓库和中央仓库。本地仓库就是从第三方仓库或者下载下来的在你本地的目录里。
为什么要搭建私库,其实主要就是因为在团队开发中同一个项目依赖的项目肯定也都相同。有时候网络不稳定,去中心库下载依赖文件的话,可能很费时。而且如果没有配置私有库的话,每个人都要去中心库下载一次,比较影响效率。因此,如果有了私有库的话,我们依赖的文件,先会在私有库中查找一下,如果有的话就从私有库去下载。如果私有库还不包含所需要依赖的文件的话,私有库会先去中心库去下载,然后本地库再去私有库进行下载。
常用maven命令
注意
执行与构建过程相关的maven命令,必须进入pom.xml所在的目录
常用命令
- mvn clean 清理
- mvn compile 编译主程序
- mvn test-compile 编译测试程序
- mvn test 执行测试
- mvn package 打包
发现一篇更详细的文章,这里给出原文,在这呢