﻿# 使用 Visual Studio Code 開發 Java 應用程式的環境設定指南

最近公司越來越多 Java 專案，這陣子使用 Visual Studio Code 來開發 Java 應用程式小有心得。這篇文章我打算來介紹如何快速建立 Java 的開發環境，並介紹如何在 Visual Studio Code 開發工具下進行設定，讓你順利的開發出第一個 Spring Boot 應用程式，從開新專案到封裝部署，真的就簡單幾個步驟而已，開發體驗還算不錯。

![Java](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/795d25f6612d4038687e-173187134-fbd52965-609a-43bb-92c7-6c99f68fde8d.jpg)

> 本篇文章於 2022-10-08 更新。

### 基礎環境設定

-   安裝 [Chocolatey](https://chocolatey.org/install) 套件管理器
    
    ```powershell
    Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
    ```
    
-   安裝 [Visual Studio Code](https://code.visualstudio.com/) 與 [Essential Java Spring Boot Snippets](https://marketplace.visualstudio.com/items?itemName=doggy8088.spring-boot-snippets) 擴充套件
    
    我的 [Essential Java Spring Boot Snippets](https://marketplace.visualstudio.com/items?itemName=doggy8088.spring-boot-snippets) 擴充套件除了包含一些非常好用的 Code Snippets 之外，還會順便安裝 [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack), [Spring Boot Tools](https://marketplace.visualstudio.com/items?itemName=pivotal.vscode-spring-boot), [Spring Initializr Java Support](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-initializr), [Spring Boot Dashboard](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-boot-dashboard), [Java Decompiler](https://marketplace.visualstudio.com/items?itemName=dgileadi.java-decompiler), [Dependency Analytics](https://marketplace.visualstudio.com/items?itemName=redhat.fabric8-analytics), [Live Preview](https://marketplace.visualstudio.com/items?itemName=ms-vscode.live-server), [XML](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml), [YAML](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml) 與 [Lombok Annotations Support for VS Code](https://marketplace.visualstudio.com/items?itemName=GabrielBB.vscode-lombok) 擴充套件。這些大概就是用 Visual Studio Code 開發 Java 與 Spring Boot 應用程式的必備擴充套件了！
    
    除此之外，有些額外的 Java 擴充套件我也列在以下清單中，請視需要安裝即可。
    
    ```bash
    choco install vscode -y
    
    # Essential Java Spring Boot Snippets
    # https://marketplace.visualstudio.com/items?itemName=doggy8088.spring-boot-snippets
    code --install-extension doggy8088.spring-boot-snippets
    
    # Git Extension Pack
    # https://marketplace.visualstudio.com/items?itemName=doggy8088.git-extension-pack
    code --install-extension doggy8088.git-extension-pack
    
    # Checkstyle for Java
    # https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-checkstyle
    code --install-extension shengchen.vscode-checkstyle
    
    # Tomcat for Java
    # https://marketplace.visualstudio.com/items?itemName=adashen.vscode-tomcat
    # code --install-extension adashen.vscode-tomcat
    
    # SonarLint
    # https://marketplace.visualstudio.com/items?itemName=sonarsource.sonarlint-vscode
    # code --install-extension sonarsource.sonarlint-vscode
    ```
    
-   初始化 Java 執行環境 (JDK, JAVA\_HOME)
    
    因為 Visual Studio Code 的 Java 擴充套件，需要 JDK 17 以上版本才能正常運作，但事實上你的 Java 專案只要是 Java 1.5 以上版本都可以使用 Visual Studio Code 來進行開發，你可以在一台電腦中安裝多個不同版本的 JDK 開發套件！
    
    在 VSCode 的 [Java in Visual Studio Code](https://code.visualstudio.com/docs/languages/java) 文件中，他們建議以下來源的 JDK 版本，事實上你安裝任何一套都可以，全部都是相容的：
    
    -   [Amazon Corretto](https://aws.amazon.com/corretto)
        
    -   [Azul Zulu](https://www.azul.com/downloads/?package=jdk)
        
    -   [Eclipse Adoptium's Temurin](https://adoptium.net/)
        
    -   [Microsoft Build of OpenJDK](https://www.microsoft.com/openjdk)
        
    -   [Oracle Java SE](https://www.oracle.com/java/technologies/javase-downloads.html)
        
    -   [Red Hat build of OpenJDK](https://developers.redhat.com/products/openjdk/download)
        
    -   [SapMachine](https://sapmachine.io/)
        
        我自己則是使用 [Microsoft Build of OpenJDK](https://www.microsoft.com/openjdk)，因為用 [Chocolatey](https://chocolatey.org/install) 安裝比較方便，而且用 [microsoft-openjdk](https://community.chocolatey.org/packages/microsoft-openjdk) 這個套件預設就是 Java 的 LTS 最新版本，日後升級也比較方便。
        
        請以系統管理員身份開啟 PowerShell 環境執行以下命令：
        
        ```powershell
        # 安裝 Microsoft Build of OpenJDK 與 Apache Maven
        choco install microsoft-openjdk maven -y
        ```
        
        如果你的電腦中只有安裝一個版本的 JDK 的話，其實是不太需要設定 `JAVA_HOME` 環境變數的。但是如果你必須安裝多套不同的 JDK 版本的話，建議你將 `JAVA_HOME` 環境變數指向到**最新版 JDK 的安裝路徑**。
        
        查詢 JDK 安裝路徑的方法，是先開啟 Command Prompt 命令提示字元視窗，執行 `where java` 命令，找出 `java.exe` 的執行檔路徑：
        
        ```
        C:\Program Files\Microsoft\jdk-17.0.2.8-hotspot\bin\java.exe
        ```
        
        此時 JDK 安裝路徑就是以下這段，而 `JAVA_HOME` 環境變數就應該指向到這個路徑：
        
        ```
        C:\Program Files\Microsoft\jdk-17.0.2.8-hotspot
        ```
        
        以下是透過 PowerShell 快速設定 `JAVA_HOME` 環境變數的方法：
        
        ```powershell
        # 設定 JAVA_HOME 環境變數 (請確認以下 JAVA_HOME 路徑是否正確)
        $env:JAVA_HOME = 'C:\Program Files\Microsoft\jdk-17.0.2.8-hotspot'
        [System.Environment]::SetEnvironmentVariable('JAVA_HOME', $env:JAVA_HOME, [System.EnvironmentVariableTarget]::User)
        ```
        
        > 如果你用 macOS 或 Linux 的話，建議使用 [SDKMAN](https://sdkman.io/) 來安裝 JDK，請參見我的 [介紹好用工具：SDKMAN (安裝各種軟體開發套件的利器)](/post/2022/09/17/Useful-tool-SDKMAN) 文章。
        
-   初始化 Visual Studio Code 開發環境，調整 **使用者設定** (`settings.json`)
    
    基本上，以下 VSCode 設定是我的個人偏好，建議可以設定上去：
    
    ```json
    {
      "redhat.telemetry.enabled": false,
    
      "java.debug.settings.hotCodeReplace": "auto",
      "java.saveActions.organizeImports": true,
    
      "[java]": {
        "editor.foldingImportsByDefault": false,
        "editor.defaultFormatter": "redhat.java",
        "editor.codeActionsOnSave": {
          "source.organizeImports": true,
          "source.addMissingImports": true
        }
      },
    
      "spring.initializr.defaultGroupId": "com.duotify",
      "spring.initializr.defaultLanguage": "Java",
      "spring.initializr.defaultPackaging": "JAR",
      "spring.initializr.defaultOpenProjectMethod": "Open"
    }
    ```
    
    > VSCode 1.59.0 加入一個新的 `"editor.foldingImportsByDefault"` 設定值，設定為 `true` 可以幫助你預設折疊所有的 `import` 語句，相當不錯！
    

完成上述設定後，請確實關閉所有已開啟的 Visual Studio Code 視窗，重新啟動 Visual Studio Code 就可以正常開發了！👍

### 建立你的第一個 Spring Boot 應用程式

1.  使用 VSCode 的 [Spring Initializr Java Support](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-initializr) 擴充套件建立一個以 [Apache Maven](https://maven.apache.org/) 為主的 [Spring Boot](https://spring.io/projects/spring-boot) 專案
    
    按下 `Shift+F1` 快速鍵開啟 `Java: Help Center` (`java.welcome`) 視窗
    
    點擊 `Create a New Project` > 選取 `Spring Boot` > 選取 `Maven Project`
    
    > 你也可以直接按 `F1` > `Spring Initializr: Create a Maven Project` 啟動這個流程
    
    選擇 Spring Boot 版本： `2.7.4`
    
    選擇程式語言： `Java`
    
    輸入 Group Id： `com.duotify` (通常會輸入一個**組織名稱**或**群組名稱**)
    
    輸入 Artifact Id： `demo1` (這裡要輸入一個應用程式的唯一名稱，這會決定最後封裝的檔名)
    
    選擇封裝方式： `Jar`
    
    選擇 Java 版本： `17`
    
    選取相依套件： `Spring Web` (要開發 Spring Boot 一定要選取這個套件) 與 `Lombok`
    
    選擇一個資料夾：假設我們選擇 `g:\Projects` 的話，他會自動建立一個 `g:\Projects\<artifactId>` 目錄，也就是 `g:\Projects\demo1`！
    
    右下角會彈出通知訊息，請按下 **Open** 按鈕直接開啟 Java 專案！
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/385216255399005c3100-181876832-fc172632-74e4-4616-9ea3-297d7a07dc35.png)
    
    > 注意: 首次建立使用 Maven 為主的 Spring Boot 專案，必須等上數分鐘完成相依套件安裝，可能要有點耐性，最多不超過 10 分鐘才對。
    
2.  加入 `spring-boot-starter-validation` 與 `springdoc-openapi-ui` 相依套件
    
    從側邊欄開啟 **MAVEN** 檢視(View)，展開 `demo1` 節點
    
    點擊 **Dependencies** 旁邊的 `＋` 號，搜尋並加入 `spring-boot-starter-validation` (org.springframework.boot) 與 `springdoc-openapi-ui` (org.springdoc) 相依套件。這個步驟會自動修改 Apache Maven 的 `pom.xml` 檔案(POM = Project Object Model)。
    
    展開 **Lifecycle** 節點，項目下的 `install` 旁邊的 ▶ 按鈕，執行 Maven 的 install 命令，將缺少的套件安裝完成
    
    ![加入 springdoc-openapi-ui 相依套件](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/54f5db989835ffac8aaf-128163641-7bab393d-cc57-4f5d-a1f6-c4cc37ea8b5d.png)
    
3.  建立控制器 (`src\main\java\com\duotify\demo1\controllers\HomeController.java`)
    
    ```java
    package com.duotify.demo1.controllers;
    
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/api/home")
    public class HomeController {
        @GetMapping
        public ResponseEntity<String> getItem() {
            return ResponseEntity.ok("Hello World");
        }
    }
    ```
    
4.  按下 `F5` 啟動專案
    
    查看 API 執行結果: `http://localhost:8080/api/home`
    
    查看 Swagger 介面: `http://localhost:8080/swagger-ui.html` 或 `http://localhost:8080/swagger-ui/index.html`
    
5.  封裝應用程式
    
    從側邊欄開啟 **MAVEN** 檢視(View)，展開 `demo1` 節點，展開 **Lifecycle** 節點
    
    點擊 `package` 旁邊的 ▶ 按鈕，即可自動產生 Jar 封裝檔，並位於 `target/` 目錄下
    
    ![從側邊欄開啟 MAVEN 檢視(View)，展開 demo1 節點，展開 Lifecycle 節點，點擊 package 旁邊的 ▶ 按鈕](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/33ceb68a798060b3961c-128163867-48a0069f-3447-403e-983d-c8286cc6d378.png)
    
    如果要手動封裝專案時若想暫時跳過單元測試執行，可以利用以下命令搭配 `-Dmaven.test.skip=true` 參數：
    
    ```powershell
    mvnw clean package '-Dmaven.test.skip=true'
    ```
    
6.  執行應用程式
    
    預設會跑在 `8080` 連接埠，以下範例為使用 `8081` 連接埠：
    
    ```bash
    java -jar target/demo1-0.0.1-SNAPSHOT.jar --server.port=8081
    ```
    

### 相關連結

-   [Getting Started with Java in VS Code](https://code.visualstudio.com/docs/java/java-tutorial)
-   [Spring Boot in Visual Studio Code](https://code.visualstudio.com/docs/java/java-spring-boot)
-   [Microsoft for Java Developers](https://devblogs.microsoft.com/java/?WT.mc_id=DT-MVP-4015686)
    -   [Hot Code Replacement for Java comes to Visual Studio Code | Java at Microsoft](https://devblogs.microsoft.com/java/hot-code-replacement-for-java-comes-to-visual-studio-code/?WT.mc_id=DT-MVP-4015686)
    -   這裡有很多很棒的部落格文章！
