作者:啤酒大泡泡 \
起源:www.cnblogs.com/hzg110/p/6936101.html
前言:目前所有的我的项目都在应用 maven,可是始终没有工夫去整顿学习,这两天正好有工夫,好好的整顿一下。
一、为什么应用 Maven 这样的构建工具【why】
① 一个我的项目就是一个工程
如果我的项目十分宏大,就不适宜应用 package 来划分模块,最好是每一个模块对应一个工程,利于分工协作。借助于 maven 就能够将一个我的项目拆分成多个工程
② 我的项目中应用 jar 包,须要“复制”、“粘贴”我的项目的 lib 中
同样的 jar 包反复的呈现在不同的我的项目工程中,你须要做不停的复制粘贴的反复工作。借助于 maven,能够将 jar 包保留在“仓库”中,不论在哪个我的项目只有应用援用即可就行。
③ jar 包须要的时候每次都要本人筹备好或到官网下载
借助于 maven 咱们能够应用对立的标准形式下载 jar 包,标准
④ jar 包版本不统一的危险
不同的我的项目在应用 jar 包的时候,有可能会导致各个我的项目的 jar 包版本不统一,导致未执行谬误。借助于 maven,所有的 jar 包都放在“仓库”中,所有的我的项目都应用仓库的一份 jar 包。
⑤ 一个 jar 包依赖其余的 jar 包须要本人手动的退出到我的项目中
FileUpload 组件 ->IO 组件,commons-fileupload-1.3.jar 依赖于 commons-io-2.0.1.jar
极大的节约了咱们导入包的工夫老本,也极大的减少了学习老本。借助于 maven,它会主动的将依赖的 jar 包导入进来。
二、maven 是什么【what】
① maven 是一款服务于 java 平台的自动化构建工具
make->Ant->Maven->Gradle
名字叫法:咱们能够叫妹文也能够叫麦文,然而没有叫妈文的。
② 构建
构建定义:把动静的 Web 工程通过编译失去的编译后果部署到服务器上的整个过程。
编译:java 源文件 [.java]-> 编译 ->Classz 字节码文件 [.class]
部署:最终在 sevlet 容器中部署的不是动静 web 工程,而是编译后的文件
③ 构建的各个环节
- 清理 clean:将以前编译失去的旧文件 class 字节码文件删除
- 编译 compile:将 java 源程序编译成 class 字节码文件
- 测试 test:自动测试,主动调用 junit 程序
- 报告 report:测试程序执行的后果
- 打包 package:动静 Web 工程打 War 包,java 工程打 jar 包
- 装置 install:Maven 特定的概念 —– 将打包失去的文件复制到“仓库”中的指定地位
- 部署 deploy:将动静 Web 工程生成的 war 包复制到 Servlet 容器下,使其能够运行
三、装置 maven
① 以后零碎是否配置 JAVA_HOME 的环境变量
② 下载 maven,解压 maven 放在一个非中文无空格的门路下
③ 配置 maven 的相干环境变量
- 在环境变量减少 M2_HOME,门路是 maven 解压后的根目录
- 在环境变量里的 path 中减少 maven/bin 的目录
④ 验证:maven -v 查看 maven 版本
看到版本信息,祝贺你曾经 OK 了。
四、第一个 maven
① 创立约定的目录构造 (maven 工程必须依照约定的目录构造创立)
[1] 根目录:工程名
[2] |---src:源码
[3] |---|---main: 寄存主程序
[4] |---|---|---java:java 源码文件
[5] |---|---|---resource:寄存框架的配置文件
[6] |---|---test:寄存测试程序
[7] |---pop.xml:maven 的外围配置文件
咱们依照下面的文件夹目录构造手动创立一下,不必任何 IDE 环境(手动的其实最有助于咱们了解 maven)
文件内容如下
在 src/main/java/com/hzg/maven 目录下新建文件 Hello.java,内容如下
package com.hzg.maven;
public class Hello {public String sayHello(String name){return "Hello"+name+"!";}
}
POM 文件内容:
<?xml version="1.0" ?>
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hzg.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
② 罕用 maven 命令
- mvn clean:清理
- mvn compile:编译主程序
- mvn test-compile:编译测试程序
- mvn test:执行测试
- mvn package:打包
- mvn install:装置
执行 maven 命令必须进入到 pom.xml 的目录中进行执行
进入到我的项目的 pom.xml 目录之后,就能够执行啦。
1、运行 mvn compile
OK,运行结束,你在 pom.xml 配置的依赖的包曾经导入到仓库了,问题来了, 仓库默认的地位在哪?
仓库的默认地位: c:\Usrs[登录以后零碎的用户名].m2\repository
方才执行完 compile 之后,之前的文件夹产生了变动
咱们发现 Hello 我的项目里里多了一个 target 文件夹。文件夹的内容为:
发现 target 里次要寄存的就是编译后的字节码文件
2、运行 mvn test-compile,target 文件夹上面除了 classes 之外多了 test-classes 文件夹
3、运行 mvn package,target 文件夹上面又多了一个打好的 jar 包
4、运行 mvn clean,发现整个 target 文件夹都没了。又回到了编译之前咱们手动创立的文件夹
五、仓库和坐标
① pom.xml: Project Object Model 我的项目对象模型。它是 maven 的外围配置文件,所有的构建的配置都在这里设置。
② 坐标: 应用上面的三个向量在仓库中惟一的定位一个 maven 工程
③ maven 工程的坐标与仓库中门路的关系:
maven 坐标和仓库对应的映射关系:groupIdversion-[version].jar
去本地仓库看一下此目录:org\springframework\spring-core\4.3.4.RELEASE\spring-core-4.3.4.RELEASE.jar
果然是齐全对应的(默认仓库地址下面说过了哦,不要说不晓得在哪,没事上面咱们再说一下仓库)
④ 仓库
仓库的分类:
1、本地仓库: 以后电脑上的仓库,门路上曾经说过了哦
2、近程仓库:
- 私服:搭建在局域网中,个别公司都会有私服,私服个别应用 nexus 来搭建。具体搭建过程能够查问其余材料
- 地方仓库:架设在 Internet 上,像方才的 springframework
六、依赖
① maven 解析依赖信息时会到本地仓库中取查找被依赖的 jar 包
- 对于本地仓库中没有的会去地方仓库去查找 maven 坐标来获取 jar 包,获取到 jar 之后会下载到本地仓库
- 对于地方仓库也找不到依赖的 jar 包的时候,就会编译失败了
② 如果依赖的是本人或者团队开发的 maven 工程,须要先应用 install 命令把被依赖的 maven 工程的 jar 包导入到本地仓库中
举例:当初我再创立第二个 maven 工程 HelloFriend,其中用到了第一个 Hello 工程里类的 sayHello(String name) 办法。咱们在给 HelloFriend 我的项目应用 mvn compile 命令进行编译的时候,会提醒短少依赖 Hello 的 jar 包。怎么办呢?
到第一个 maven 工程中执行 mvn install 后,你再去看一下本地仓库,你会发现有了 Hello 我的项目的 jar 包。一旦本地仓库有了依赖的 maven 工程的 jar 包后,你再到 HelloFriend 我的项目中应用 mvn compile 命令的时候,能够胜利编译
③ 依赖范畴
scope 就是依赖的范畴
1、compile, 默认值,实用于所有阶段(开发、测试、部署、运行),本 jar 会始终存在所有阶段。
2、provided, 只在开发、测试阶段应用,目标是不让 Servlet 容器和你本地仓库的 jar 包抵触。如 servlet.jar。
3、runtime, 只在运行时应用,如 JDBC 驱动,实用运行和测试阶段。
4、test, 只在测试时应用,用于编译和运行测试代码。不会随我的项目公布。
5、system, 相似 provided,须要显式提供蕴含依赖的 jar,Maven 不会在 Repository 中查找它。
七、生命周期
Maven 有三套互相独立的生命周期,请留神这里说的是“三套”,而且“互相独立”,初学者容易将 Maven 的生命周期看成一个整体,其实不然。这三套生命周期别离是:
① Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 Clean 生命周期一共蕴含了三个阶段:
- pre-clean 执行一些须要在 clean 之前实现的工作
- clean 移除所有上一次构建生成的文件
- post-clean 执行一些须要在 clean 之后立即实现的工作
② Default Lifecycle 构建的外围局部,编译,测试,打包,部署等等。
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并解决资源文件,至目标目录,筹备打包
- compile 编译我的项目的源代码
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources 复制并解决资源文件,至指标测试目录
- test-compile 编译测试源代码
- process-test-classes
- test 应用适合的单元测试框架运行测试。这些测试代码不会被打包或部署
- prepare-package
- package 承受编译好的代码,打包成可公布的格局,如 JAR
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包装置至本地仓库,以让其它我的项目依赖。
- deploy 将最终的包复制到近程的仓库,以让其它开发人员与我的项目共享
那咱们在 Hello 的我的项目中执行 mvn install 命令,通过日志看看两头经验了什么?
通过日志咱们发现,其实执行 mvn install,其中曾经执行了 compile 和 test。
总结: 不管你要执行生命周期的哪一个阶段,maven 都是从这个生命周期的开始执行
插件: 每个阶段都有插件(plugin),看下面标红的。插件的职责就是执行它对应的命令。
③ Site Lifecycle 生成我的项目报告,站点,公布站点。
- pre-site 执行一些须要在生成站点文档之前实现的工作
- site 生成我的项目的站点文档
- post-site 执行一些须要在生成站点文档之后实现的工作,并且为部署做筹备
- site-deploy 将生成的站点文档部署到特定的服务器上
八、Eclipse 中应用 maven
①、配置
抉择菜单 windows–>preferences(参数)–>maven
抉择 Installations(装置),增加你本人下载并解压好的 maven 目录。并打上对勾 √,点击 Apply(利用)
再抉择 User Settings 目录,在 User Settings 中抉择 Browse(浏览),抉择你本人 maven 里的 conf 下的 settings.xml 文件。
插一句:settings.xml 这个配置文件,次要是配置你本地仓库的门路的。不想应用默认门路,就关上文件,加上本人的门路配置。
<localRepository>C:\Program Files\Java\repository</localRepository>
到此,maven 整个的设置就 OK 了。
② 应用 Eclipse 创立 maven 的 Web 工程
1、抉择菜单 File–>new –>project,输出 maven
抉择 Maven Project,点击 Next
点击 Next
输出 webapp,选中第一项,点击 next
我的项目就创立实现了,然而 jdk 的版本还有 sevlet-api 等 jar 包还没有
抉择创立好的工程单击右键,抉择 properties 并找到 Java Build Path,把 jdk 的版本抉择你电脑上的正确的 jdk 版本。
抉择创立好的工程单击右键,抉择 properties 并找到 Project Facets,版本抉择 3.1,上面的 java 版本抉择 1.8,点击 Apply
抉择创立好的工程单击右键,找到 build path
找到 Libaries,增加 Tomcat8.5 的依赖库,点击 OK
九、maven 工程的依赖高级个性
① 依赖的传递性
WebMavenDemo 我的项目依赖 JavaMavenService1 JavaMavenService1 我的项目依赖 JavaMavenService2
pom.xml 文件配置好依赖关系后,必须首先 mvn install 后,依赖的 jar 包能力应用。
- WebMavenDemo 的 pom.xml 文件想能编译通过,JavaMavenService1 必须 mvn install
- JavaMavenService 的 pom.xml 文件想能编译通过,JavaMavenService2 必须 mvn install
传递性:
在 Eclipse 中,为 JavaMavenService2 中减少了一个 spring-core.jar 包后,会惊喜的发现依赖的两个我的项目都主动的减少了这个 jar 包,这就是依赖的传递性。
留神:非 compile 范畴的依赖是不能传递的。
② 依赖版本的准则:
1、门路最短者优先准则
Service2 的 log4j 的版本是 1.2.7 版本,Service1 排除了此包的依赖,本人加了一个 Log4j 的 1.2.9 的版本,那么 WebMavenDemo 我的项目恪守门路最短优先准则,Log4j 的版本和 Sercive1 的版本统一。
2、门路雷同先申明优先准则
这种场景依赖关系产生了变动,WebMavenDemo 我的项目依赖 Sercive1 和 Service2,它俩是同一个门路,那么谁在 WebMavenDemo 的 pom.xml 中先申明的依赖就用谁的版本。
③ 对立治理依赖的版本:
为了对立治理版本号,能够应用 properties 标签,外面能够自定义版本的标签名。在应用的中央应用 ${自定义标签名}
十、build 配置
<build>
<!-- 我的项目的名字 -->
<finalName>WebMavenDemo</finalName>
<!-- 形容我的项目中资源的地位 -->
<resources>
<!-- 自定义资源 1 -->
<resource>
<!-- 资源目录 -->
<directory>src/main/java</directory>
<!-- 包含哪些文件参加打包 -->
<includes>
<include>**/*.xml</include>
</includes>
<!-- 排除哪些文件不参加打包 -->
<excludes>
<exclude>**/*.txt</exclude>
<exclude>**/*.doc</exclude>
</excludes>
</resource>
</resources>
<!-- 设置构建时候的插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- 源代码编译版本 -->
<source>1.8</source>
<!-- 指标平台编译版本 -->
<target>1.8</target>
</configuration>
</plugin>
<!-- 资源插件(资源的插件)-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>compile</phase>
</execution>
</executions>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- war 插件 (将我的项目打成 war 包) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- war 包名字 -->
<warName>WebMavenDemo1</warName>
</configuration>
</plugin>
</plugins>
</build>
配置好 build 后,执行 mvn package 之后,在 maven 工程指定的 target 目录里 war 包和文件都依照配置的生成了
好了,maven 的所有的内容就整顿完了。
最初举荐个最新最全的 maven 依赖项版本查问网站:
http://mvnrepository.com/
近期热文举荐:
1.1,000+ 道 Java 面试题及答案整顿 (2022 最新版)
2. 劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.Spring Boot 2.6 正式公布,一大波新个性。。
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!