從零到一:Maven 快速入門教程

目錄

    • Maven 簡介
      • Maven 是什么
      • 為什么使用 Maven?
    • 安裝 Maven
      • 下載 Maven
      • 配置 Maven
        • 解壓文件
        • 配置本地倉庫保存路徑
        • 配置國內倉庫地址
    • Maven 的核心概念
      • 了解 pom.xml 文件
      • 坐標
      • 依賴范圍
        • 生命周期
        • compile
        • provided
        • runtime
        • test
        • system
        • import
      • 依賴傳遞
      • 依賴排除
      • 依賴循環
    • 繼承
      • 1. Maven 繼承的基本概念
      • 2. 如何使用 Maven 繼承
        • 2.1 創建父項目 `pom.xml`
        • 2.2 創建子項目 `pom.xml`
    • build 標簽組成
      • 生命周期插件
        • 常見的生命周期插件示例
      • SpringBoot 定制化打包
    • Reference

Maven 簡介

Maven 是什么

Maven 是 Apache 軟件基金會開發的一個項目管理構建自動化工具,主要用于 Java 項目。它可以:

  • 管理項目的依賴(比如第三方庫)
  • 自動構建項目(編譯、打包)
  • 管理項目的生命周期(從創建到發布)
  • 管理插件(自動化任務,如測試、代碼檢查)

一個 Maven 工程遵循約定的目錄結構,這種標準化的目錄布局是 Maven 實現自動化構建過程中不可或缺的關鍵環節。Maven 推薦采用統一的目錄結構,以確保項目的一致性和構建過程的高效性。

project-name/
├── src/
│   ├── main/
│   │   └── java/          # 主代碼
│   └── test/
│       └── java/          # 測試代碼
├── pom.xml                # Maven 配置文件

為什么使用 Maven?

傳統 Java 項目可能要手動:

  • 下載 JAR 包(第三方庫)
  • 配置類路徑(classpath)
  • 編譯源代碼
  • 打包成 jar/war 文件

Maven 全部幫你做了!它像一個「項目自動管家」,你只需寫好配置文件(pom.xml),Maven 會自動根據配置從倉庫中拉取依賴。


安裝 Maven

下載 Maven

下載地址:https://maven.apache.org/download.cgi

你可以下載最新版本的 Maven,也可以選擇其他版本

然后里面選擇自己對應的版本下載即可:

配置 Maven

解壓文件

下載之后,解壓到非中文的文件目錄,如下:

配置本地倉庫保存路徑

Maven 會在每次從遠程倉庫獲取第三方依賴后,將其緩存至本地指定的存儲路徑中。這一機制有效避免了在每次構建新項目時重復從遠程倉庫拉取相同依賴的情況,從而顯著提升了開發效率并減少了不必要的網絡開銷。

<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
-->
<localRepository>D:\Environment\Repository</localRepository>

本地倉庫默認值:用戶/.m2/repository。由于本地倉庫的默認位置是在用戶的家目錄下,而家目錄往往是在 C 盤,也就是系統盤。將來 Maven 倉庫中 jar 包越來越多,倉庫體積越來越大,可能會拖慢 C 盤運行速度,影響系統性能。

配置國內倉庫地址

Maven 下載 jar 包默認訪問境外的中央倉庫,而國外網站速度很慢。改成阿里云提供的鏡像倉庫,訪問國內網站,可以讓 Maven 下載 jar 包的時候速度更快。配置的方式是:

<mirror><id>tencent</id><name>tencent maven</name><url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url><mirrorOf>central</mirrorOf>
</mirror><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

Maven 的核心概念

了解 pom.xml 文件

pom.xml(Project Object Model)是 Maven 項目的核心配置文件,其主要功能在于對項目的全面描述與定義,包括但不限于以下內容:

  • 項目元信息:定義項目的基本信息,如名稱、版本、組織等標識性數據。
  • 依賴管理:聲明項目所依賴的外部庫及其版本,確保構建過程中的依賴解析與一致性。
  • 構建配置:指定項目的構建規則,包括編譯、測試、打包等生命周期階段的具體行為。
  • 插件與擴展:配置用于增強構建能力的插件及擴展模塊,支持定制化構建需求。

