1、Maven主要做了两件事:
- 统一开发规范与工具
- 统一管理jar包
2、使用maven构建一个普通Java项目之后的目录结构:
可以看到使用Maven构建的普通Java项目,对源代码、单元测试代码、资源乃至后续需要的文件都有专门的目录规划。还有一个pom.xml。
- main目录下是项目的主要代码,test目录下存放测试相关的代码
- target:存放编译输出后的代码
- src/main/java下存放Java代码,src/main/resources下存放配置文件
- 这里没有webapp,Web项目会有webapp目录,webapp下存放Web应用相关代码
- pom.xml,这是Maven的核心配置文件
3、打包、依赖、仓库:
1、packing
项目打包的类型,可以使jar、war、rar、ear、pom,默认是jar
2、dependencies和dependency
说到这里,就有一个本地仓库和远程仓库的概念了。
(1)本地仓库:
默认情况下,不管在Window还是Linux下,每个用户在自己用户目录下都有一个路径名为.m2/repository/的仓库目录。还有一个settings.xml主要内容是描述仓库配置,仓库连接代理等具体参数等。如果你想自定义本地仓库目录地址。你可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址,例如:
这样,该用户的本地仓库地址就被设置成了 D:\java\repository\。
(2)远程仓库 - 中央仓库:
由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置。中央仓库包含了这个世界上绝大多数流行的开源Java构件,以及源码、作者信息、SCM,信息、许可证信息等,每个月这里都会接受全世界Java程序员大概1亿次的访问,它对全世界Java开发者的贡献由此可见一斑。
中央仓库可以使用国内的镜像,国外的中央仓库用起来太慢了,推荐国内的阿里云镜像。镜像利用<mirrorOf>来配置。
(3)远程仓库 - 私服:
(4)本地仓库和远程仓库的调用:
本地仓库和远程仓库的调用是这样的:Maven工程先从本地仓库中获取jar包,当无法获取指定jar包时,本地仓库会从自动从远程仓库(中央仓库)中下载jar包,并放入本地仓库以备将来使用。
注:重新下载Maven工程所依赖的jar包、导入jar包都需要触发Maven工程的build workspace,那么如何才能触发Maven工程的build workspace?
答:找到一个pom.xml,随便修改一下,加一个空格、减一个空格什么的,ctrl+s保存一下,便会触发Maven工程的build workspace了
4、Maven的3个基本周期
clean、default和site,其中每个周期各包含几个阶段,常用的是clean周期里的clean和default周期里的install,执行install时会自动执行package生成jar文件。
~~~~~~~~~~~~~~~~
在项目pom.xml目录下,执行命令:
mvn clean(目的是清理编译过程中多余的文件)
然后执行:mvn:install
成功后可以看到target目录下生成了jar文件。
Maven生成WAR包时自动更新版本号version 插件:buildnumber-maven-plugin
5、Maven常用命令及其快捷操作
mvn clean:表示运行清理操作(会默认把target文件夹中的数据清理)。
mvn clean compile:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
mvn clean test:运行清理和测试。
mvn clean package:运行清理和打包。
mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
mvn clean deploy:运行清理和发布(发布到私服上面)。
上面的命令大部分都是连写的,也可以拆分分别执行。
注:在Intellj idea中有快捷操作,
在工程的Lifecycle下有package,选择这个将会打包,打包出来的jar会放在target下。将jar包放在桌面,在Windows下使用cmd命令窗口: java -jar ****.jar,就可以运行刚刚打出来的jar包了。因为intellj idea内置了Tomcat,在打包的时候也放在了jar里面,所以命令行运行的时候也无需配置Tomcat了。
如图:
6、Maven常用POM属性
${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/.
${project.build.testSourceDirectory}:项目的测试源码目录,默认为/src/test/java/.
${project.build.directory}:项目构建输出目录,默认为target/.
${project.build.outputDirectory}:项目主代码编译输出目录,默认为target/classes/.
${project.build.testOutputDirectory}:项目测试代码编译输出目录,默认为target/testclasses/.
${project.groupId}:项目的groupId.
${project.artifactId}:项目的artifactId.
${project.version}:项目的version,于${version}等价
${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}${project.version}.