【Maven】Maven 基礎教程(三):build、profile

Maven 基礎教程》系列,包含以下 3 篇文章:

  • Maven 基礎教程(一):基礎介紹、開發環境配置
  • Maven 基礎教程(二):Maven 的使用
  • Maven 基礎教程(三):build、profile

😊 如果您覺得這篇文章有用 ?? 的話,請給博主一個一鍵三連 🚀🚀🚀 吧 (點贊 🧡、關注 💛、收藏 💚)!!!您的支持 💖💖💖 將激勵 🔥 博主輸出更多優質內容!!!

Maven 基礎教程(三):build、profile

  • 4.build 標簽
    • 4.1 build 標簽的組成
      • 4.1.1 定義約定的目錄結構
      • 4.1.2 備用插件管理
      • 4.1.3 生命周期插件
    • 4.2 典型應用:指定 JDK 版本
    • 4.3 典型應用:SpringBoot 定制化打包
  • 5. 依賴配置補充
    • 5.1 import
    • 5.2 system
    • 5.3 runtime
  • 6.profile
    • 6.1 profile 概述
    • 6.2 profile 配置
      • 6.2.1 外部視角:配置文件
      • 6.2.2 內部實現:具體標簽
    • 6.3 激活 profile
    • 6.4 Maven profile 多環境管理

4.build 標簽

在實際使用 Maven 的過程中,我們會發現 build 標簽有時候有,有時候沒,這是怎么回事呢?其實通過有效 POM 我們能夠看到,build 標簽的相關配置其實一直都在,只是在我們需要定制構建過程的時候才會通過配置 build 標簽覆蓋默認值或補充配置。這一點我們可以通過打印有效 POM 來看到。

打印有效 pom
mvn help:effective-pom

當默認配置無法滿足需求的定制構建的時候,就需要使用 build 標簽。

4.1 build 標簽的組成

build 標簽的子標簽大致包含三個主體部分:

  • 1?? 定義約定的目錄結構
  • 2?? 備用插件管理
  • 3?? 生命周期插件

4.1.1 定義約定的目錄結構

<sourceDirectory>D:\product\maven-demo-parent\demo-module\src\main\java</sourceDirectory>
<scriptSourceDirectory>D:\product\maven-demo-parent\demo-module\src\main\scripts</scriptSourceDirectory>
<testSourceDirectory>D:\product\maven-demo-parent\demo-module\src\test\java</testSourceDirectory>
<outputDirectory>D:\product\maven-demo-parent\demo-module\target\classes</outputDirectory>
<testOutputDirectory>D:\product\maven-demo-parent\demo-module\target\test-classes</testOutputDirectory>
<resources><resource><directory>D:\product\maven-demo-parent\demo-module\src\main\resources</directory></resource>
</resources>
<testResources><testResource><directory>D:\product\maven-demo-parent\demo-module\src\test\resources</directory></testResource>
</testResources>
<directory>D:\product\maven-demo-parent\demo-module\target</directory>
<finalName>demo-module-1.0-SNAPSHOT</finalName>

各個目錄的作用如下:

目錄名作用
sourceDirectory主體源程序存放目錄
scriptSourceDirectory腳本源程序存放目錄
testSourceDirectory測試源程序存放目錄
outputDirectory主體源程序編譯結果輸出目錄
testOutputDirectory測試源程序編譯結果輸出目錄
resources主體資源文件存放目錄
testResources測試資源文件存放目錄
directory構建結果輸出目錄

4.1.2 備用插件管理

pluginManagement 標簽存放著幾個極少用到的插件:

  • maven-antrun-plugin
  • maven-assembly-plugin
  • maven-dependency-plugin
  • maven-release-plugin

通過 pluginManagement 標簽管理起來的插件就像 dependencyManagement 一樣,子工程使用時可以省略版本號,起到在父工程中統一管理版本的效果。

4.1.3 生命周期插件

plugins 標簽存放的是默認生命周期中實際會用到的插件,這些插件想必大家都不陌生,所以拋開插件本身不談,plugin 標簽的結構如下:

<plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><executions><execution><id>default-compile</id><phase>compile</phase><goals><goal>compile</goal></goals></execution><execution><id>default-testCompile</id><phase>test-compile</phase><goals><goal>testCompile</goal></goals></execution></executions>
</plugin>

坐標部分

  • artifactIdversion 標簽定義了插件的坐標,作為 Maven 的自帶插件這里省略了 groupId

執行部分

  • executions 標簽內可以配置多個 execution 標簽,execution 標簽內:
    • id:指定唯一標識
    • phase:關聯的生命周期階段
    • goals / goal:關聯指定生命周期的目標。goals 標簽中可以配置多個 goal 標簽,表示一個生命周期環節可以對應當前插件的多個目標。

4.2 典型應用:指定 JDK 版本

前面我們在 settings.xml 中配置了 JDK 版本,那么將來把 Maven 工程部署都服務器上,脫離了 settings.xml 配置,如何保證程序正常運行呢?思路就是我們直接把 JDK 版本信息告訴負責編譯操作的 maven-compiler-plugin 插件,讓它在構建過程中,按照我們指定的信息工作。如下:

<!-- build 標簽:意思是告訴 Maven,你的構建行為,我要開始定制了!-->
<build><!-- plugins 標簽:Maven 你給我聽好了,你給我構建的時候要用到這些插件!--><plugins><!-- plugin 標簽:這是我要指定的一個具體的插件 --><plugin><!-- 插件的坐標。此處引用的 maven-compiler-plugin 插件不是第三方的,是一個 Maven 自帶的插件。--><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><!-- configuration 標簽:配置 maven-compiler-plugin 插件 --><configuration><!-- 具體配置信息會因為插件不同、需求不同而有所差異 --><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins>
</build>
  • settings.xml 中配置:僅在本地生效,如果脫離當前 settings.xml 能夠覆蓋的范圍,則無法生效。
  • 在當前 Maven 工程 pom.xml 中配置:無論在哪個環境執行編譯等構建操作都有效。

4.3 典型應用:SpringBoot 定制化打包

很顯然 spring-boot-maven-plugin 并不是 Maven 自帶的插件,而是 SpringBoot 提供的,用來改變 Maven 默認的構建行為。具體來說是改變打包的行為。默認情況下 Maven 調用 maven-jar-plugin 插件的 jar 目標,生成普通的 jar 包。

普通 jar 包沒法使用 java -jar xxx.jar 這樣的命令來啟動、運行,但是 SpringBoot 的設計理念就是每一個 微服務 導出為一個 jar 包,這個 jar 包可以使用 java -jar xxx.jar 這樣的命令直接啟動運行。

這樣一來,打包的方式肯定要進行調整。所以 SpringBoot 提供了 spring-boot-maven-plugin 這個插件來定制打包行為。

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.5</version></plugin></plugins>
</build>

5. 依賴配置補充

管理依賴最基本的辦法是繼承父工程,但是和 Java 類一樣,Maven 也是單繼承的。如果不同體系的依賴信息封裝在不同 POM 中了,沒辦法繼承多個父工程怎么辦?這時就可以使用 import 依賴范圍。

5.1 import

典型案例當然是在項目中引入 SpringBoot、SpringCloud 依賴:

<dependencyManagement><dependencies><!-- SpringCloud 微服務 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud Alibaba 微服務 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

import 依賴范圍使用要求:

  • 打包類型必須是 pom
  • 必須放在 dependencyManagement

官網說明如下:

This scope is only supported on a dependency of type pom in the section. It indicates the dependency is to be replaced with the effective list of dependencies in the specified POM’s section. Since they are replaced, dependencies with a scope of import do not actually participate in limiting the transitivity of a dependency.

5.2 system

以 Windows 系統環境下開發為例,假設現在 D:\product\maven-demo-parent\demo-module\target\demo-module-1.0-SNAPSHOT.jar 想要引入到我們的項目中,此時我們就可以將依賴配置為 system 范圍:

<dependency><groupId>net.javatv.maven</groupId><artifactId>demo-module</artifactId><version>1.0-SNAPSHOT</version><systemPath>D:\product\maven-demo-parent\demo-module\target\demo-module-1.0-SNAPSHOT.jar</systemPath><scope>system</scope>
</dependency>

但是很明顯:這樣引入依賴完全不具有可移植性,所以不要使用。

5.3 runtime

專門用于編譯時不需要,但是運行時需要的 jar 包。比如:編譯時我們根據接口調用方法,但是實際運行時需要的是接口的實現類。典型案例是:

<!--熱部署 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional>
</dependency>

6.profile

6.1 profile 概述

這里我們可以對接 profile 這個單詞中 側面 這個含義:項目的每一個運行環境,相當于是項目整體的一個側面。

在這里插入圖片描述
通常情況下,我們項目至少有三種運行環境:

  • 開發環境:供不同開發工程師開發的各個模塊之間互相調用、訪問;內部使用。
  • 測試環境:供測試工程師對項目的各個模塊進行功能測試;內部使用。
  • 生產環境:供最終用戶訪問,所以這是正式的運行環境,對外提供服務。

在這里插入圖片描述
我們這里的 環境 仍然只是一個籠統的說法,實際工作中一整套運行環境會包含很多種不同服務器:

  • MySQL
  • Redis
  • ElasticSearch
  • RabbitMQ
  • FastDFS
  • Nginx
  • Tomcat
  • ……

就拿其中的 MySQL 來說,不同環境下的訪問參數肯定完全不同,可是代碼只有一套。如果在 jdbc.properties 里面來回改,那就太麻煩了,而且很容易遺漏或寫錯,增加調試的難度和工作量。所以最好的辦法就是把適用于各種不同環境的配置信息分別準備好,部署哪個環境就激活哪個配置。

在 Maven 中,使用 profile 機制來管理不同環境下的配置信息。但是解決同類問題的類似機制在其他框架中也有,而且從模塊劃分的角度來說,持久化層的信息放在構建工具中配置也違反了 高內聚,低耦合 的原則。

實際上,即使我們在 pom.xml 中不配置 profile 標簽,也已經用到 profile了。為什么呢?因為根標簽 project 下所有標簽相當于都是在設定默認的 profile。這樣一來我們也就很容易理解下面這句話:project 標簽下除了 modelVersion 和坐標標簽之外,其它標簽都可以配置到 profile 中。

6.2 profile 配置

6.2.1 外部視角:配置文件

從外部視角來看,profile 可以在下面兩種配置文件中配置:

  • settings.xml:全局生效。其中我們最熟悉的就是配置 JDK 1.8。
  • pom.xml:當前 POM 生效。

6.2.2 內部實現:具體標簽

從內部視角來看,配置 profile 有如下語法要求:

1?? profiles / profile 標簽

  • 由于 profile 天然代表眾多可選配置中的一個,所以由復數形式的 profiles 標簽統一管理。
  • 由于 profile 標簽覆蓋了 pom.xml 中的默認配置,所以 profiles 標簽通常是 pom.xml 中的最后一個標簽。

2?? id 標簽

每個 profile 都必須有一個 id 標簽,指定該 profile 的唯一標識。這個 id 標簽的值會在命令行調用 profile 時被用到。這個命令格式是:

-D<profile id>

3?? 其它允許出現的標簽

一個 profile 可以覆蓋項目的 最終名稱項目依賴插件配置 等各個方面以影響構建行為。

  • build
  • defaultGoal
  • finalName
  • resources
  • testResources
  • plugins
  • reporting
  • modules
  • dependencies
  • dependencyManagement
  • repositories
  • pluginRepositories
  • properties

6.3 激活 profile

1?? 默認配置默認被激活

前面提到了,POM 中沒有在 profile 標簽里的就是默認的 profile,當然默認被激活。

2?? 基于環境信息激活