通過 pom.xml,Maven 實現了項目結構的標準化與構建過程的自動化,為開發者提供了高效且可維護的項目管理工具。

<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><!-- 當前Maven工程的坐標 --><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><!-- 當前Maven工程的打包方式,可選值有下面三種: --><!-- jar:表示這個工程是一個Java工程  --><!-- war:表示這個工程是一個Web工程 --><!-- pom:表示這個工程是“管理其他工程”的工程 --><packaging>jar</packaging><properties><!-- 工程構建過程中讀取源碼時使用的字符集 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 當前工程所依賴的jar包 --><dependencies><dependency><!-- 在dependency標簽內使用具體的坐標依賴我們需要的一個jar包 --><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!-- scope標簽配置依賴的范圍 --><scope>test</scope></dependency></dependencies><!-- 構建配置 --><build><plugins><!-- 編譯插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.10.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>

坐標

每一個依賴(或項目)都有三個關鍵標識:

  • groupId:組織名,一般是域名反寫,如 org.springframework
  • artifactId:模塊名,如 spring-core
  • version:版本號,如 5.3.10

合起來可以唯一確定一個庫,如下:

<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>compile</scope>

項目首次運行時,會從遠程倉庫拉取依賴,并保存到本地倉庫

上面坐標對應的 jar 包在 Maven 本地倉庫中的位置:

Maven本地倉庫根目錄\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar

依賴范圍

在 Maven 中,依賴范圍(Dependency Scope)決定了一個依賴在構建過程中的可用性和傳播性。

Maven 的生命周期如下:編譯測試運行打包

不同的范圍影響了該依賴在不同生命周期階段的行為,即<scope>標簽。

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!-- scope標簽配置依賴的范圍 --><scope>test</scope>
</dependency>

Maven 提供了幾種常用的依賴范圍類型,每種類型有不同的含義和使用場景。

生命周期

編譯:將 Java 源代碼文件(.java 文件)轉換為 字節碼(.class 文件),這是 Java 虛擬機(JVM)能夠執行的代碼。

測試: 執行單元測試(Unit Test)和集成測試(Integration Test)等。

運行:項目最終的運行時環境中。

打包:將當前項目打包成 Jar 或者 War 包。

compile

描述compile 范圍是 Maven 依賴的默認范圍。如果你沒有顯式指定依賴的范圍,它會自動使用 compile 范圍。compile 范圍表示該依賴在編譯、測試、運行時都需要。

可用階段

  • 編譯時:可以使用
  • 測試時:可以使用
  • 運行時:可以使用
  • 打包時:包含在最終的構件中

常見場景:適用于大多數的應用程序庫,通常是核心依賴。

示例

<dependency><groupId>com.example</groupId><artifactId>some-library</artifactId><version>1.0</version>
</dependency>
provided

描述provided 范圍表示該依賴在編譯測試時需要,但在運行時由容器或運行時環境提供。典型的例子是 Web 應用程序中的 Servlet API,它在 Web 容器(如 Tomcat)中已經提供,因此不需要在最終的構件中包含該依賴。

可用階段

  • 編譯時:可以使用
  • 測試時:可以使用
  • 運行時:不包含
  • 打包時:不包含(因為容器已經提供了該依賴)

常見場景:Web 項目中的容器依賴(如 servlet-api)或者一些 Java EE API。

示例

<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>
runtime

描述runtime 范圍表示該依賴在運行時需要,但在編譯時不需要。通常這種范圍適用于某些在運行時才需要的庫,比如數據庫驅動程序或者日志框架。

可用階段

  • 編譯時:不需要
  • 測試時:可以使用
  • 運行時:需要
  • 打包時:包含

常見場景:用于運行時需要的庫,通常是數據庫連接池、日志框架等。

示例

<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version><scope>runtime</scope>
</dependency>
test

描述test 范圍表示該依賴僅在測試時需要。它不會在項目的運行時或者生產環境中包含。通常用于單元測試框架(如 JUnit 或 TestNG)和一些測試工具。

