共计 7502 个字符,预计需要花费 19 分钟才能阅读完成。
Idea 操作 Maven 具体应用:
Maven 简介
什么是 Maven
Maven 的正确发音是 [ˈmevən] “ 卖 v ”,而不是“马瘟”以及其余什么瘟。
Maven 是一个项目管理工具,它蕴含了一个我的项目 对象模型(POM:Project Object Model)
,一组规范汇合。
Maven 能解决什么问题
现在咱们构建一个我的项目须要用到很多第三方的类库 Jar 包
如写一个应用 Spring 的 Web 我的项目就须要引入大量的 jar 包,
而往往一个 Jar 包往往又会援用其余 Jar 包,短少其中任何一个 Jar 包都会导致我的项目编译失败。
每开发一个我的项目都会须要大量的 Jar 包
, 一个一般的 Java 我的项目兴许理论源码只有几 MB 甚至 KB,但加上 Jar 之后兴许就几十 MB。
而同样的我的项目,如果咱们应用 Maven 工程来构建,那么总体上工程的大小会小很多。部署至服务器中 …
**Maven 就是一款帮忙程序员构建我的项目的工具,咱们只须要通知 Maven 须要哪些 Jar 包,
它会帮忙咱们 下载 / 提供 所有的 Jar
,极大晋升开发效率。**
Maven 的两个经典作用:
依赖治理 ~ 也就是治理 jar 包(波及仓库常识,上面会讲)~
Maven 的一个外围个性就是依赖治理。
当咱们波及到多模块的我的项目(蕴含成百个模块或者子项目),治理依赖就变成一项艰难的工作。Maven 展现出了它对解决这种情景的高度管制。
传统的 WEB 我的项目中,咱们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。
那么 maven 工程是如何使得工程变得很少呢?
Idea 常见一般 Maven 我的项目目录:
maven 工程中不间接将 jar 包导入到工程中,而是通过在 pom.xml 文件中增加所需 jar 包的坐标 。
这样就很好的防止了 jar 间接引入进来, 使工程变大🙃🙃🙃~
在须要用到 jar 包的时候,再通过 pom.xml 文件中的坐标
到一个专门用于”寄存 jar 包的仓库”(maven 仓库)中依据坐标从而找到这些 jar 包拿去运行。
而且过程并不需要放心 到仓库中找到 jar 包这样会影响程序性能:
maven 中也有索引的概念,通过建设索引,能够大大提高加载 jar 包的速度,
使得咱们认为 jar 包根本跟放在本地的工程文件中再读取进去的速度是一样的。
”寄存 jar 包的仓库”长什么样?仓库,顾名思义,也就是寄存一些我的项目必备的食粮(jar 包)的中央。
Maven 中仓库分为三类:
本地仓库:
寄存在本地服务器中,当运行我的项目的时候,maven 会主动依据配置文件查找本地仓库,再从本地仓库中调用 jar 包应用。
近程仓库(私服):
当本地仓库中没有我的项目所须要的 jar 包时,那么 maven 会持续查找近程仓库,个别近程仓库指的是公司搭建的公有服务器,也叫私服;
当 jar 包在私服中查找到之后,maven 会将 jar 包下载到本地仓库中,下次应用的时候就不必再去找近程仓库。
地方仓库:
当近程仓库获取不到 jar 包时,就须要到地方仓库去查找,并下载在近程仓库中,本地仓库再从近程仓库中下载回来应用。
** 此由 maven 团队保护,据说截止至 16 年,曾经有2 亿个包
在仓库中!
能够这么说,咱们须要的包所有起源都是地方仓库,并不需要放心没有 jar 包。**
一键构建
我的项目从编译、测试、运行、打包、装置、部署整个过程都交给 maven 进行治理,这个过程称为构建。
一键构建: 指的是整个构建过程, 应用 maven 几个命令能够轻松实现整个工作。
Maven 规范化构建流程如下:
这个目前晓得就好, 上面联合我的项目实例具体解说~ 感触;
IDEA 应用 Maven 工程:
我的 idea 是中文的, 而且版本 1.3 的有差别的同学多多了解~😄
留神!应用 Maven 工程最好要在有网的状况下, 对于一些组件 Jar 都是要联网下载的 …
首先 idea 配置 maven 的装置目录和本地仓库
Idea 每次创立一个新的 Maven 时候, 倡议看看, 不然本地资源库错了 Jar 乱放到处下载 … 并不好~
文件——设值——输入框输出 Maven
启动工程!!
创立 Maven 我的项目: ~ 文件—新建——我的项目~
Next (这里我先建一个一般的我的项目~理解 Maven 生命周期)
学习 web 的同学加载工程可能,会须要很长时间下载... 缓缓期待即可~ 晓得呈现 Src ** 网卡这种事件很无奈😥** Finish
这是我创立好的工程, 是不是感觉毛病什么。
Idea 的工具并不是很欠缺对于一些文件,创立并不残缺能够本人补全:根本就是上图的构造
手动在 test 文件下创立一个 resources 文件:并通过工具标识为 资源文件
但要留神: target
文件可不是手动创立的!!!Maven 我的项目生命周期主动生成的... 次要用于寄存:编译后的文件。
通过上述一系列操作, 其实就曾经创立出了一个惯例的 Maven 我的项目工程:
| |—-main 我的项目的次要代码的中央...
| | |—-java ————– 寄存我的项目的源文件
| | |—-resources ——寄存我的项目资源文件,如 spring, hibernate 配置文件
| |—-test 用于测试项目代码的, 目录相当于 Junit 的测试代码的目录
| | |—-java ————– 寄存所有测试.java 文件,如 JUnit 测试类
| | |—-resources ——寄存我的项目测试资源文件,如 spring, hibernate 配置文件
在 Main——Java 目录:下创立一个包 com.wsm 包下 Text.Jave
倡议肯定要加包!!
public class Text {public void show(){System.out.println("Hello World");
}
}
// 这是一个, 非常简单广泛的一段 Jave 代码~ 没人看不懂吧😄
在 Test——Java 目录:下创立一个包 com.wsm 包下 TTest.Jave
次要用于测试, 下面的源码是否能够失常运行 … 别想是不是有什么非凡性能就是这个!
import org.junit.Test;
public class TTest {// 类名必须,Test 结尾(我真是无语了不晓得这个调了良久..)
@Test //Junit 注解: 该办法进行单元测试,(须要 Junit 包~Pom.xml 引入 Jar 坐标)
public void testShwo(){ // 办法名倡议 test 结尾, 标准..
// 申明源码中的类, 并调用 show(); 测试后果~
Text t = new Text();
t.show();}
}
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/xsd/maven-4.0.0.xsd">
<!-- 指定以后 pom 模型的版本,maven2 和 3 都是 4 -->
<!-- Pom 文件能够用于解耦,最大水平辨别我的项目与我的项目之间的区别 -->
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId> <!-- 定义我的项目是哪个公司哪个部门组 -->
<artifactId>MavenWSM</artifactId> <!-- 组内的惟一 id(例如我的项目中的哪个组件: 模块名,Maven 能够实现模块开发~)-->
<version>1.0-SNAPSHOT</version> <!-- 我的项目以后版本,SNAPSHOT 为不稳固版本(疾速开发) -->
<!-- groupId artifactId version: 也决定了我的项目在打包 / 公布文件的款式 / 地址:本地仓库下 /org/example/MavenWSM/1.0-SNAPSHOT/MavenWSM-1.0-SNAPSHOT.jar -->
<name>WSM</name> <!-- 我的项目别名 -->
<packaging>jar</packaging> <!-- 我的项目打包产生的构件类型, 例如 jar、war、ear、pom... 罕用 Jar(默认) war -->
<!--Jar: 个别公司本人制作不便, 开发调用的组件 Jar... war: 我的项目打包成 war 能够部署至服务器中运行... 的格局; 这里不是 web 工程所以不须要 war jar 即可~ -->
<!-- 为 pom 定义一些常量,在 pom 中的其它中央能够间接援用 应用形式 如下:${project.build.sourceEncoding} -->
<properties>
<!-- 对立我的项目字符集编码: 底层援用了 ${project.build.sourceEncoding} 对立字符集 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 设值 jdk 编码, 该办法是指定我的项目的 JDK 版本 或 在 Maven settings.xml 中配置对立环境 JDK -->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 中寄存着所有依赖包的形容, 也就是提供下载的坐标 -->
<dependencies>
<!-- 每一个 dependency 形容一个 Jar 坐标: 去本地找————找不到去私服下载————在没有去地方仓库下载到私服到本地.. -->
<dependency>
<groupId>junit</groupId> <!-- 公司组 -->
<artifactId>junit</artifactId> <!-- 我的项目 /jar/ 模块名 -->
<version>4.9</version> <!-- 版本 -->
<scope>test</scope> <!-- Jar 包应用的范畴: 默认应用范畴是 compile, 则测试代码和主代码都能够应用该代码; -->
<!-- <scope>system</scope> <systemPath> 引入 Jar 资源门路...</systemPath> -->
</dependency>
<!-- 省略其它更多 Jar 包的坐标.... -->
</dependencies>
<!-- build Maven 的插件
该元素设置了我的项目源码目录, 当构建我的项目的时候, 构建零碎会编译目录里的源码。-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<!-- 和下面性能一样都是设值 JDK 的版本的~ 轻易设值一个即可; -->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Pom.xml 详解:这里我会不定时的扩大,更新的哟~
- dependencies——>dependency——>==scope 依赖范畴 ==
A 依赖 B,须要在 A 的 pom.xml 文件中增加 B 的坐标,增加坐标时须要指定依赖范畴,依赖范畴包含↓↓↓
compile:编译范畴, 默认范畴值,依赖会用在编译、测试、运行, 因为运行时须要所以编译范畴的依赖会被打包。
provided:编译范畴, provided 依赖在编译和测试时须要,在运行时不须要,比方:servlet api 运行时被 tomcat 容器提供。(抵触反而会报错!)
runtime:编译范畴, 依赖在运行和测试零碎的时候须要,但在编译的时候不须要。比方:jdbc 驱动包。
test:编译范畴, 在编译和运行时都不须要,它们只有在测试编译和测试运行阶段可用。比方:junit。
system:编译范畴, system 范畴依赖与 provided 相似, 应用本地之外的门路的 Jar 须要指定 systemPath 磁盘门路(不举荐!)- 坐标的起源形式:
从互联网搜寻: 1. http://search.maven.org/ 2.http://mvnrepository.com/
通过这种形式在也不必到处找 Jar 了间接来 Maven 中找到坐标下载到本地就能够用了!
从其它同学的本地库 cope 也是一种方法,间接将整个仓库 copy 过去, 更改一下 Setting 配置文件即可!
~
运行测试:应用 Maven 进行 一键构建
** 咱们能够间接在 cmd 中通过一系列的 maven 命令:** 来对咱们的 **MavenWSM 工程进行:** 清理 编译、测试、运行、打包、装置、部署。
找到我的项目工程的本地门路:
能够在 idea 工具中 cope 门路——Windows+r : 复制回车疾速关上文件;
在文件门路中输出 “cmd” 进行文件门路, 不便操作 Maven 命令;(或者也能够本人手动的 cd: 查找切换门路..)
Maven 常用命令
cmd 进入命令状态,执行 mvn compile,如下图提醒胜利:
compile 是 maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输入到 target 目录下。
这时你的我的项目中就会呈现 target 文件夹:编译好的代码 …
BUILD SUCCESS 编译胜利!
cmd 执行 mvn clean 会删除 target 目录及内容, 清理。
cmd 执行 mvn test 执行 src/test/java 下单元测试类
cmd 执行 mvn package 对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war 包。并且会蕴含 test 操作;
cmd 执行 mvn install 执行 install 将 maven 打成 jar 包或 war 包公布到本地仓库。蕴含 package 和 test 操作;
cmd 执行 mvn deploy 执行 deploy 将 maven 打成 jar 包或 war 包公布到本地仓库和私服中。蕴含 package test install 操作;
cmd 执行 mvn clean test 先清理在 test 测试 …
Idea 工具能够间接通过双击:对应的生命周期即可:
最终我的项目构造:
编写 Maven 我的项目, 倡议每一个 main 下源码是必须要有包的!因为我的项目 打包 package 公布 install… 是将 main 下的源文件打包~
如果其中有一个独自的文件, 没有一个指定的包, 则默认放在META-INF 目录下
学过 JSP 同学都晓得该目录下文件是只读的不可调的..
这就是 Maven 的一键构建。是不是超级有意思!!
Maven 操作 Web 工程:
请依照下面案例创立 web 工程:
如果创立过程太慢能够借鉴:创立时候加:archetypeCatalog | internal会快很多,要留神肯定要抉择对 Maven 模型
之后的大抵构造是这样的:
并不残缺, 还须要手动增加 src/main/jave 文件夹(并且要批改对应文件夹的类型,Jave 源文件类型 resource 资源文件类型 …)
最终 Web 构造:index.jsp
Idea 工具的默认 JSP,也并不符合规范, 这个就本人改改吧~
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> 第一个 maven 工程 </title>
</head>
<body>
Hello World!
</body>
</html>
之后就能够, 配置 Idea 的 Tomcat 通过 Maven 构建我的项目 Package war 包部署至我的项目中~ 即可;
ok,就酱! 不须要批改任何代码~Idea 启动服务则主动加载程序.
你在以后服务器中部署那些我的项目, 就能够执行那些我的项目, 即便你本地原先存在的我的项目但你没有部署 Idea 配置的服务器也是拜访不了的~
Maven 我的项目应用自定义的 jar
ok 到这儿 web 工程也就写完了.
至于自己在 main——java——com.wsm.Test——cs 是自己的测试 Demo
失常状况这里写的是:dao entity service comtroller…. 程序代码(SSM SSH),可别被自己凌乱了~
本次测试: 一个 Maven 我的项目引入另一个 Maven 我的项目程序:实现模块开发
pom.xml
加
<!-- 还记得这个吗? 一个一般的资源援用, 但!仔细观察, 这就是方才写的 组 模块名 版本...
Maven install 将我的项目打包 Jar 至本地, 其它 Maven 项即可间接 dependency 引入应用, 该项目标类 / 办法~
是不是感觉越来越高级了.... 当初曾经能够本人开发 Jar 不便日后开发应用了呢~
-->
</dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>MavenWSM</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
cs.java
import com.wsm.Text; // 这里的 com.wsm.Text 是引入我的项目的包, 如果没有包的话文件存在 MATE——INF 是无奈引入的!(所以倡议源码都放在包下~ 一种标准吧!)
public class CS {public static void main(String[] args) {// 创立自定义 Jar 包中的类对象, 调用办法();
Text text = new Text();
text.show();}
}
间接右击, run!“Hello World”
Maven 装置:
请单击.
最初的最初, 终于写完了,求个赞👍呀!