Tech Blog

Configuration โปรเจกต์แบบ Self-Contained: รัน Maven / Node / Java บน Windows โดยไม่พึ่ง PATH

by Tech Writer
Windows Maven Node.js Spring Boot

บทนำ

“เมื่อสมาชิกใหม่เข้าร่วม ขั้นตอนแรกคือการ align versions ของ Java, Node.js และ Maven เสมอ”

แม้ในการพัฒนาคนเดียว ปัญหาเดียวกันก็เกิดขึ้นเมื่อเปลี่ยน PC หรือ reset environment

โปรเจกต์นี้ใช้ configuration ที่จำกัด Maven, Node และ npm ไว้ในโฟลเดอร์โปรเจกต์
โดยไม่พึ่งพา system PATH


ภาพรวม Configuration

dvd-rental-admin/
  mvnw          ← Maven Wrapper (สำหรับ macOS/Linux)
  mvnw.cmd      ← Maven Wrapper (สำหรับ Windows)
  node/
    npm         ← npm (สำหรับ macOS/Linux)
    npm.cmd     ← npm (สำหรับ Windows)
    npx
    npx.cmd
  package.json  ← npm configuration สำหรับ frontend build

เมื่อ run build commands เราใช้ commands ภายในโปรเจกต์แทนที่จะใช้ Maven และ Node ที่ติดตั้งบน system


Maven Wrapper

mvnw / mvnw.cmd คือ Maven Wrapper
เมื่อ execute จะ download และรัน version ของ Maven ที่ระบุใน .mvn/wrapper/maven-wrapper.properties โดยอัตโนมัติ

# .mvn/wrapper/maven-wrapper.properties
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip

การใช้งาน

# ใช้ version ที่ระบุในโปรเจกต์ ไม่ใช่ system Maven
.\mvnw.cmd clean package

# Build ได้แม้ไม่มี mvn command ติดตั้งบน system

วิธีสร้าง

# Generate wrapper ในสภาพแวดล้อมที่มี Maven อยู่แล้ว
mvn wrapper:wrapper -Dmaven=3.9.6

การจำกัด Node / npm ไว้ภายในโปรเจกต์

ติดตั้ง Node ภายในโปรเจกต์ผ่าน npm install

การวาง Node.js binaries ในโฟลเดอร์ node ทำให้แยกออกจาก system Node

// package.json
{
  "engines": {
    "node": ">=22.0.0"
  },
  "scripts": {
    "build:css": "node/npm.cmd run tailwind",
    "build:ts": "node/npx.cmd tsc"
  }
}

หรือใช้ frontend-maven-plugin:

<!-- pom.xml -->
<plugin>
    <groupId>com.github.eirslett</groupId>
    <artifactId>frontend-maven-plugin</artifactId>
    <version>1.15.0</version>
    <configuration>
        <installDirectory>node</installDirectory>  <!-- วางใน node/ ของโปรเจกต์ -->
        <nodeVersion>v22.0.0</nodeVersion>
    </configuration>
    <executions>
        <execution>
            <id>install-node-and-npm</id>
            <goals><goal>install-node-and-npm</goal></goals>
        </execution>
    </executions>
</plugin>

การรัน mvn generate-resources จะติดตั้ง Node.js ลงในโฟลเดอร์ node/


หมายเหตุเกี่ยวกับการ Resolve Path ใน Windows

Extension .cmd สำคัญมากใน Windows

# NG: ไม่มี extension อาจไม่ทำงานใน Windows PowerShell
.\mvnw clean package

# OK: ระบุ .cmd อย่างชัดเจน
.\mvnw.cmd clean package
.\node\npm.cmd run build

ยังไง ถ้า working directory ไม่ใช่ project root .\mvnw.cmd จะ fail

# NG: เมื่ออยู่ใน subdirectory
cd infra/cdk
.\mvnw.cmd package  # ← Error: ไม่พบ mvnw.cmd

# OK: กลับไปยัง project root ก่อน execute
cd C:\Users\y_104\git\dvd-rental-admin
.\mvnw.cmd package

# หรือ execute ด้วย absolute path
C:\Users\y_104\git\dvd-rental-admin\mvnw.cmd package

การตั้งค่า VS Code Task

การกำหนดใน .vscode/tasks.json ของ VS Code ทำให้ build ได้โดยไม่ต้องเปิด terminal

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build-backend",
      "type": "shell",
      "command": ".\\mvnw.cmd",
      "args": ["-DskipTests", "package"],
      "options": {
        "cwd": "${workspaceFolder}"  // ← ระบุ workspaceFolder อย่างชัดเจน
      },
      "group": "build"
    },
    {
      "label": "build-frontend",
      "type": "shell",
      "command": ".\\node\\npm.cmd",
      "args": ["run", "build"],
      "options": {
        "cwd": "${workspaceFolder}"
      },
      "group": "build"
    }
  ]
}

การตั้งค่า .gitignore

เราไม่ commit Node และ Maven caches ภายในโปรเจกต์

# Maven Wrapper download cache
.mvn/wrapper/maven-wrapper.jar  # Exclude JAR (Wrapper auto-downloads it)

# Node binaries (downloaded by frontend-maven-plugin)
node/node_modules/
node/node.exe
node/npm
node/npm.cmd
node/npx
node/npx.cmd

# แต่ track โฟลเดอร์ node/ เอง (เป็น empty directory)

การ Rollout ให้ทีม (Onboarding)

ด้วย configuration นี้ การ setup ในสภาพแวดล้อมใหม่ลดเหลือเพียง commands เหล่านี้:

# 1. Clone repository
git clone https://github.com/your-org/dvd-rental-admin.git
cd dvd-rental-admin

# 2. ติดตั้ง Node (frontend-maven-plugin auto-downloads)
.\mvnw.cmd generate-resources

# 3. Frontend build
.\node\npm.cmd install
.\node\npm.cmd run build

# 4. Backend build และ startup
.\mvnw.cmd spring-boot:run

การระบุ Java version จัดการด้วย .sdkmanrc (เมื่อใช้ SDKMAN) หรือ .java-version (เมื่อใช้ jenv)


สรุป

ปัญหาวิธีแก้ไข
System Maven version ไม่ตรงใช้ mvnw / mvnw.cmd
System Node/npm ไม่พร้อมใช้หรือ version ไม่ตรงใช้ frontend-maven-plugin download ไว้ในโปรเจกต์
.\mvnw.cmd ไม่ทำงานบน WindowsSet working directory เป็น project root
การ setup environment ซับซ้อนสำหรับสมาชิกใหม่Self-contained configuration ลดขั้นตอน clone-to-build ให้น้อยที่สุด

การบรรลุสถานะ “ทุกอย่างที่จำเป็นในการ build โปรเจกต์นี้อยู่ในโฟลเดอร์นี้”
ช่วยลดปัญหาจากความแตกต่างของ environment ได้อย่างมาก


แผนที่บทความของ Series นี้

การสร้างแอพ DVD Rental สำหรับผู้ใช้ควบคู่กับหน้าจัดการ — ภาพรวมโครงสร้าง Vue 3 + Spring Boot

ส่งข้อความได้ตามสบาย

กรุณาส่งข้อความ หากมีคำปรึกษาด้านเทคนิค ความคิดเห็น หรือคำถาม