可用階段

  • 編譯時:可以使用
  • 測試時:可以使用
  • 運行時:不需要
  • 打包時:不包含

常見場景:單元測試框架(JUnit、TestNG)、模擬庫(Mockito)等。

示例

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
system

描述system 范圍表示該依賴位于項目外部(如本地文件系統中)。它不是從遠程倉庫下載的,而是通過文件路徑直接引用。system 范圍的依賴必須指定 systemPath 屬性,該路徑指向文件的實際位置。

可用階段

  • 編譯時:可以使用
  • 測試時:可以使用
  • 運行時:需要
  • 打包時:包含

示例

<dependency><groupId>com.example</groupId><artifactId>some-library</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/some-library.jar</systemPath>
</dependency>

注意:不推薦使用 system 范圍,因為它不具備跨平臺的特性,依賴文件路徑是硬編碼的,缺乏可移植性。

import

描述import 范圍主要用于導入 BOM(Bill of Materials)類型的依賴,它不會像普通的依賴那樣將 JAR 文件直接添加到構建中,而是通過繼承管理的一組版本。常用于依賴管理(dependencyManagement)的場景,通常在多模塊項目中,或者用于引入其他項目的版本管理。

可用階段

  • 編譯時:不可用
  • 測試時:不可用
  • 運行時:不可用
  • 打包時:不可用

常見場景:用于在父項目中管理子模塊的依賴版本,或引用第三方庫的版本管理。

示例

<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.7.RELEASE</version><scope>import</scope><type>pom</type></dependency></dependencies>
</dependencyManagement>

依賴傳遞

Maven 支持依賴傳遞,即當一個項目依賴于某個庫時,若該庫本身依賴其他庫,這些依賴會自動成為當前項目的依賴,直到最終沒有更多的傳遞依賴為止。

假設我們有以下的項目依賴關系:

  • 項目 A 依賴項目 B
  • 項目 B 依賴項目 C
  • 項目 AB 不需要直接依賴 C,就可以引入 mysql-connector-javalombok 依賴

通過執行依賴樹:

mvn dependency:tree

輸出結果

[INFO] com.example:project-A:jar:1.0
[INFO] +- com.example:library-B:jar:1.0:compile
[INFO] |  +- com.example:library-C:jar:1.0:compile
[INFO] |  |  +- mysql:mysql-connector-java:jar:8.0.23:compile
[INFO] |  |  \- org.projectlombok:lombok:jar:1.18.20:provided
[INFO] \- (omitted for brevity)

依賴排除

如果 A 項目現在不需要使用 mysql 的依賴或者單獨使用其他版本的依賴,應該如何處理呢?

Maven 提供了依賴排除的工程,避免版本沖突或者不必要的依賴,可以在 pom 文件中進行配置。

<!-- A項目的坐標 -->
<groupId>com.example</groupId>
<artifactId>project-A</artifactId>
<version>1.0</version><dependencies><!-- A 項目依賴 B 項目 --><dependency><groupId>com.example</groupId><artifactId>library-B</artifactId><version>1.0</version><exclusions><!-- 排除 C 項目傳遞的 MySQL 依賴 --><exclusion><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></exclusion></exclusions></dependency>
</dependencies>

通過執行依賴樹:

mvn dependency:tree

輸出結果

[INFO] com.example:project-A:jar:1.0
[INFO] +- com.example:library-B:jar:1.0:compile
[INFO] |  +- com.example:library-C:jar:1.0:compile
[INFO] |  \- org.projectlombok:lombok:jar:1.18.20:provided
[INFO] \- (omitted for brevity)

MySQL 依賴沒有出現在依賴樹中,因為我們通過 <exclusions> 明確排除了 MySQL 依賴。

依賴循環

如果 A 工程依賴 B 工程,B 工程依賴 C 工程,C 工程又反過來依賴 A 工程,那么在執行構建操作時會報下面的錯誤:

