maven
https://www.bilibili.com/video/BV14j411S76G?p=1&vd_source=5c648979fd92a0f7ba8de0cde4f02a6e
1.简介
1.1介绍
Maven翻译为"专家"、“内行”,是Apache下的一个纯Java开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven是一个项目管理工具,可以对Java项目进行构建、依赖管理。Maven也可被用于构建和管理各种项目,例如C#,Ruby,Scala和其他语言编写的项目。Maven曾是Jakarta项目的子项目,现为由Apache 软件基金会主持的独立Apache 项目。
通过Maven,可以帮助我们做:
- 项目的自动构建,包括代码的编译、测试、打包、安装、部署等操作。
- 依赖管理,项目使用到哪些依赖,可以快速完成导入。
我们之前并没有讲解如何将我们的项目打包为Jar文件运行,同时,我们导入依赖的时候,每次都要去下载对应的Jar包,这样其实是很麻烦的,并且还有可能一个Jar包依赖于另一个Jar包,就像之前使用JUnit一样,因此我们需要一个更加方便的包管理机制。
Maven也需要安装环境,但是IDEA已经自带了Maven环境,因此我们不需要再去进行额外的环境安装((无IDEA也能使用Maven,但是配置过程很麻烦,并且我们现在使用的都是IDEA的集成开发环境,所以这里就不讲解Maven命令行操作了)我们直接创建一个新的Maven项目即可。
1.2创建一个maven项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9m7b332o-1690375786144)(maven学习.assets/image-20230726165124192.png)]
其实本身就是一个Java项目。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F1OMCZvc-1690375786145)(maven学习.assets/image-20230726165304209.png)]
maven的项目结构
- test是集合junit结合在一起进行使用的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yrges6P-1690375786145)(maven学习.assets/image-20230726165319415.png)]
1.3组成
groupId 、artifactId 、 version这三个元素合在一起,用于唯一区别每个项目,别人如果需要将我们编写的代码作为依赖,那么就必须通过这三个元素来定位我们的项目,我们称为一个项目的基本坐标,所有的项目一般都有自己的Maven坐标,因此我们通过
Maven导入其他的依赖只需要填写这三个基本元素就可以了,无需再下载Jar文件,而是Maven自动帮助我们下载依赖并导入。
- groupId一般用于指定组名称,命名规则一般和包名一致,比如我们这里使用的是org.example ,一个组下面可以有很多个项目。
- artifactId 一般用于指定项目在当前组中的唯一名称,也就是说在组中用于区分于其他项目的标记。定0 –
- version 代表项目版本,随着我们项目的开发和改进,版本号也会不断更新,就像LOL一样,每次赛季更新都会有一个大版本更新,我们的Maven项目也是这样,我们可以手动指定当前项目的版本号,其他人使用我们的项目作为依赖时,也可以根本版本号进行选择(这里的SNAPSHOT代表快照,一般表示这是一个处于开发中的项目,正式发布项目一般只带版本号)
基本的参数
<?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"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>maven_study</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>
导入别的依赖的话本质就是导入
<groupId>xxx</groupId>
<artifactId>xx</artifactId>
<version>xxx</version>
创建一个结点,可以导入我们需要的依赖。
<dependencies></dependencies>
下载个依赖为例
- 中心仓库几乎存储了所有的依赖
- 一般的话都会找到的
- 必须是联网的
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version><scope>provided</scope></dependency></dependencies>
使用我们的导入的依赖
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
private String password;}
创建测试文件
public class TestMain {public static void main(String[] args) {System.out.println("你好");User user=new User();user.setName("张三");user.setPassword("123465");user.setId(1);System.out.println(user.toString());}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNZiG99u-1690375786146)(maven学习.assets/image-20230726170347115.png)]
1.4仓库
下面的这个网站可以告诉你常见的依赖的地址,用到什么就可以搜索什么。
https://mvnrepository.com/
仓库的基本原理图
- 本地仓库就是我们默认配置的:默认是m2。可以配置成自己的仓库的地址。
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OC7lH1z5-1690375786146)(maven学习.assets/image-20230726170056199.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y6lANXvK-1690375786147)(maven学习.assets/image-20230726165929502.png)]
本地有的话,下次用到的时候会自动地进行导入地,不需要再去下载了。默认先去本地仓库中去寻找依赖进行导入。
原先maven设置的仓库的地址是远程的,现在需要换成国内的地址。
<!--配置案例云的镜像--><mirror><id>nexus-aliyun</id><mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>
或者是下面的形式都是一样的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fT2DZuSZ-1690375786147)(maven学习.assets/image-20230726170818427.png)]
此时下载依赖的时候全部的依赖全部是从国内的地址中去下载不需要从国外的地址中去下载了。
1.5依赖的作用域
1.依赖的基本属性
前面了解到了依赖的基本的形式
<dependency><groupId></groupId><artifactId></artifactId><version></version></dependency>
下面将会了解更多的属性
- type:依赖的类型默认就是jar
- scope:依赖的范围,重点。
- optional:依赖是不是可选的。
- exclusions:用来排除传递依赖的。b项目导入了a依赖,但是我们不需要a中的xx依赖就需要进行排除
2.scope属性内容。决定了依赖的作用域的范围。
compile:编译、运行和测试均有效。
provided:在编译和测试的时候有效,运行的时候无效。也就是说运行的时候不需要该依赖。像lombox在编译的时候用到,编译完成之后生成代码了之后,就转换成代码了,不需要进行使用了。
runtime:运行和测试有效。编译时候无效,像jdbc。
test:仅仅在测试时候有效。像junit依赖。
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope>
</dependency>
3.编写测试类
public class TestJava {@Testvoid test(){System.out.println("测试");}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VVzkCEvA-1690375786147)(maven学习.assets/image-20230726172113396.png)]
4.添加连接数据库的文件
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version><scope>runtime</scope>
</dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version>
</dependency>
5.资源文件夹下内容的创建。
mybatis的基本教程
http://c.biancheng.net/mybatis/config.html
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置 --><settings><setting name="mapUnderscoreToCamelCase" value="true"/><setting name="cacheEnabled" value="true"/></settings><typeAliases><package name = "com.test.entity"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- MySQL数据库驱动 --><property name="driver" value="com.mysql.jdbc.Driver" /><!-- 连接数据库的URL --><property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf8" /><property name="username" value="root" /><property name="password" value="root" /></dataSource></environment></environments><mappers><mapper class="com.test.mapper.UserMapper"/></mappers>
</configuration>
6.编写mapper
@Mapper
public interface UserMapper {@Select("select * from user where id=#{id}")User getUserById (String id);
}
7.编写测试类
public class TestMain {public static void main(String[] args) throws Exception{SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSession session=factory.openSession(true);UserMapper userMapper=session.getMapper(UserMapper.class);System.out.println(userMapper.getUserById("1"));}
}
补充一个要是只是一个本地jar怎么办呢。也就是远程没有这个jar的依赖。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSLPO6NM-1690375786148)(maven学习.assets/image-20230726174619121.png)]
1.6可选依赖
当项目中的某些依赖不希望被使用此项目作为依赖的项目使用时,我们可以给依赖添加optional标签表示此依赖是可选的,默认在导入依赖时,不会导瓜可选的依赖:
https://www.bilibili.com/video/BV14j411S76G/?p=3&spm_id_from=pageDriver&vd_source=5c648979fd92a0f7ba8de0cde4f02a6e
- 表示为true的话可以不导入这个依赖
- scope为test的话根本不需要设置
<optional>true</optional>
exclusions可以设置排除依赖。排除某个依赖。
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion></exclusions>
</dependency>
1.7创建父子项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vn4YVMJg-1690375786148)(maven学习.assets/image-20230726202031575.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXeyMifr-1690375786148)(maven学习.assets/image-20230726202210902.png)]
要是父子项目,夫设置option为true不耽误子项目的继承。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h3RUFtvV-1690375786149)(maven学习.assets/image-20230726202250475.png)]
放到dependencies的全部都是强制继承的。
但是放到dependencyManagement不是强制继承的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yh7kD3GD-1690375786149)(maven学习.assets/image-20230726202634362.png)]
子项目导入的时候不需要指定对应的版本号就可以。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1nn1C8Qs-1690375786149)(maven学习.assets/image-20230726202729991.png)]
1.8maven常用的命令
可以避免写命令行了
- clean:清理项目
- compile:编译
- install:是把项目构建下载到本地仓库
- validate:验证项目的可用性。
- test:测试所有位于test目录下的测试案例
- 测试类的名字必须是Test结尾,例如MainTest
- 测试方法上必须标注@Test注解
- package:先跑测试方法,执行完成之后才进行打包,生成jar文件。如何将jar打包成一个可执行的文件。将第三方的依赖也打包到依赖包里面。需要配置插件的内容。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmtqI985-1690375786150)(maven学习.assets/image-20230726204229538.png)]
-
verify:
-
deploy:发布到本地和远程仓库的,公司一般有私服的。
-
site:生成当前项目的发布站点。
对于存在依赖关系的项目的话,a依赖于b,打包a的话,同时会把b打包进去。会生成两个jar文件