一、Java 項目目錄結構標準
1.1?Java 項目標準目錄結構總覽
標準 Java 項目目錄結構(以 Maven / Gradle 通用結構為基礎):
project-root/
├── src/
│ ├── main/
│ │ ├── java/ # 主業務邏輯代碼(核心 Java 類)
│ │ ├── resources/ # 配置資源文件(不包含 Java 類)
│ └── test/
│ ├── java/ # 測試代碼(JUnit 單元測試)
│ └── resources/ # 測試時需要用到的資源文件
├── pom.xml # Maven 項目構建文件(Maven 項目)
├── build.gradle # Gradle 項目構建文件(Gradle 項目)
├── README.md # 項目說明文件
├── target/ 或 build/ # 編譯輸出目錄(自動生成)
1.2?各目錄詳細解釋
>1. src/main/java
存放 主程序代碼(Java 源文件
.java
)。按照包結構組織代碼,如
com.example.app
?src/main/java/com/example/app/
示例結構:
src/main/java/
└── com/└── example/├── MainApp.java // 啟動類├── service/│ └── UserService.java└── model/└── User.java
>2. src/main/resources
存放非代碼類資源,如:
application.properties
/application.yml
(Spring Boot 配置)日志配置
log4j.xml
數據庫連接配置
jdbc.properties
模板文件(HTML、freemarker、thymeleaf)
示例結構:
src/main/resources/
├── application.yml
├── logback.xml
└── static/└── index.html
注意:resources 下的文件在構建時會自動加入到 classpath,程序中可以通過ClassLoader.getResourceAsStream()
加載。
>3. src/test/java
存放 測試代碼,一般用于 JUnit 單元測試或集成測試。
包結構應與
src/main/java
保持一致,便于測試類與實際類一一對應。
示例:
src/test/java/
└── com/└── example/└── service/└── UserServiceTest.java
>4. src/test/resources
測試中需要的配置文件、模擬數據(如 JSON、YAML、mock 文件)等,作用同
main/resources
,只在測試中可用。
1.3 項目根目錄常見文件解釋
文件/目錄名 | 說明 |
---|---|
pom.xml | Maven 配置文件(聲明依賴、插件、編譯信息等) |
build.gradle | Gradle 配置文件(同上) |
README.md | 項目說明文件 |
.gitignore | Git 忽略文件配置 |
.idea/ 、.vscode/ | IDE 項目文件 |
target/ 或 build/ | 編譯后生成的 .class 、.jar 等內容 |
1.4?包結構命名規范
包命名建議以公司域名倒序開頭:
com.example.projectname.module
舉例結構:
src/main/java/com/example/blog/
├── BlogApplication.java # 主類
├── controller/ # 控制器層(MVC)
├── service/ # 業務邏輯
├── model/ # 實體類(POJO)
├── repository/ # 持久層(DAO)
└── util/ # 工具類
1.5?構建產物目錄(自動生成)
對應構建工具:
Maven:
target/
Gradle:
build/
這些目錄在執行 mvn package
/ gradle build
后自動生成,用于存放:
編譯后的
.class
文件打包后的
.jar
/.war
測試報告、日志、臨時文件等
不建議手動修改,通常在 .gitignore
中忽略提交。
1.6?標準結構帶來的好處
優點 | 說明 |
---|---|
?清晰模塊分工 | 將業務代碼、測試、資源等分類明確 |
?IDE 支持良好 | IntelliJ IDEA / Eclipse 可直接識別 |
?自動化構建支持 | Maven / Gradle 構建無需額外配置 |
?測試代碼與主邏輯隔離 | 避免生產環境中包含調試/測試代碼 |
?包路徑與文件路徑映射清晰 | com.xxx 對應目錄結構清晰直觀 |
1.7?整體結構圖示意
project-root/
├── src/
│ ├── main/
│ │ ├── java/ ← Java 源碼(包結構)
│ │ └── resources/ ← 配置文件、靜態資源
│ └── test/
│ ├── java/ ← 測試源碼(JUnit)
│ └── resources/ ← 測試用的配置或模擬數據
├── pom.xml / build.gradle ← 構建工具配置
├── target/ 或 build/ ← 編譯輸出(自動生成)
├── README.md ← 項目說明
└── .gitignore ← Git 忽略文件
二、Maven
Maven 是 Java 領域中最常用的 構建工具和依賴管理系統,它的核心職責:
功能 | 說明 |
---|---|
?依賴管理 | 自動下載第三方 jar 包 |
?構建項目 | 編譯、測試、打包、部署 |
?插件系統 | 支持代碼編譯、打包、測試、部署等插件 |
?統一結構 | 使用標準目錄結構,便于協作開發 |
2.1?pom.xml
基本結構
Maven 項目的核心配置文件就是 pom.xml
(Project Object Model)。
一個最基本的 pom.xml
文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId> <!-- 包名(組織ID) --><artifactId>my-app</artifactId> <!-- 項目名 --><version>1.0.0</version> <!-- 項目版本 --><packaging>jar</packaging> <!-- 打包類型:jar/war/pom --></project>
2.2?依賴管理
Maven 依賴通過 <dependencies>
標簽引入:
<dependencies><!-- 1. 生產依賴 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><!-- 2. 測試依賴 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope> <!-- 只在測試時有效 --></dependency></dependencies>
常見的 scope
范圍含義
scope | 說明 |
---|---|
compile | 默認值,主程序運行和編譯都需要(最常用) |
test | 測試階段使用 |
provided | 編譯期需要,運行時不包含(如 Servlet API) |
runtime | 編譯期不需要,運行時需要 |
system | 本地 jar 包,需要手動指定路徑,不推薦使用 |
2.3?依賴倉庫與本地緩存
Maven 會自動從遠程倉庫(默認是 Maven Central)下載 jar 包,并保存在本地倉庫中:
默認本地倉庫路徑:
~/.m2/repository/
如果依賴未指定版本,Maven 會報錯或使用最近一次緩存的版本。
2.4?插件使用(build/plugins)
Maven 構建生命周期依賴插件來實現,比如編譯、打包、測試等。
1)編譯插件示例(maven-compiler-plugin
)
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source> <!-- Java 源碼版本 --><target>1.8</target> <!-- 字節碼版本 --></configuration></plugin></plugins>
</build>
2)打包插件示例(maven-jar-plugin
)
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.2</version><configuration><archive><manifest><mainClass>com.example.MainApp</mainClass> <!-- 指定啟動類 --></manifest></archive></configuration></plugin></plugins>
</build>
打包后就可以直接運行:
java -jar target/my-app-1.0.0.jar
3)常用插件列表
插件名 | 功能 |
---|---|
maven-compiler-plugin | 編譯 Java 代碼 |
maven-jar-plugin | 打包 jar |
maven-surefire-plugin | 運行單元測試 |
maven-dependency-plugin | 依賴分析、復制 |
maven-clean-plugin | 清理 target/ 目錄 |
maven-assembly-plugin | 打包帶依賴的 fat jar |
2.5?完整 pom.xml
示例
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>myapp</artifactId><version>1.0.0</version><packaging>jar</packaging><dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies><build><plugins><!-- 編譯插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- 打包插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.2</version><configuration><archive><manifest><mainClass>com.example.MainApp</mainClass></manifest></archive></configuration></plugin></plugins></build>
</project>
2.6?常用 Maven 命令回顧
命令 | 說明 |
---|---|
mvn clean | 清理 target/ |
mvn compile | 編譯主程序 |
mvn test | 執行測試類 |
mvn package | 編譯 + 打包 |
mvn install | 安裝 jar 到本地倉庫 |
mvn dependency:tree | 查看依賴樹 |
mvn help:effective-pom | 查看完整的有效 POM |
2.7 小結
pom.xml 配置結構:
├── groupId / artifactId / version # 基礎身份
├── dependencies # 依賴管理
├── build
│ └── plugins # 構建插件
│ └── compiler / jar / ...
├── properties # 自定義屬性(如 Java 版本)
└── profiles(可選) # 多環境配置(開發/測試/生產)
三、Gradle
Gradle 是一個現代化、基于 Groovy/Kotlin DSL 的構建工具,用于:
功能 | 描述 |
---|---|
?依賴管理 | 類似 Maven,自動引入 jar 包 |
?構建流程 | 編譯、測試、打包、部署 |
?插件化 | 自定義構建任務,靈活可編程 |
?性能高 | 支持增量構建和緩存機制 |
?Android 開發 | 官方推薦構建工具 |
3.1?Gradle 項目的基本目錄結構
Gradle 項目也遵循和 Maven 相似的標準結構:
project-root/
├── build.gradle ← Gradle 配置文件(核心)
├── settings.gradle ← 項目名與模塊聲明
├── src/
│ ├── main/
│ │ ├── java/ ← 主程序代碼
│ │ └── resources/ ← 資源文件
│ └── test/
│ ├── java/ ← 測試代碼
│ └── resources/
├── build/ ← 編譯輸出目錄(自動生成)
3.2?build.gradle
詳解(Groovy DSL)
下面是一個典型的 Java 項目的 build.gradle
文件結構:
// 1. 插件(功能)
plugins {id 'java' // 應用 Java 插件
}// 2. 項目信息
group = 'com.example' // 組織名稱
version = '1.0.0' // 項目版本// 3. 倉庫(依賴從哪兒下)
repositories {mavenCentral() // 使用中央倉庫
}// 4. 項目依賴
dependencies {// 編譯期依賴(默認)implementation 'org.apache.commons:commons-lang3:3.12.0'// 測試期依賴testImplementation 'junit:junit:4.13.2'
}// 5. 編譯器配置(可選)
tasks.withType(JavaCompile) {options.encoding = 'UTF-8' // 設置文件編碼
}
3.3?依賴導入方式(dependencies 塊)
Gradle 支持多種依賴作用范圍:
1)常見依賴作用域
作用域 | 說明 |
---|---|
implementation | 編譯期 & 運行期依賴(推薦) |
api | 公開依賴(用于庫項目) |
compileOnly | 編譯期依賴(運行時無效) |
runtimeOnly | 運行期依賴(編譯時無效) |
testImplementation | 測試代碼專用依賴 |
2)示例依賴導入
dependencies {// 主程序依賴implementation 'com.google.guava:guava:32.1.2-jre'// 只在測試中用testImplementation 'junit:junit:4.13.2'// 編譯期依賴但不打包compileOnly 'javax.servlet:servlet-api:2.5'// 運行期依賴(不參與編譯)runtimeOnly 'mysql:mysql-connector-java:8.0.33'
}
3)本地 jar 文件依賴
dependencies {implementation files('libs/mylib.jar')
}
4)自定義倉庫
repositories {mavenCentral()mavenLocal()maven {url 'https://repo.spring.io/milestone'}
}
3.4?常用插件及配置
Gradle 插件添加方式(Groovy DSL):
1)Java 插件(編譯 Java 項目)
plugins {id 'java'
}
2)Application 插件(指定 main 方法并允許運行)
plugins {id 'application'
}application {mainClass = 'com.example.MainApp'
}
執行命令:
gradle run
3.5?常用命令
命令 | 功能 |
---|---|
gradle build | 編譯、測試并打包 |
gradle clean | 清理 build 目錄 |
gradle test | 執行測試類 |
gradle run | 運行 main 函數(需配置 application 插件) |
gradle dependencies | 查看依賴樹 |
gradle --offline | 離線構建 |
3.6?補充:settings.gradle 文件
如果是單模塊項目:
rootProject.name = 'myapp'
如果是多模塊項目:
rootProject.name = 'parent-project'
include 'module-a', 'module-b'
3.7 完整 build.gradle
示例
plugins {id 'java'id 'application'
}group = 'com.example'
version = '1.0.0'repositories {mavenCentral()
}dependencies {implementation 'org.apache.commons:commons-lang3:3.12.0'testImplementation 'junit:junit:4.13.2'
}application {mainClass = 'com.example.MainApp'
}tasks.withType(JavaCompile) {options.encoding = 'UTF-8'
}
3.8 小結
build.gradle
├── plugins # 插件(java、application等)
├── group/version # 項目信息
├── repositories # 依賴倉庫(mavenCentral)
├── dependencies # 項目依賴(impl、testImpl)
├── application # 入口類配置(mainClass)
└── tasks.withType # 編譯設置(編碼、警告等)
四、單元測試
JUnit 是 Java 中最常用的單元測試框架,用于對 Java 方法進行自動化測試。
它的作用是:
功能 | 描述 |
---|---|
?自動驗證函數行為 | 比如:加法是否正確、異常是否拋出 |
?回歸測試 | 每次修改后自動跑測試,保證老功能沒出問題 |
?提高質量 | 提高代碼的健壯性和可維護性 |
?自動集成 | 可與 Maven/Gradle/CI/CD 集成自動執行測試 |
4.1?JUnit 常見版本
版本 | 特點 |
---|---|
JUnit 4.x | 最廣泛使用,使用注解 @Test |
JUnit 5.x | 新一代框架,分為 3 個模塊(Jupiter、Platform、Vintage),更強大但結構更復雜 |
這里用最常見的 JUnit 4 講解
4.2?Maven/Gradle 中引入 JUnit
Maven 中添加依賴:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>
Gradle 中添加依賴:
dependencies {testImplementation 'junit:junit:4.13.2'
}
4.3?測試代碼目錄規范
project-root/
├── src/
│ ├── main/
│ │ └── java/com/example/Calculator.java ← 被測試類
│ └── test/
│ └── java/com/example/CalculatorTest.java ← 測試類
測試類放在 src/test/java
,包路徑與主類保持一致
4.4?一個最基本的測試類示例
被測試類(Calculator.java
):
package com.example;public class Calculator {public int add(int a, int b) {return a + b;}public int divide(int a, int b) {return a / b; // 可能拋出異常}
}
對應測試類(CalculatorTest.java
):
package com.example;import org.junit.Test;
import static org.junit.Assert.*;public class CalculatorTest {@Testpublic void testAdd() {Calculator c = new Calculator();int result = c.add(2, 3);assertEquals(5, result); // 斷言結果為 5}@Test(expected = ArithmeticException.class)public void testDivideByZero() {Calculator c = new Calculator();c.divide(10, 0); // 應該拋異常}
}
4.5?常用斷言方法(org.junit.Assert
)
方法 | 說明 |
---|---|
assertEquals(expected, actual) | 判斷相等(值類型) |
assertTrue(condition) | 判斷為 true |
assertFalse(condition) | 判斷為 false |
assertNull(obj) | 判斷為 null |
assertNotNull(obj) | 判斷不為 null |
assertArrayEquals(expected, actual) | 判斷數組相等 |
assertThrows(Exception.class, () -> xxx) | 判斷拋出異常(JUnit 5) |
@Test(expected = Exception.class) | 判斷拋出異常(JUnit 4) |
4.6?測試生命周期注解(JUnit 4)
注解 | 說明 |
---|---|
@Before | 每個測試方法執行前運行(初始化) |
@After | 每個測試方法執行后運行(清理) |
@BeforeClass | 所有測試前執行一次(必須是 static) |
@AfterClass | 所有測試后執行一次(必須是 static) |
@Test | 表示該方法是測試方法 |
示例:
@Before
public void setUp() {System.out.println("每次測試前初始化");
}@After
public void tearDown() {System.out.println("每次測試后清理");
}
4.7?如何運行測試
方式 1:命令行運行
- Maven:
mvn test
- Gradle:
gradle test
方式 2:IDEA 中運行
- 右鍵點擊測試類或方法 → Run
>測試結果展示
測試通過 ? :綠色
測試失敗?? :紅色(IDE 會顯示期望值與實際值差異)
4.8?使用測試套件(Test Suite)
當有很多測試類時,可以用 @RunWith
和 @SuiteClasses
組織一個測試集合:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;@RunWith(Suite.class)
@Suite.SuiteClasses({CalculatorTest.class,OtherTest.class
})
public class AllTests {// 空類,僅用于組合多個測試
}
4.9 小結
測試類結構
├── Calculator.java ← 生產類
├── CalculatorTest.java ← 測試類
│ ├── @Test ← 測試函數
│ ├── assertEquals 等 ← 斷言
│ ├── @Before / @After ← 生命周期鉤子
├── 測試運行方式:mvn test / gradle test / IDE
五、Java 項目運行流程
一個標準 Java 項目的運行流程,大致可以總結為以下 5 步:
1. 確定主類(含 main 方法入口)
2. 編譯源代碼(.java → .class)
3. 加載依賴(jar 包、本地類)
4. 構建 ClassPath(類路徑)
5. JVM 調用 main() 執行程序
5.1?主類(程序入口)
>?什么是主類?
主類是包含 public static void main(String[] args)
方法的類。
public class MainApp {public static void main(String[] args) {System.out.println("Hello, Java!");}
}
main 方法是 Java 應用程序的入口點
它必須是
public static
修飾,接收String[]
作為參數
>?運行方式
通過 IDE(右鍵 → Run
MainApp.main()
)命令行方式:
javac MainApp.java # 編譯成 class 文件
java MainApp # 運行,執行 main 方法
5.2?模塊(module)
1)模塊在標準項目中的含義
在非模塊化(傳統)項目中,“模塊”通常指:
項目中的一個子系統(如
user
,order
,common
模塊)獨立的包結構 + 代碼目錄
例如:
com.example.user
com.example.payment
2)Java 9+ 模塊化系統
Java 9 引入了正式的模塊系統(module-info.java
),但并不是所有項目都使用。
示例:
module com.example.myapp {requires java.sql;exports com.example.myapp.api;
}
初學階段可以不接觸 Java Module System(復雜度較高)
5.3?依賴(第三方/內部)
>?什么是依賴?
Java 項目中調用的 不是你寫的類(外部庫、jar 包),就是依賴。
如:Spring、Guava、Jackson、JDBC Driver
>?依賴加載方式
來源 | 加載方式 |
---|---|
本地 .class 文件 | 自動加載進內存 |
本地 .jar 包 | JVM 通過 classpath 加載 |
遠程依賴(Maven/Gradle) | 會先下載 → 緩存到本地 .m2 或 .gradle 倉庫,然后加入構建路徑 |
示例依賴:使用 commons-lang3
import org.apache.commons.lang3.StringUtils;String str = "abc";
System.out.println(StringUtils.isNotEmpty(str));
這段代碼依賴了 Apache 的 commons-lang3 庫,需要添加:
Maven:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>
Gradle:
implementation 'org.apache.commons:commons-lang3:3.12.0'
5.4?ClassPath 與類加載
> ClassPath 是什么?
ClassPath 是 JVM 在運行時查找
.class
文件的路徑。含義類似 Python 的 sys.path、Linux 的 PATH。
可以通過命令查看:
java -cp target/classes:libs/* com.example.MainApp
> 類加載器(ClassLoader)作用
JVM 使用以下幾種類加載器:
類加載器 | 作用 |
---|---|
BootstrapClassLoader | 加載核心類(rt.jar) |
ExtensionClassLoader | 加載擴展庫(lib/ext) |
AppClassLoader | 加載我們自己的類 |
自定義 ClassLoader | 特殊用途(框架、熱部署) |
5.5?Java 程序執行流程詳解圖
啟動 JVM → 找到入口類 main() → 加載依賴(jar)→ 創建 ClassLoader → 執行方法
圖解:
+------------------+
| java MainApp |
+--------+---------+|v
+------------------------+
| 加載 MainApp.class |
+------------------------+|v
+--------------------------+
| 初始化依賴類(StringUtils)|
+--------------------------+|v
+-------------------+
| 執行 main() |
| 打印輸出 |
+-------------------+
5.6?打包運行流程(.jar)
Maven 打包命令:
mvn clean package
會在 target/
目錄生成 xxx.jar
設置 mainClass 打包運行:
<build><plugins><plugin><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><mainClass>com.example.MainApp</mainClass></manifest></archive></configuration></plugin></plugins>
</build>
運行 jar:
java -jar target/myapp-1.0.0.jar
5.7?實踐建議
使用 Maven 或 Gradle 來管理依賴和構建流程
主類必須有
main()
且所在包正確(IDEA 會自動識別)每個模塊職責明確(如 service、controller、model)
合理組織目錄結構,遵循
src/main/java
標準
5.8?小結
Main Class(main 方法)↓
編譯為 .class↓
查找依賴(內部類 + 外部 jar)↓
由 JVM 的類加載器加載進內存↓
執行 main()↓
運行中的堆/棧/方法棧執行邏輯