Maven
笔记是根据视频 https://www.bilibili.com/video/BV1Fz4y167p5 做的学习记录,有不清楚的地方可以参考视频
1.1.Maven的四大特性
1.1.1.依赖管理系统
Maven并不是写死的引用,是可以根据自身需要随意修改的
示例代码如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
</dependencies>
上面的groupId arifactId version都是可以根据自身需要随意修改的
groupId:Maven项目隶属的实际项目和公司名称
artifactId:Maven模块-项目名
version:对应的版本号
1.1.2.多模块构建
Maven将一个项目分为多个模块
1.1.3.一致的项目结构
统一了目录结构,在IDEA和eclipse中创建的Maven项目是通用的
1.1.4.一致的构建模型和插件机制
2.Maven的目录结构
Maven的基本目录结构是src->main->java和src->test
一般在main中存储要上交的代码,而在test中存放要测试的代码
3.修改本地仓库和更改镜像
首先要配置Maven,Maven的配置可以参考 https://blog.youkuaiyun.com/m0_50292871/article/details/119175964
3.1.修改本地仓库
本地仓库中的所有jar包等都可以被Maven文件共享
在解压的maven包中找到conf中的settings.xml文件。用记事本打开后,搜索localRepository。将代码
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>D:\WorkingSpace\Maven\projects</localRepository>
-->
中的
<localRepository>D:\WorkingSpace\Maven\projects</localRepository>
提出,中间的路径修改成你自己建立的仓库路径(文件夹),建议不要存在C盘,因为jar包累积后较大。修改后将这段代码复制到注解外面,变为
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>D:\WorkingSpace\Maven\projects</localRepository>
-->
<localRepository>D:\WorkingSpace\Maven\projects</localRepository>
3.2更改镜像
由于Maven会自动帮助下载资源,而默认的资源都在国外的服务器上,因此我们可以使用阿里云中的镜像来加快下载速度
同样的,在settings.xml中搜索mirror
<!-- mirrors
| This is a list of mirrors to be used in downloading artifacts from remote repositories.
|
| It works like this: a POM may declare a repository to use in resolving certain artifacts.
| However, this repository may have problems with heavy traffic at times, so people have mirrored
| it to several places.
|
| That repository definition will have a unique id, so we can create a mirror reference for that
| repository, to be used as an alternate download site. The mirror site will be the preferred
| server for that repository.
|-->
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
</mirrors>
在最下面的前添加
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
4.手动编译Maven
以下列maven01为例进行配置
首先 在maven中创建一个Hello类路径为D:\WorkingSpace\Maven\projects\maven01\src\main\java\com\demo\Hello.java
可以先构建Hello.txt 在里面输入java代码后更改后缀
创建后,在maven01路径下,双击路径,标蓝后输入cmd自动执行小黑框
在小黑框中输入命令 mvn compile 对maven进行编译 如果没有出现ERROR和BUILD FAILURE
就继续输入命令 mvn exec:java -Dexec.mainClass=“com.demo.Hello” 对Hello.java中的main方法进行编译 如果没有出现ERROR
如果失败了 就从以下三方面进行思考
1.未使用管理员权限执行
2.JDK环境配置有问题,需要重装
3.在输入路径时包名出错了,上方第二个命令的路径实质是包名(xom.demo)+类名(Hello)
5.Maven下的常用命令
5.1.常用命令格式
命令 | 描述 |
---|---|
mvn -version | 显示版本信息 |
mvn clean | 清理项目生产时的临时文件 |
mvn compile | 编译源代码 |
mvn package | 项目打包工具,在target目录下生成jar或war等文件 |
mvn test | 测试命令 |
mvn install | 将打包的文件复制到本地仓库中供其他模块使用 |
mvn depioy | 将打包的文件发布到远程参考,供其他人员进行依赖下载 |
mvn site | 生成项目相关的信息的网站 |
mvn eclipse:eclipse | 将项目转化为eclipse项目 |
mvn dependency:tree | 打印出项目的整棵依赖树 |
mvn archetype:generate | 创建Maven的普通java项目 |
mvn tomcat7:run | 在tomcat容器中运行web应用 |
mvn jetty:run | 调用Jetty插件的Run目标在Jetty Servlet 容器中启动web应用 |
5.2.命令参数
5.2.1.-D 传入属性参数
如mvn package -Dmaven.test.skip=true 是指将maven.test.skip这个属性赋值为true,即在打包时跳过测试文件
5.2.2.-P 使用指定的Profile配置
在项目开发过程之中,会有许多的不同环境,包括本地,测试,开发,正式等等等等,每个环境都会有不同的profile配置,那么在使用Maven时,我们就要指定不同的环境
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>qa</id>
<properties>
<env>qa</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>pre</id>
<properties>
<env>pre</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
例如mvn package -Pdev -Dmaven.test.skip=true 就是指定了dev这个环境
6.在IDEA中集成的Maven项目
1.在File->setting中搜索Maven
2.在Maven home path中选择自己解压的maven路径
例如 D:/WorkingSpace/Maven/apache-maven-3.8.1
3.在User setting file中勾选Override,并选择上述maven路径下 conf 文件夹中的 settings.xml
例如 D:\WorkingSpace\Maven\apache-maven-3.8.1\conf\settings.xml
7.Java项目的创建
如果创建时发现没有src目录请查看另一篇博客:(5条消息) 使用IDEA创建maven项目却没有src目录的问题_Days_of_April的博客-优快云博客_idea创建maven项目没有src目录
简单地说就是先不要选择quickstart进行创建,就直接创建完,等maven第一次加载完再进行quickstart的创建
7.1.创建步骤
切记,maven的很多内容是现场下载的,发现目录缺失请不要着急,等待几分钟等maven自己全部加载完
1.在File中new一个Project,其中选择Maven对象,首先是在不勾选Create from archetype的情况下,进行一次普通创建并让其加载完所有的内容(直接一按到底,其中的路径等参照后面的方法即可)
2.并勾选Create from archetype,再在下方选择后缀为quickstart的文件
3.选择你自己的GroupId和ArtifactId
一般GroupId是com.xxx xxx可以是自己的名字也可以是公司的名字
ArtifactId是自动生成的项目名
4.在下一步中,IDEA仍然会让你选择maven路径,你可以直接根据上面设置好的进行
5.创建完后一定要等maven加载完,要有耐心
7.2.创建resource目录
1.首先,在main目录和test目录下分别创建一个以resources命名的directory
在这里可以直接点击下面的resources,就可以忽略后续步骤
2.若没有上图所示,在main目录下的resources就需要右键创建好的resources选择Mark Directory as中的resources boot
3.在test目录下的resources就需要右键创建好的resources选择Mark Directory as中的Test resources boot
7.3.编译项目
1.点击右上角的Add Configuration
2.点击+并选择Maven
3.在Comman line中输入你想要执行的命令,不需要再加上mvn,因为此处已经明确是Maven项目,点击Apply再点击OK
4.设置好后点击Add Configuration右边的小三角或虫子即可编译。这与eclipse中的意义是一样的,一个代表普通编译,一个代表调试编译 compile命令执行完后会在左侧红色的target目录中生成.class文件
5.若是package命令 则会在target中生成jar包
6.也可以在右侧Maven中选用常用的命令
8.Web项目的创建
8.1.创建步骤
Java中的模板是quickstart,Web中的模板则是webapp 其余一致
创建出来后会有一个index.jsp文件 这是与Java项目不同的地方
8.2.修改部分内容
8.2.1.修改JDK版本至1.8
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
8.2.2.设置单元测试版本至4.12
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
8.2.2.删除pluginManagement
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
8.2.3.添加Web部署的插件(两种常用的服务器)
将下列两段代码分别添加到plugins内部
1.Jetty插件
<!--设置在plugins标签中-->
<plugin>
<!-- jetty插件, 设定端口与context path -->
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<!-- 热部署,每10秒扫描一次 -->
<scanIntervalSeconds>10</scanIntervalSeconds>
<!-- 此处为项目的对外访问路径 -->
<contextPath>/Web03</contextPath>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<!--此处配置了访问的端口号 端口号不得写1-1024-->
<port>9090</port>
</connector>
</connectors>
</configuration>
</plugin>
2.Tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- 此处为项目的对外访问路径 -->
<path>/Web03</path>
<!--此处配置了访问的端口号 -->
<port>8081</port>
<!--字符集编码 -->
<uriEncoding>UTF-8</uriEncoding>
<!--服务器名称 -->
<server>tomcat7</server>
</configuration>
</plugin>
添加完后会报红,就需要点击右侧Maven中的循环按钮进行下载
8.3.启动项目
1.加载
与Java项目一致,需要点击右上角的Add Configuration,选择Maven,但在原先Command line处写jetty:run命令
若是tomcat,就在Command line处写tomca7:run
2.启动
jetty:run命令执行后点击右侧绿色三角形,下方会显示加载好的端口
[INFO] Started SelectChannelConnector@0.0.0.0:9090
tomcat7:run命令执行后会告诉是在哪个端口下执行的
[INFO] Running war on http://localhost:8081/Web03
以jetty为例,在浏览器中输入http://localhost:9090/Web03/index.jsp 就可以查询index.jsp中输出的内容
8.4.自由确定端口
1.将指定端口的代码整个注释掉
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<!--此处配置了访问的端口号 -->
<port>9090</port>
</connector>
2.在Add Configuration中重新写一个Maven
在命令中不再单单输入jetty:run.而是输入jetty:run -Djetty.port=8899 其中8899就是端口的名字
9.Maven仓库的基本概念
9.1.Maven仓库的分类
对于Maven来说,仓库只有远程仓库和本地仓库。远程仓库中涵盖着可供下载的核心插件和jar包等等。本地仓库则包含着所有原先在此电脑上加载过的插件等,可供所有在这个电脑上运行的Maven文件使用。若在远程和本地仓库中都不存在所需要的文件,就会报错。
远程仓库的概念:中央仓库、私服、其他公共库
中央仓库:
中央仓库是默认配置下,Maven下载jar包的地方。由于刚开始运行Maven时,电脑本地仓库是空的,就需要从中央仓库中去下载。
私服:
私服是为了节省带宽和时间,在局域网内架设的一个私有仓库服务器。其可代理外部的远程仓库,也可将内部的项目部署到私服上供其他项目使用。也可以从本地上传一些无法从外部获取的构件
其他公共库:
例如阿里云仓库
9.2.如何去找寻依赖文件
1.在网页中搜索mvn
2.点击Maven Reposity
3.在里面搜索自己想要的文件内容并选择文件版本
4.点击后复制内部代码
5.加入到pom.xml的相关位置中
10.Maven环境下构建多模块项目
将Maven划分成多个模块,既有利于下载,也可以根据自己的需要选择特定的多模块进行下载,以下列四个模块为例
模块 | 意义 |
---|---|
maven_parent | 基模块,也就是常说的parent(pom) |
maven_dao | 数据库的访问层,例如jdbc操作(jar) |
maven_service | 项目的业务逻辑层(jar) |
maven_controller | 用来接收请求,响应数据(war) |
10.1.创建maven_parent模块
选择File->new->Project
创建一个无模板的Maven项目 名称改为parent
10.2.创建maven_dao模块
在parent基础上创建新的Module项目 选择模块quickstart
10.3.创建maven_service模块
与maven_dao创建方式一致
10.4.创建maven_controller模块
只需要选择webapp模块,别的同上一致
10.5.修改模式配置
1.修改JDK版本
2.单元测试JUnit版本
3.删除多余配置
10.6.设置模块间的依赖
10.6.1.maven_dao
首先 在com.xxxx下建立一个包
在包中建立一个UserDao类
package com.bruce.dao;
public class UserDao {
public static void tesetDao(){
System.out.println("UserDao....test....");
}
}
10.6.2.maven_service
创建对dao的依赖
<!--添加dao模块的依赖-->
<dependency>
<groupId>com.bruce</groupId>
<artifactId>dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
创建UserService类
package com.bruce;
import com.bruce.dao.UserDao;
public class UserService {
public static void testService(){
System.out.println("UserService Tset....");
//调用UserDao的方法
UserDao.tesetDao();
}
}
10.6.3.maven_controller
创建对service的依赖
<!--创建对service模块的依赖-->
<dependency>
<groupId>com.bruce</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--添加Servlet的依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
在controller下,我们要自己创建java文件夹,并右键在Mark Directory as里将其作为 Resource Root
在java文件夹下创建UserServlet类
package com.bruce;
import com.bruce.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UserServlet Test...");
//调用service模块的方法
UserService.testService();
}
}
在build中添加tomcat服务器
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- 此处为项目的对外访问路径 -->
<path>/Web03</path>
<!--此处配置了访问的端口号 -->
<port>8081</port>
<!--字符集编码 -->
<uriEncoding>UTF-8</uriEncoding>
<!--服务器名称 -->
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
10.6.4.启动项目
依照上节中tomcat的启动方法进行启动
若启动失败,则需要将四个项目分别用命令install一下(在Add Configuration中Maven下进行install),来供其他项目使用
注意,install设置好后要将4个install全部执行一遍
除了最下面是tomcat,其余四个都是install,从parent开始一层一层执行install,最后执行tomcat07即可
11.Maven的打包操作
首先要明确,jar包是Java项目的压缩包,而war包是Web项目的压缩包
11.1.创建一个maven项目
如果内部没有java目录,就需要手动添加,添加过程与上面controller添加一致,将java文件夹其作为 Resources Root(源文件夹)
同理,如果没有resources目录,也要手动添加并将其作为 Resources Root(源文件夹)
11.2.创建需要用到的文件夹
如图
以dev为例
bean.xml中为
表明是dev的文件
<bean>
dev
</bean>
在其他文件夹下就依次是test和properties
db.properties中为
分别是用户和密码
uname=root
upwd=root
内容在其余两个地方是可以不一样的,因为账号密码是可以不同的
11.3.添加profile配置
放在里面即可(例如dependencies后面)
<!--打包环境配置 开发环境 测试环境 正式环境-->
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<!--未指定环境时,默认打包dev环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<profile>
<id>product</id>
<properties>
<env>product</env>
</properties>
</profile>
</profiles>
这里需要注意的就是env中的值和id中的值,尽量和文件名对应,这样就容易查找
11.4.设置资源文件配置
放入build中
<!--对于项目资源文件的配置放在build中-->
<resources>
<resource>
<directory>src/main/resources/${env}</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
这里的格式都是固定的,使用时直接copy就好
filtering与文件名的替换有关,这里直接关闭就可以
11.5.输入maven命令
1.在Add Configuration中创建一个新的maven项,命名为package,命令为package
2.在Add Configuration中创建一个新的maven项,命名为package_dev命令为clean compile package -Pdev -Dmaven.test.skip=true
因为在外网用户访问你的项目时,人家是直接拿来用的,不需要使用test文件,因此在打包的时候跳过test的相关文件
以此类推创建package_test,package_product
11.6.在target目录下,就可以访问war压缩包
例如执行package_test时,里面的对应bean.xml和db.properties就是我们自己设定好的对应值 以此类推,会根据自身的执行来进行覆盖
12.Maven依赖的基本概念
12.1.依赖的基本配置
1.基本坐标:groupId,artifactId,version 基本坐标是最重要的Maven需要根据坐标才能找到需要的数据
2.Type:依赖的类型 一般默认为jar
3.依赖范围 Scope
compile:编译依赖范围,没有指定时就会默认使用该依赖范围
test:测试依赖范围,只对测试classpath有效
provided:已提供依赖范围,在运行时不需要,对编译和测试classpath有效
runtime:运行时依赖范围,对测试和运行classpath有效
system:系统依赖范围,和provided的有效范围一致,但由于与systemPath元素显式指定依赖路径有关,可能造成构建的不可移植,因此应该谨慎使用
12.2.依赖范围
Maven在编译主代码时会使用到一套classpath,具体即上面的五种依赖范围
12.3.传递性依赖
比如A->B->C,我们在使用A的时候,不用去考虑依赖了什么,有无多余的依赖,Maven会解析各个依赖的pom,将必要的间接依赖以传递性依赖的方式引入到当前项目中。
但传递性依赖可能会造成冲突问题。
即A->B->C‘ 和 A->E->C’’ 这两个C的版本是不一样的,就会造成冲突,那么就需要添加如下代码
<dependencies>
<dependency>
<groupId>A</groupId>
<artifactId>A</artifactId>
<version>xxx</version>
<exclusions>
<exclusion>
<groupId>C</groupId>
<artifactId>C</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>B</groupId>
<artifactId>B</artifactId>
</dependency>
</dependencies>