環境信息包含:JDK 版本操作系統參數文件屬性 等各個方面。一個 profile 一旦被激活,那么它定義的所有配置都會覆蓋原來 POM 中對應層次的元素。可參考下面的標簽結構:

<profile><id>dev</id><activation><!-- 配置是否默認激活 --><activeByDefault>false</activeByDefault><jdk>1.5</jdk><os><name>Windows XP</name><family>Windows</family><arch>x86</arch><version>5.1.2600</version></os><property><name>mavenVersion</name><value>2.0.5</value></property><file><exists>file2.properties</exists><missing>file1.properties</missing></file></activation>
</profile>

這里有個問題是:多個激活條件之間是什么關系呢?

  • Maven 3.2.2 之前:遇到第一個滿足的條件即可激活,或的關系。
  • Maven 3.2.2 開始:各條件均需滿足,且的關系。

下面我們來看一個具體例子。假設有如下 profile 配置,在 JDK 版本為 1.6 時被激活:

<profiles><profile><id>JDK1.6</id><activation><!-- 指定激活條件為:JDK 1.6 --><jdk>1.6</jdk></activation>……</profile>
</profiles>

這里需要指出的是:Maven 會自動檢測當前環境安裝的 JDK 版本,只要 JDK 版本是以 1.6 開頭都算符合條件。下面幾個例子都符合:

  • 1.6.0_03
  • 1.6.0_02
  • ……

6.4 Maven profile 多環境管理

在開發過程中,我們的軟件會面對不同的運行環境,比如開發環境、測試環境、生產環境,而我們的軟件在不同的環境中,有的配置可能會不一樣,比如數據源配置、日志文件配置、以及一些軟件運行過程中的基本配置,那每次我們將軟件部署到不同的環境時,都需要修改相應的配置文件,這樣來回修改,很容易出錯,而且浪費勞動力。

因此我們可以利用 Maven 的 profile 來進行定義多個 profile,然后每個 profile 對應不同的激活條件和配置信息,從而達到不同環境使用不同配置信息的效果。

<build><!-- profile對資源的操作 --><resources><resource><directory>src/main/resources</directory><!-- 先排除所有環境相關的配置文件 --><excludes><exclude>application*.yml</exclude></excludes></resource><resource><directory>src/main/resources</directory><!-- 是否替換 @xx@ 表示的maven properties屬性值 --><!--通過開啟 filtering,maven 會將文件中的 @xx@ 替換 profile 中定義的 xx 變量/屬性--><filtering>true</filtering><includes><include>application.yml</include><include>application-${profileActive}.yml</include></includes></resource></resources>
</build><!--多環境文件配置-->
<profiles><!--開發環境--><profile><id>dev</id><activation><!--默認激活--><activeByDefault>true</activeByDefault></activation><properties><profileActive>dev</profileActive></properties></profile><!--測試環境--><profile><id>test</id><properties><profileActive>test</profileActive></properties></profile><!--正式環境--><profile><id>prod</id><properties><profileActive>prod</profileActive></properties></profile>
</profiles>

idea 中可以看到,因此,當你需要打包哪一個環境的就勾選即可:

在這里插入圖片描述
同時,SpringBoot 天然支持多環境配置,一般來說,application.yml 存放公共的配置,application-dev.ymlapplication-test.ymlapplication.prod.yml 分別存放三個環境的配置。如下:
在這里插入圖片描述
application.yml 中配置 spring.profiles.active=prod(或者 devtest)指定使用的配置文件,如下:

在這里插入圖片描述
注:profileActive,就是上面我們自定義的標簽。

然后當我們勾選哪一個環境,打包的配置文件就是那一個環境:

在這里插入圖片描述
同時我們再在 resource 標簽下看到 includesexcludes 標簽。它們的作用是:

  • includes:指定執行 resource 階段時要包含到目標位置的資源。
  • excludes:指定執行 resource 階段時要排除的資源。

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

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

相關文章

修飾符【C#】

