Maven 个人笔记

本文详细介绍了Maven项目的生命循环阶段(编译、测试、打包等)、dependency的optional标签的作用、不同scope的含义,以及Maven的依赖管理、IDEAMaven插件、父项目和子模块的依赖关系,以及maven-shade-plugin的详解。
摘要由CSDN通过智能技术生成

 常见问题整理

1. mvn项目的生命周期是怎样的

        Maven项目的主要生命周期阶段包括编译、测试、打包等,以下是这些阶段的详细介绍:

编译(Compile)

  • 在编译阶段,Maven将项目的源代码(通常是Java源代码)编译成可执行代码。这涉及到源代码的语法检查、错误修正以及将源代码转换为字节码(.class文件)。
  • Maven使用配置的编译器(如Java编译器)执行此任务,并确保所有必要的依赖库都已正确解析和包含。

测试(Test)

  • 测试阶段用于验证编译后的代码是否符合预期。Maven将运行项目中的单元测试,这通常通过集成诸如JUnit这样的测试框架来实现。
  • 在测试执行期间,Maven会加载项目所需的测试依赖项,并运行定义在测试类中的测试方法。测试结果会生成报告,以便开发者检查代码的正确性和完整性。

打包(Package)

  • 打包阶段是将编译和测试后的代码和资源文件打包成可分发的格式,如JAR(Java Archive)或WAR(Web Application Archive)文件。
  • Maven根据项目的类型(如库或Web应用)和POM文件中定义的打包配置,使用适当的打包器执行此任务。生成的包文件包含了运行项目所需的所有依赖和资源。

除了上述核心阶段外,Maven还提供了其他阶段和生命周期,例如:

清理(Clean)

        用于删除构建过程中生成的所有文件,如编译后的类文件和打包生成的JAR/WAR文件。这有助于确保每次构建都是从头开始,避免旧的构建产物干扰新的构建。

安装(Install)

        将打包后的文件安装到本地Maven仓库中,供其他项目依赖使用。

部署(Deploy)

        将打包后的文件部署到远程仓库中,供其他开发者或系统使用。

此外,Maven还允许用户通过插件机制扩展和自定义这些阶段,以满足特定的构建需求。

要执行Maven项目的这些阶段,开发者通常会在命令行中运行相应的Maven命令,如mvn clean package(执行清理和打包阶段)或mvn clean install(执行清理、编译、测试和安装阶段)。Maven将按照定义的顺序依次执行这些阶段,并确保每个阶段都成功完成后才进入下一个阶段。

 2. dependency的optional标签有什么用

        当在Maven项目中将一个依赖标记为<optional>true</optional>时,这意味着该依赖对于当前项目来说是必需的,但对于使用该项目的其他项目来说,这个依赖是可选的。换句话说,如果一个项目A依赖于项目B,而项目B有一个可选的依赖C,那么项目A不会自动继承项目B的可选依赖C;另外如果A作为模块和B在一个项目里,A引入B模块,这样也不会继承C;但如果模块A作为项目B的子模块,则可以继承依赖C       

        另外scope为test / provided的依赖也不会在项目间传递. 

3. mvn依赖作用域scope介绍        

        mvn依赖作用域(Scope)是Maven中用来控制依赖元素使用范围的重要元素。具体来说,它决定了Jar包在哪些范围被加载和使用,这些范围包括编译、测试、运行等阶段,并且还可以控制是否被打入包中。

即scope的一个作用是maven lifecycle会用到哪个scope. 另一个作用是在依赖传递时发生.

Scope的主要分类及其含义如下:

  1. compile:这是默认的作用域。被依赖项目需要参与到当前项目的编译、测试、打包、运行等所有阶段。因此,compile范围的依赖会被打包,并随着项目一起发布。
  2. test:这个作用域的依赖仅用于测试阶段,包括测试代码的编译和执行。它们不会被打包到最终的项目中,例如junit这样的测试框架就属于这个范围。
  3. runtime:被依赖项目在编译阶段不需要,但在测试和运行阶段需要。与compile相比,runtime的依赖跳过了编译阶段,例如JDBC驱动就属于这个范围。
  4. provided:这个作用域的依赖理论上可以参与编译、测试、运行等所有阶段,但在打包阶段会被排除。这意味着虽然依赖在编译和测试时是必要的,但在运行时,它会由JDK、容器或其他设施提供,因此不需要被打包到项目中。例如,在开发web应用时,servlet-api.jar在编译时需要,但在运行时由应用服务器提供,因此应该使用provided作用域。另外还有lombok,只在编译时使用。
  5. system:这个作用域与provided类似,但依赖不会从Maven仓库下载,而是从本地文件系统获取。使用时需要添加systemPath属性来定义路径。

理解并正确设置mvn依赖作用域,可以帮助优化项目的依赖管理,减少不必要的包大小,并提高项目的可维护性。

4. IDEA maven插件介绍

        建议先clean,再执行其他命令,其他命令并不包含clean,防止旧的编译class和资源影响最新代码执行效果。

5. 父项目和子模块依赖管理

6. Maven的POM文件打包方式怎么选

7. maven中dependencyManagement的scope值为import的理解:

https://www.cnblogs.com/huahua035/p/7680607.html

在Maven中,scope为import是一个特殊的依赖范围,它专门用于dependencyManagement元素中,以导入另一个POM文件(通常称为BOM,Bill of Materials)中定义的依赖管理。这意味着你可以在一个中心位置(如父POM或特定的BOM POM)定义一组依赖及其版本,然后在多个项目或模块中重用这些定义,而无需在每个项目中重复这些定义。

scope为import的主要用途是:

集中管理依赖版本:确保多个项目或模块使用相同版本的依赖,减少版本冲突的风险。
简化依赖声明:子模块可以简单地引用依赖,而无需指定版本,因为版本已经在BOM中定义。

下面是一个在dependencyManagement中使用scope为import的例子:

假设你有一个BOM POM文件(dependencies-bom.pom),它定义了一组依赖及其版本:


<!-- dependencies-bom.pom -->
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>dependencies-bom</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.5.4</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.12.3</version>
            </dependency>
            <!-- 其他依赖... -->
        </dependencies>
    </dependencyManagement>
</project>


然后,在一个父POM或任何其他POM中,你可以导入这个BOM,以便使用其中定义的依赖管理:


<!-- parent-pom.xml 或其他项目的pom.xml -->
<project>
    <!-- ... 其他配置 ... -->

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>dependencies-bom</artifactId>
                <version>1.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- ... 其他配置 ... -->
</project>


现在,任何子模块或引用这个父POM的项目都可以简单地引用BOM中定义的依赖,而无需指定版本:


<!-- 子模块的pom.xml -->
<project>
    <!-- ... 其他配置 ... -->

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <!-- 其他依赖,使用BOM中定义的版本 -->
    </dependencies>

    <!-- ... 其他配置 ... -->
</project>


在这个例子中,子模块不需要为spring-boot-starter-web和jackson-databind指定版本,因为它们的版本已经在dependencies-bom.pom中定义,并通过scope为import的依赖导入到父POM的dependencyManagement中。这确保了整个项目使用一致且经过测试的依赖版本。

8. maven-shade-plugin详解-CSDN博客

其它总结:摘自其它文章

Maven详解(入门到精通)学习maven有这个就够了-CSDN博客

超级详细的 Maven 教程(基础+高级)_maven教程-CSDN博客

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值