[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:

繼承

Maven 的 繼承 是一種在多模塊項目或父子項目之間共享配置的機制。通過繼承,子項目可以繼承父項目的依賴、插件、屬性、版本信息等配置,減少冗余的配置,提高可維護性。父子項目的關系是通過 parent 元素在 pom.xml 中實現的。

1. Maven 繼承的基本概念

父項目(Parent Project):一個包含通用配置和版本管理的項目,其他子項目可以繼承這些配置。

子項目(Child Project):繼承父項目的 pom.xml 中定義的配置,包括依賴、插件、構建配置等

2. 如何使用 Maven 繼承

2.1 創建父項目 pom.xml

父項目 pom.xml 中可以定義通用的配置,例如依賴版本、插件配置、構建配置等。然后,子項目通過 <parent> 元素繼承這些配置。

父項目的 pom.xml 示例:

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging> <!-- 父項目的打包類型通常是 pom --><!-- 指定子項目 --><modules><module>child-project</module></modules><dependencyManagement><dependencies><!-- 在父項目中聲明的依賴版本會被所有子項目繼承 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.9</version></dependency></dependencies></dependencyManagement><build><pluginManagement><plugins><!-- 子項目會繼承父項目的插件配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></pluginManagement></build></project>

在這個父項目中:

  • dependencyManagement:管理所有子項目中共享的依賴版本。
  • pluginManagement:定義了子項目共享的插件和插件的配置。
2.2 創建子項目 pom.xml

子項目通過 <parent> 元素來繼承父項目的配置。子項目的 pom.xml 中需要指明父項目的 groupIdartifactIdversion

子項目的 pom.xml 示例:

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 父項目坐標 --><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>child-project</artifactId><dependencies><!-- 繼承父項目的 spring-core 依賴,版本由父項目提供 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency></dependencies><build><plugins><!-- 子項目繼承父項目的插件配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId></plugin></plugins></build></project>

在這個子項目中:

  • 子項目 繼承了父項目的依賴管理,因此不需要在子項目中顯式地指定 spring-core 的版本。
  • 子項目 繼承了父項目的插件配置,因此不需要重新定義 maven-compiler-plugin 插件的版本和配置。

build 標簽組成

生命周期插件

Maven 使用插件來執行不同生命周期階段的任務,如編譯、測試、打包等。每個生命周期都有多個階段,而插件負責在這些階段執行實際的任務。Maven 默認有多個生命周期,比如 清理生命周期默認生命周期站點生命周期。通過 build 標簽中的 <plugins> 元素,你可以為不同的生命周期階段指定插件。

常見的生命周期插件示例
  • maven-compiler-plugin:用于編譯 Java 代碼
  • maven-surefire-plugin:用于運行單元測試
  • maven-jar-plugin:用于打包 JAR 文件
  • maven-war-plugin:用于打包 WAR 文件
<build><plugins><!-- 編譯插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source>  <!-- 指定編譯的 JDK 版本 --><target>1.8</target>  <!-- 指定目標 JDK 版本 --></configuration></plugin><!-- 單元測試插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin><!-- JAR 打包插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.1.0</version><configuration><finalName>my-app</finalName></configuration></plugin></plugins>
</build>

在上面的示例中,指定了三個常用的插件:

  • maven-compiler-plugin:用于指定編譯的 JDK 版本。
  • maven-surefire-plugin:用于運行單元測試。
  • maven-jar-plugin:用于創建 JAR 文件,并指定輸出文件名。

SpringBoot 定制化打包

Spring Boot 提供了非常靈活的構建和打包方式,你可以通過 Maven 插件來定制 Spring Boot 項目的打包過程。Spring Boot 使用 spring-boot-maven-plugin 插件來創建可執行的 JAR 或 WAR 文件。

<build><plugins><!-- Spring Boot Maven 插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.2</version> <!-- 使用的 Spring Boot 版本 --><configuration><finalName>my-springboot-app</finalName> <!-- 打包后的文件名 --></configuration></plugin></plugins>
</build>

Reference

  1. 超級詳細的 Maven 教程(基礎+高級)
  2. https://chatgpt.com/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84010.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java-39 深入淺出 Spring - AOP切面增強 核心概念 通知類型 XML+注解方式 附代碼

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI煉丹日志-28 - Aud…

第四講:類和對象(下)

1. 再探構造函數 ? 之前我們實現構造函數時&#xff0c;初始化成員變量主要使?函數體內賦值&#xff0c;構造函數初始化還有?種? 式&#xff0c;就是初始化列表&#xff0c;初始化列表的使??式是以?個冒號開始&#xff0c;接著是?個以逗號分隔的數據成 員列表&#xff…

linux 安裝mysql8.0;支持國產麒麟,統信uos系統

一&#xff1a;使用我已經改好的mysql linux mysql8.0解壓可用&#xff0c;點我下載 也在國產麒麟系統&#xff0c;統信uos系統也測試過&#xff0c;可用&#xff1b; 下載后&#xff0c;上傳mysql.tar.gz 然后使用root角色去執行幾個命令即可&#xff1b;數據庫密碼&#xf…

音頻剪輯軟件少之又少好用

我們平時見到的圖片以及視頻編輯工具非常多&#xff0c;但是音頻剪輯軟件卻是少之又少&#xff0c;更不用說有沒有好用的&#xff0c;今天&#xff0c;給大家帶來一款非常專業的音頻剪輯軟件&#xff0c;而且是會員喔。 軟件簡介 一款手機號登錄即可以享受會員的超專業音頻剪…

論文閱讀:CLIP:Learning Transferable Visual Models From Natural Language Supervision

從自然語言監督中學習可遷移的視覺模型 雖然有點data/gpu is all you need的味道&#xff0c;但是整體實驗和談論豐富度上還是很多的&#xff0c;非常長的原文和超級多的實驗討論&#xff0c;隔著屏幕感受到了實驗的工作量之大。 Abstract 最先進的計算機視覺系統被訓練來預測…

第9篇:數據庫中間件的容錯機制與高可用架構設計

9.1 為什么數據庫中間件需要容錯與高可用設計&#xff1f; 隨著系統復雜性增加&#xff0c;數據庫中間件不僅承載 SQL 路由、分片、事務控制等核心職責&#xff0c;也成為系統的 單點風險源。 為確保系統 724 小時穩定運行&#xff0c;中間件必須具備&#xff1a; 自動故障檢測…

c#壓縮與解壓縮-SharpCompress

SharpCompress SharpCompress 是一個開源項目庫&#xff0c;能夠處理文件。c#庫對于壓縮已經有很多&#xff0c;可以隨意選擇&#xff0c;看了SharpCompress感覺比較簡潔&#xff0c;還是介紹給大家。 項目地址&#xff1a; sharpcompress 項目使用 引入nuget包&#xff1…

Go中的協程并發和并發panic處理

1 協程基礎 1.1 協程定義&#xff08;Goroutine&#xff09; 概念&#xff1a;Go 語言特有的輕量級線程&#xff0c;由 Go 運行時&#xff08;runtime&#xff09;管理&#xff0c;相比系統線程&#xff08;Thread&#xff09;&#xff0c;創建和銷毀成本極低&#xff0c;占用…

性能優化筆記

性能優化轉載 https://www.cnblogs.com/tengzijian/p/17858112.html 性能優化的一般策略及方法 簡言之&#xff0c;非必要&#xff0c;不優化。先保證良好的設計&#xff0c;編寫易于理解和修改的整潔代碼。如果現有的代碼很糟糕&#xff0c;先清理重構&#xff0c;然后再考…

frida簡介及環境搭建

frida簡介及環境搭建 一、frida簡介二、frida環境搭建一、frida簡介 frida是一款輕量級的Hook框架,也可以說是一種動態插樁工具,可以插入一些原生代碼到原生app的內存空間去,動態地監視和修改器行為,這些原生平臺可以是Win、Mac、Linux、Android或者iOS。 frida分為兩個部…

Python實例題:Python計算微積分

目錄 Python實例題 題目 代碼實現 實現原理 符號計算&#xff1a; 數值計算&#xff1a; 可視化功能&#xff1a; 關鍵代碼解析 1. 導數計算 2. 積分計算 3. 微分方程求解 4. 函數圖像繪制 使用說明 安裝依賴&#xff1a; 基本用法&#xff1a; 示例輸出&#…

Mybatis 攔截器 與 PageHelper 源碼解析

Mybatis 攔截器 與 PageHelper 源碼解析 一、MyBatis插件機制的設計思想二、Interceptor接口核心解析2.1 核心方法2.2 Intercepts、Signature 注解2.3 自定義攔截器 三、PageHelper 介紹3.1 使用姿勢3.2 參數與返回值3.3 使用小細節 四、PageHelper 核心源碼解析4.1 分頁入口&a…

Linux中 SONAME 的作用

?? 一、從 -lexample 到 SONAME ? 假設你有以下文件結構: /libexample.so → libexample.so.1 /libexample.so.1 → libexample.so.1.0.0 /libexample.so.1.0.0 # SONAME: libexample.so.1/libexample.so.2 → libexample.so.2.0.0 /libexample.so.2.0…

熱門消息中間件匯總

文章目錄 前言RabbitMQ基本介紹核心特性適用場景 Kafka基本介紹核心特性適用場景 RocketMQ基本介紹核心特性適用場景 NATS基本介紹核心特性適用場景 總結選型建議與未來趨勢選型建議未來趨勢 結語 前言 大家后&#xff0c;我是沛哥兒。作為技術領域的老濕機&#xff0c;在消息…

【DAY42】Grad-CAM與Hook函數

內容來自浙大疏錦行python打卡訓練營 浙大疏錦行 知識點: 回調函數lambda函數hook函數的模塊鉤子和張量鉤子Grad-CAM的示例 作業&#xff1a;理解下今天的代碼即可 在深度學習中&#xff0c;我們經常需要查看或修改模型中間層的輸出或梯度。然而&#xff0c;標準的前向傳播和反…

C++032(static變量)

static變量 static變量是靜態存儲變量&#xff0c;定義變量時系統就會為其分配固定的存儲單元&#xff0c;直至整個程序運行結束。之前我們接觸過的全局變量即為static變量&#xff0c;它們存放在靜態存儲區中。使用static關鍵字&#xff0c;可將變量聲明成static變量。例如&a…

N元語言模型 —— 一文講懂!!!

目錄 引言 一. 基本知識 二.參數估計 三.數據平滑 一.加1法 二.減值法/折扣法 ?編輯 1.Good-Turing 估計 ?編輯 2.Back-off (后備/后退)方法 3.絕對減值法 ?編輯4.線性減值法 5.比較 三.刪除插值法(Deleted interpolation) 四.模型自適應 引言 本章節講的…

SpringAI Alibaba實戰文生圖

1?? 前置準備&#xff1a;搭建開發環境與服務配置&#x1f680; &#x1f527; 1.1 環境要求 JDK 17&#xff08;推薦 JDK 21&#xff09;、Spring Boot 3.x&#xff08;本案例使用 3.3.4&#xff09;、阿里云百煉大模型服務 API Key。需在阿里云控制臺完成服務開通并獲取有…

實戰二:開發網頁端界面完成黑白視頻轉為彩色視頻

?一、需求描述 設計一個簡單的視頻上色應用&#xff0c;用戶可以通過網頁界面上傳黑白視頻&#xff0c;系統會自動將其轉換為彩色視頻。整個過程對用戶來說非常簡單直觀&#xff0c;不需要了解技術細節。 效果圖 ?二、實現思路 總體思路&#xff1a; 用戶通過Gradio界面上…

Kotlin List 操作全面指南

在傳統 Java 開發 List 相關的 API 中&#xff0c;有著樣板代碼冗長、缺乏鏈式調用、空安全等問題。 Kotlin 這門語言 為 List 提供了豐富的擴展函數&#xff0c;這些函數大大簡化了集合操作&#xff0c;解決了傳統 Java 集合 API 中的許多痛點。 一、基礎操作 1. 創建 List …