分為四部分&#xff1a;屬性修飾符&#xff0c;存取修飾符&#xff0c;類修飾符和成員修飾符。 屬性修飾符&#xff1a; [Serializable]&#xff1a;按值將對象封送到遠程服務器。在按值封送對象時&#xff0c;就會創建一個該對象的副本&#xff0c;并將其序列化傳送到服務器…

TCP/UDP,HTTP、HTTPS存在什么風險會影響到網絡安全嗎

近年來&#xff0c;隨著網絡技術的飛速發展&#xff0c;互聯網影響人們的方方面面&#xff0c;我們平時也接觸到許多以前從未聽過的東西&#xff0c;今天德迅云安全就來分享下一些互聯網安全知識&#xff0c;講解一些關于常看到的關于IP, TCP/UDP&#xff0c;HTTP、HTTPS這些名…

QT之液晶電子時鐘

根據qt的<QLDNumber>做了一個qt液晶電子時鐘. 結果 實時顯示當前時間,左鍵可以拖動時鐘在屏幕的位置,右鍵點擊關閉顯示. 實現過程 新建一個class文件,讓這個文件的父類是QLCDNumber 相關功能變量定義和函數實現 .c文件代碼 這里需要注意的一點是event->button是獲取的…

SpringMVC自定義視圖解析器

