PHP 是直譯語言,寫完 .php 檔案丟給 PHP 直接跑,Composer 的工作很單純:下載依賴、產生 autoload 對照表,僅此而已。
Java 不一樣:.java 原始碼要先被 javac 編譯成 .class bytecode,還要打包成 .jar(或 Spring Boot 常見的可執行 .jar),才能真正被 JVM 執行(延伸閱讀:Day02 的 JVM 介紹)。所以 Maven/Gradle 不只是套件管理工具,還得管整個建置流程:編譯、跑測試、打包、部署,一條龍都算它的工作範圍。這是為什麼 Maven/Gradle 感覺比 Composer「重」很多的根本原因——它們做的事情本來就比較多。
pom.xml vs composer.jsonComposer 用 composer.json:
{
"require": {
"laravel/framework": "^11.0"
},
"require-dev": {
"phpunit/phpunit": "^10.0"
}
}
Maven 用 pom.xml(XML 格式,比 JSON 冗長不少):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
差異點:
vendor/package-name 兩段式命名;Maven 用 groupId + artifactId + version 三段式座標(俗稱 GAV),更嚴謹但也更囉唆require-dev ↔ Maven 的 <scope>test</scope>,但 Maven 的 scope 種類更多(compile、provided、runtime、test 等),可以精細控制某個依賴「在哪個建置階段可見」Composer 基本上只有「裝依賴」跟「產生 autoload」兩件事。Maven 則定義了一整串建置階段,常用的幾個:
validate → compile → test → package → verify → install → deploy
mvn compile:只編譯原始碼mvn test:編譯 + 跑測試mvn package:編譯 + 測試 + 打包成 .jar
mvn install:把打包好的 .jar 裝進本機的 Maven 倉庫,讓其他本機專案可以引用mvn deploy:發布到遠端倉庫(例如公司內部的 Nexus/Artifactory)重點是這些階段是累加的——執行後面的階段,前面的階段都會自動跑一次。這跟 Composer「就是裝依賴」的單純心智模型很不一樣,第一次接觸會覺得「為什麼裝個套件要搞這麼多階段」,但理解「Maven 在管的是整個建置流程,不只是依賴」之後就合理了。
vendor/,每個專案各自一份,占空間但乾淨、不會互相污染~/.m2/repository,全機共用——同一台機器上的所有 Maven 專案共用同一份快取,同版本的依賴不會重複下載,但代價是「這個 jar 到底被誰用」不像 vendor/ 那麼一目了然這個系列的專案先用 Maven——理由很單純:這系列的重點是學 Spring Boot 本身,Maven 的 XML 寫法雖然囉唆,但「看得到就是全部」,不用先學一套 DSL 才能看懂建置設定,減少一個變因。
PHP/Laravel 起專案是 composer create-project laravel/laravel my-app 或 laravel new my-app。Java/Spring Boot 的對應做法是 Spring Initializr(https://start.spring.io)——網頁介面勾選需要的依賴(Web、JPA、Security⋯),產生一個帶好 pom.xml 的專案骨架下載下來,等同於幫你先寫好一份最小可行的 pom.xml,不用從零手刻。