iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0

先搞懂根本差異:Composer 不用管「編譯」,Maven 要

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.json

Composer 用 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>

差異點:

  • Composer 用 vendor/package-name 兩段式命名;Maven 用 groupId + artifactId + version 三段式座標(俗稱 GAV),更嚴謹但也更囉唆
  • Composer 的 require-dev ↔ Maven 的 <scope>test</scope>,但 Maven 的 scope 種類更多(compileprovidedruntimetest 等),可以精細控制某個依賴「在哪個建置階段可見」

Maven 的生命週期(Lifecycle):Composer 完全沒有的概念

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 在管的是整個建置流程,不只是依賴」之後就合理了。

依賴快取位置:全機共用 vs 專案內

  • Composer:依賴裝在專案內的 vendor/,每個專案各自一份,占空間但乾淨、不會互相污染
  • Maven:依賴裝在使用者家目錄下的 ~/.m2/repository全機共用——同一台機器上的所有 Maven 專案共用同一份快取,同版本的依賴不會重複下載,但代價是「這個 jar 到底被誰用」不像 vendor/ 那麼一目了然

Maven vs Gradle,該選哪個?

  • Maven:宣告式 XML,寫法固定、囉唆但好懂,Spring 官方文件範例大多用 Maven
  • Gradle:用 Groovy 或 Kotlin DSL 寫建置腳本,本質上是「用程式語言寫建置邏輯」,更彈性但也更有學習曲線

這個系列的專案先用 Maven——理由很單純:這系列的重點是學 Spring Boot 本身,Maven 的 XML 寫法雖然囉唆,但「看得到就是全部」,不用先學一套 DSL 才能看懂建置設定,減少一個變因。

快速起手:Spring Initializr

PHP/Laravel 起專案是 composer create-project laravel/laravel my-applaravel new my-app。Java/Spring Boot 的對應做法是 Spring Initializr(https://start.spring.io)——網頁介面勾選需要的依賴(Web、JPA、Security⋯),產生一個帶好 pom.xml 的專案骨架下載下來,等同於幫你先寫好一份最小可行的 pom.xml,不用從零手刻。


上一篇
Day2 - Java 生態系與語言基礎、特性筆記
下一篇
Day4 - Spring Boot 專案結構與 IoC/DI 容器 vs Laravel Service Container
系列文
從 Laravel 到 Spring Boot:30 天打造縮網址服務9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言