安裝 | Quick Start | Package套件管理 | Logging | 開發工具 | Spring Boot Web | 部署 | Template Engine | Concurrency | Appendix
Intro
JVM
JVM (Java Virtual Machine - Java虛擬機),能夠執行Java位元組碼且以堆疊結構機器實做的虛擬機器。它有自己的硬體架構,如處理器、堆疊、暫存器等,還具有相應的指令系統。
JVM 封鎖了與具體作業系統平台相關的資訊,使得Java程式只需生成在 JVM 上執行的目的碼(位元組碼),就可以在多種平台上執行。通過對中央處理器(CPU)所執行的軟體實作,實現能執行編譯過的Java程式碼 (Applet與應用程式)。
(References: Wikipedia & JVM Architecture Diagram)
JRE & JDK安裝
1. 安裝JRE:
# Ubuntu
$ sudo apt install default-jre
驗證JAVA版本:
$ java -version
2. 安裝JDK (一般會包含JRE)
# Ubuntu
$ sudo apt install default-jdk
使用JAVAC驗證版本:
$ javac -version
管理與選擇JAVA版本
若有安裝不同版本JAVA則可以透過update-alternatives
指令選擇預設版本:
$ sudo apt install openjdk-{version}-jdk openjdk-{version}-jre
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
Quick Start
HelloWorld編譯測試
測試撰寫一支HelloWorld.java
檔案以供編譯:
public class HelloWorld {
public static void main (String[] args) {
System.out.printf("Hello World");
}
}
使用javac
指令編譯該程式檔案:
$ javac HelloWorld.java
使用java
執行編譯產生出來的Class(HelloWorld.class)名稱:
$ java HelloWorld
常用函數
System.out.println("HelloWorld");
System.exit(0);
語言特性
-
Java class main() method: JVM 啟動調用 class 預設呼叫的 method,故須為 public。
-
Command-Line Arguments: main() 的 arguments 可透過 command line 帶入,IDE 則設定 Run/Debug Configuration for Application 時可設定 arguments。
JAVA Package套件管理
Maven Central支援多種Dependency工具,對應工具的安裝方法可以參考官網,例如套件:org.apache.httpcomponents.client5:httpclient5:5.1
Namespace 規則:{Group ID/Artifact ID}:{Package name}
(與 Github 無關聯)
Maven Project
Maven專案使用專案物件模型(Project Object Model,POM)來組態。 專案物件模型儲存在名為 pom.xml
的檔案中。
Maven 專案 user setting file 設定可以參考:Settings Reference - Maven
Gradle
Gradle是一個基於Apache Ant和Apache Maven概念的專案自動化建構工具,預設來源套件庫一樣使用mavenCentral()
。
可以透過安裝並指令執行Gradle以建立專案,或直接用IDE建立: Building Java Applications Sample
透過修改build.gradle
設定dependencies,完成後 Load Gradle Changes 時即會更新套件:Managing Dependencies of JVM Projects
Logging
Java built-in java.util.logging
Config / Properties
Confidential Properties
如果為 confidential Properties
.gitignore
加入要載入的檔案path/to/credential.properties
- 另外可以建立
path/to/credential-sample.properties
作為 Preperties 範例檔
開發工具 (JetBrains - IntelliJ IDEA)
Create New Project (建立全新專案)
Project JDK 版本請選擇環境上所偵測到的 JAVA 路徑。 以及選擇 build system (如 Maven 和 Gradle) 建立專案進行撰寫與執行輸出即可。
Spring Boot Web
Spring Boot 也可以搭配 IntelliJ IDEA Community 版本開發,可以利用線上版 Spring Initializr 產生下載 Project 檔案以供匯入專案進行開發。
Spring Quick Start: https://spring.io/quickstart
Dependencies 選擇 Spring Web (org.springframework.boot:spring-boot-starter-web)
匯出 zip 檔解包後,將資料夾使用 IntelliJ Open project,進入後會自動 Build Project, Project 完成可用後可以從左側導覽列點進資料夾路徑src/main/java/{project-domain}
找 Application 檔案右鍵執行Run
來測試啟動 Spring Boot Web, 可以看到預設會在localhost:8080
上啟動服務(Tomcat initialized with port(s): 8080 (http)
)。
若要自建 Spring Boot Web 專案,主要需要依照專案添加 Spring Boot Build Tool Plugins 後,再引入套件 org.springframework.boot:spring-boot-starter-web,之後參考 Spring Quick Start 建出 Application 啟動點。
Controller 建立
Spring Initializr 專案預設沒有 Controller,可以在左側導覽點選資料夾路徑src/main/java/{project-domain}
並點開滑鼠右鍵選單: New > Java Class, 建立一個 Controller 例如HelloController
,Class 內容會自動填好 package,往下自行來撰寫Code,範例如下:
package com.example.demo;
import org.springframework.web.bind.annotation.*;
@RestController
public class HelloController {
@GetMapping("/")
public String index() {
return "Welcome to Spring Boot!";
}
@GetMapping("/hello")
public String hello() {
return "Hello";
}
}
部署
JAVA 專案的打包(package)格式主要區分為兩種:
- JAR (Java Archive)
- WAR (Web Application Archive)
是一種JAR檔案,其中包含用來分發的JSP、Java Servlet、Java類、XML檔案、標籤庫、靜態網頁(HTML和相關檔案),以及構成Web應用程式的其他資源。在搭配 Web server 的架構下一般都是使用 WAR 文件運行。
Spring-boot 這種內嵌式 Tomcat Web server 整包框架則可直接使用 JAR 文件運行實現
JAR
打包可執行的JAR檔需要設定 Manifest 檔案,流程與範例可以參考 Java™ Tutorials - Setting an Application's Entry Point
Lesson: Packaging Programs in JAR Files (The Java™ Tutorials > Deployment)
Gradle 打包可以參考:Building Java Projects with Gradle
SpringBoot project 可以直接在專案根目錄執行 Shell gradle build
完成打包,透過 java -jar project.jar
啟動執行。
Template Engine
這裡以 Thymeleaf 搭配 Spring 快速 Demo:
-
引入 Thymeleaf Dependency,Gradle範例如下:
implementation 'org.thymeleaf:thymeleaf-spring6'
-
在預設路徑
src/main/resources/templates
下建立View檔案,例如hello.html
:<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> ... </head> <body> <h1 th:text="${headerName}"> </h1> </body> </html>
-
建立 Controller:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.ui.Model; @Controller public class DemoController { @GetMapping("/hello") public String hello(Model model) { model.addAttribute("headerName", "Hello Thymeleaf"); return "hello"; } }
Concurrency (並發/並行)
Multi-Threading
JAVA 原生 liberaries:
- java.lang.Thread: JAVA 基本 thead class (範例)
- java.util.concurrent.Executor: 簡易的 thread pool 用來執行異步執行任務 (範例)
- java.util.concurrent.ExecutorService: Executor 的子類,提供更完善的方法來管理和控制 thread pool (範例)
Mutli-Processing
References
Appendix
HTTP Client
-
JAVA內建的HTTP Client為
URLConnection
: -
較熱門使用的HTTP Client套件為
Apache HttpClient
:
JAVA HTTP Client範例程式碼:JAVA HTTP Client Sample codes