Maven
Maven
Maven的下载配置
-
根据pycharm编辑器的版本选择对应的maven版本
-
编辑环境变量,将bin目录加入环境变量中
-
修改配置文件
-
配置本地仓库
-
找到 localRepository 节点,在注释外添加
<localRepository>D:\apache-maven-3.9.8-bin\MAVEN—local repository</localRepository>
-
-
配置镜像
-
settings.xml 文件中找到 mirrors 节点
<!-- 阿里云仓库 --> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror>
-
-
配置JDK
-
settings.xml 文件中找到 profiles 节点
<profile> <id>jdk-12</id> <activation> <activeByDefault>true</activeByDefault> <jdk>12</jdk> </activation> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>12</maven.compiler.source> <maven.compiler.target>12</maven.compiler.target> </properties> </profile>
-
-
测试命令
# 查看环境变量 mvn -version # 查看阿里云仓库和本地仓库的配置 mvn help:system
项目路径问题
Maven 项目的目录结构:
- 资源文件通常放置在
src/main/resources或src/test/resources目录下。 - 代码文件通常放置在
src/main/java或src/test/java目录下
整体结构如下所示
项目根目录
├── src
│ ├── main
│ │ ├── java # Java 源代码目录
│ │ ├── resources # 资源文件目录(配置文件、属性文件等)
│ │ └── webapp # Web 应用根目录
│ │ ├── WEB-INF # Web 应用配置文件目录
│ │ │ ├── web.xml # Web 应用部署描述文件
│ │ │ └── classes # 编译后的类文件(由 Maven 自动生成)
│ │ └── index.html # 静态资源文件(HTML、CSS、JS 等)
│ └── test
│ ├── java # 测试代码目录
│ └── resources # 测试资源文件目录
├── target # 构建输出目录(由 Maven 自动生成)
│ ├── classes # 编译后的类文件
│ ├── test-classes # 编译后的测试类文件
│ └── 项目名.war # 打包后的 WAR 文件
├── pom.xml # Maven 项目配置文件
└── 其他文件(如 README.md)
- 注意:
- 需要手动将pom.xml依赖导入生成项目结构下的WEB-INF下的lib文件夹下
- 如果是手动标注java、resource这些文件夹需要在settings中Maven下的Ignored Files选项卡下查看是否忽略了该项目
配置文件中的路径
- 不加
/:- 表示相对类路径的路径。
- 例如:
mappers/usermapper.xml表示从类路径的根目录开始查找mappers/usermapper.xml文件
- 加
/:- 也表示类路径的根目录,但通常不推荐在类路径中使用
/开头。 - 例如:
/mappers/usermapper.xml也表示从类路径的根目录开始查找mappers/usermapper.xml文件
- 也表示类路径的根目录,但通常不推荐在类路径中使用
文件系统中的路径
-
不加
/:- 表示相对路径,相对于当前工作目录(通常是项目的根目录)
-
加
/:- 表示绝对路径,从文件系统的根目录开始查找
| 场景 | 路径写法 | 解析方式 |
|---|---|---|
| Java 代码中 | 不加 / |
相对路径,相对于当前类的包路径(使用 getResourceAsStream 时)。 |
加 / |
绝对路径,从类路径的根目录开始。 | |
| 配置文件中 | 不加 / |
相对路径,从类路径的根目录开始。 |
加 / |
绝对路径,从类路径的根目录开始(与不加 / 效果相同)。 |
UserServer.class.getResourceAsStream
- 如果路径以
/开头(绝对路径),则从类路径的根目录开始查找 - 如果路径不以
/开头(相对路径),则从UserServer.class所在的包路径开始查找
UserServer.class.getClassLoader().getResourceAsStream
- 路径不能以
/开头,始终从classpath根目录开始查找
一些注意点
- 类路径的根目录是
target/classes - maven项目中编译后java目录下和resource目录下的文件会一同打包到
target/classes目录下,如果有同名的包则会将java文件和resource文件放到一起 - java目录和resource目录这两个目录本身并不会打包进根目录
- 在 Maven 的配置文件中,某些情况下确实可以使用相对路径,但通常不推荐这样做
Mave中依赖的作用范围
-
compile(默认值)
- 作用:
- 依赖在编译、测试和运行时都有效。
- 依赖会被打包到最终的构建产物中(如 JAR、WAR 等)。
- 使用场景:
- 项目的主要依赖,例如核心库、工具类等。
- 作用:
-
test
- 作用:
- 依赖仅在测试阶段有效(编译测试代码和运行测试时)。
- 依赖不会被打包到最终的构建产物中。
- 使用场景:
- 测试框架(如 JUnit、TestNG)和测试工具。
- 作用:
-
provided
- 作用:
- 依赖在编译和测试阶段有效,但在运行时由外部环境提供(如 Servlet API)。
- 依赖不会被打包到最终的构建产物中。
- 使用场景:
- 由运行环境(如应用服务器)提供的依赖。
- 作用:
-
runtime
- 作用:
- 依赖在测试和运行时有效,但在编译时无效。
- 依赖会被打包到最终的构建产物中。
- 使用场景:
- 运行时需要的依赖,但在编译时不需要(如 JDBC 驱动)
- 作用:
-
system
- 作用:
- 类似于
provided,但依赖的路径需要显式指定。 - 依赖不会被打包到最终的构建产物中。
- 类似于
- 使用场景:
- 使用本地系统中的依赖,而不是从 Maven 仓库中获取
- 作用:
-
import
-
作用:
- 仅用于
<dependencyManagement>中,用于导入其他 POM 文件中的依赖管理配置。 - 不会实际引入依赖。
- 仅用于
-
使用场景:
- 在父 POM 中管理依赖版本。
<dependencyManagement> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>parent-pom</artifactId> <version>1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
-
-
optional
-
作用:
- 标记依赖为可选的,不会传递到依赖该项目的其他项目中。
- 依赖在编译、测试和运行时都有效。
-
使用场景:
- 当依赖不是项目必需的,或者不希望传递依赖时使用。
<dependency> <groupId>com.example</groupId> <artifactId>optional-lib</artifactId> <version>1.0</version> <optional>true</optional> </dependency>
-
总结
| Scope | 编译阶段 | 测试阶段 | 运行阶段 | 打包 | 传递性 | 使用场景 |
|---|---|---|---|---|---|---|
compile |
✔ | ✔ | ✔ | ✔ | ✔ | 核心依赖 |
test |
✖ | ✔ | ✖ | ✖ | ✖ | 测试框架和工具 |
provided |
✔ | ✔ | ✖ | ✖ | ✔ | 由运行环境提供的依赖 |
runtime |
✖ | ✔ | ✔ | ✔ | ✔ | 运行时需要的依赖 |
system |
✔ | ✔ | ✖ | ✖ | ✖ | 本地系统中的依赖 |
import |
✖ | ✖ | ✖ | ✖ | ✖ | 导入依赖管理配置 |
optional |
✔ | ✔ | ✔ | ✔ | ✖ | 可选依赖,不传递 |
Maven中的八个命令
- clean
- 作用:清理项目,删除
target目录及其内容。 - 使用场景:在重新构建项目之前,清理旧的构建结果。
- 效果:删除
target目录,确保下一次构建是从干净的状态开始
- 作用:清理项目,删除
- compile
- 作用:编译项目的源代码。
- 使用场景:将
src/main/java目录下的 Java 源代码编译为.class文件 - 效果:编译后的
.class文件会存放在target/classes目录中
- test
- 作用:运行项目的单元测试。
- 使用场景:执行
src/test/java目录下的单元测试代码 - 效果
- 运行所有单元测试,并生成测试报告。
- 测试报告会存放在
target/surefire-reports目录中
- package
- 作用:将编译后的代码打包成可分发的格式(如 JAR、WAR 等)。
- 使用场景:生成项目的构建产物
- 效果:
- 根据
pom.xml中配置的<packaging>类型,生成相应的构建产物。 - 例如,
<packaging>jar</packaging>会生成一个 JAR 文件,存放在target目录中
- 根据
- install
- 作用:将项目的构建产物安装到本地 Maven 仓库。
- 使用场景:将项目打包并安装到本地仓库,供其他项目依赖
- 效果:
- 将生成的 JAR/WAR 文件安装到本地 Maven 仓库(通常是
~/.m2/repository目录)。 - 其他项目可以通过
groupId、artifactId和version引用该构建产物
- 将生成的 JAR/WAR 文件安装到本地 Maven 仓库(通常是
- deploy:部署到远程仓库。
- verify:运行集成测试并验证构建结果。
- site:生成项目站点文档。
注意点:
- maven执行后面的命令会一并执行之前的命令
父工程中的版本管理
dependencyManagement中声明的依赖仅用于指定版本号,子工程可以继承这些版本信息,但不会自动引入依赖- 子工程如果需要使用某个依赖,必须显式声明该依赖,且未指定版本时,才会继承父工程的版本
<!--父工程-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.8</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--子工程-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>

浙公网安备 33010602011771号