/** * 使用View接口完成請求轉發|重定向 * 解釋: * SpringMVC的官方&#xff0c;提供了一個叫做View的接口&#xff0c;告訴開發人員 * DispatcherServlet底層會調用View接口的實例化對象中的邏輯方法 * 來完成對應的請求轉發和重定向。 * 使用: * 1. 單元方法的返回值為View接…

前臺自動化測試:基于敏捷測試驅動開發(TDD)的自動化測試原理

一、自動化測試概述 自動化測試主要應用到查詢結果的自動化比較&#xff0c;把借助自動化把相同的數據庫數據的相同查詢條件查詢到的結果同理想的數據進行自動化比較或者同已經保障的數據進行不同版本的自動化比較&#xff0c;減輕人為的重復驗證測試。多用戶并發操作需要自動…

【開源】JAVA+Vue.js實現APK檢測管理系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 數據中心模塊2.2 開放平臺模塊2.3 軟件檔案模塊2.4 軟件檢測模塊2.5 軟件舉報模塊 三、系統設計3.1 用例設計3.2 數據庫設計3.2.1 開放平臺表3.2.2 軟件檔案表3.2.3 軟件檢測表3.2.4 軟件舉報表 四、系統展示五、核心代…

pdfpages 宏包和 includepdf 使用問題

在 latex 中插入其他 pdf 文檔的頁時 \usepackage{pdfpages} % 插入 PDF 頁 \includepdf[pages-]{pg276-axi-hbm-en.pdf} 用 xelatex 編譯生成的 pdf 文檔內容會與原文檔內容不一致&#xff0c;文字位置對折等問題。 解決辦法&#xff1a; A 文檔中的某些…

springBoot整合Redis(二、RedisTemplate操作Redis)

Spring-data-redis是spring大家族的一部分&#xff0c;提供了在srping應用中通過簡單的配置訪問redis服務&#xff0c;對reids底層開發包(Jedis, JRedis, and RJC)進行了高度封裝&#xff0c;RedisTemplate提供了redis各種操作、異常處理及序列化&#xff0c;支持發布訂閱&…

Android:BitmapFactory.decodeStream Bitmap的內存優化OutOfMemory異常以后Crash閃退

自己項目中使用如下方法&#xff0c;有的手機上會奔潰報錯&#xff0c;原因是BitmapFactory.decodeStream部分沒有使用options參數改變內存大小 改成如下形式后正常了&#xff1b;正確解決方案&#xff1a;設置inSampleSize 一&#xff09;Android BitmapFactory.decodeStream(…

C++利用匯編挖掘編程語言的本質..

1.謬論 很多非一手的資料特別是中文資料其實并不可靠 因為很多作者都是直接通過轉載他人的作品 也不管他人作品真與假 而且有一部分的作品中的言論和官方描述相去甚遠 有的則是翻譯的過程中出現了問題 比如sizeof很多人認為是一個函數 其實他并不是一個函數 而是一個運算符 是…

【FAQ】HarmonyOS SDK 閉源開放能力 —Push Kit

1.問題描述 升級到4.0.0.59版本后&#xff0c;通過pushService.getToken獲取華為的token時報如下錯誤&#xff1a;Illegal application identity. 解決方案 Mate 40 Pro (NOH) 從 4.0升級到4.1版本后&#xff0c;會出現UDID變化&#xff0c;影響歷史的調試簽名使用&#xff…

檔案數字化驗收流程

檔案數字化驗收流程通常包括以下步驟&#xff1a; 1. 確定驗收標準&#xff1a;制定檔案數字化驗收標準&#xff0c;明確要求檢查的內容、質量要求、驗收標準等。 2. 準備驗收環境&#xff1a;為檔案數字化驗收準備合適的環境&#xff0c;包括驗收場所、設備、人員等。 3. 準備…

vscode 引入外部依賴包

背景 我要在vscode中寫一些antlr代碼生成的cpp代碼&#xff0c;但是在引入頭文件#include "antlr4-runtime.h"的時候&#xff0c;出現報錯&#xff0c;顯示沒有這個頭文件&#xff0c;顯然這是我們沒有導入相關的包&#xff0c;因此我首先嘗試了將antlr4的依賴源碼在…

Semantic human matting

1.introduction 數據集包括&#xff0c;時尚模特數據集&#xff0c;超過18.8w張模特圖&#xff0c;從中選出35311張圖片&#xff0c;DIM數據集&#xff0c;僅包含人類的圖像&#xff0c;202個前景圖像&#xff0c;背景來自coco數據集和互聯網&#xff0c;背景圖不含人類&#x…

python 基礎知識點(藍橋杯python科目個人復習計劃56)

今日復習內容&#xff1a;做題 例題1&#xff1a;最小的或運算 問題描述&#xff1a;給定整數a,b&#xff0c;求最小的整數x&#xff0c;滿足a|x b|x&#xff0c;其中|表示或運算。 輸入格式&#xff1a; 第一行包括兩個正整數a&#xff0c;b&#xff1b; 輸出格式&#…

小烏龜操作Git

1、選擇小烏龜作為git客戶端 最近使用idea來操作git的時候頻頻出現問題&#xff0c;要么是提交代碼的時候少了某些文件&#xff0c;導致克隆下來無法運行&#xff0c;要么是提交速度太慢。 反正是在idea中操作git體驗非常不好&#xff0c;所以決定來換一種方式來操作git。從網…

藍橋杯算法題匯總

一.線性表&#xff1a;鏈式 例題&#xff1a;旋轉鏈表 二.棧&#xff1a; 例題&#xff1a;行星碰撞問題 三.隊列 三.數組和矩陣 例題&#xff1a;

FPGA-VGA成像原理與時序

什么是VGA: VGA, Video Graphics Array。即視頻圖形陣列,具有分辨率高、顯示速率快、顏色豐富等優點。VGA接口不但是CRT顯示設備的標準接口,同樣也是LCD液晶顯示設備的標準接口,具有廣泛的應用范圍。在FGPA中,常廣泛用于圖像處理等領域。 VGA 顯示器成像原理 在 VGA 標準剛興…

C語言 vs Rust應該學習哪個?

C語言 vs Rust應該學習哪個&#xff1f; 在開始前我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「C語言的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“888”之后私信回復“888”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&am…

bun 文件類型

Typescript Bun 原生支持開箱即用的 TypeScript。所有文件在執行之前都由 Bun 的快速本機轉譯器即時轉譯。與其他構建工具類似&#xff0c;Bun 不執行類型檢查;它只是從文件中刪除類型注釋。 bun index.js bun index.jsx bun index.ts bun index.tsxBun 運行時行為的某些方面…