Command Palette

Search for a command to run...

[Java Basics] Cài đặt IDE cho Java và tạo project đầu tiên

Bạn đã có JDK. Quyết định tiếp theo là dùng editor nào. Java có một điểm khác biệt ở đây: compiler là một chương trình tách rời khỏi editor, nên một editor không biết gì về javac sẽ không cho bạn type checking, không có autocomplete, và không nhảy tới định nghĩa được — cho tới khi bạn chạy build rồi đọc lỗi.

IDE lấp đúng khoảng trống đó bằng cách giữ một compiler chạy nền trên source của bạn trong lúc gõ. Bài này so sánh ba IDE mà người ta thực sự dùng, cài chúng, tạo project đầu tiên bằng IntelliJ IDEA, giải thích từng thư mục mà wizard sinh ra, và đi qua những lỗi setup chặn người mới ngay ngày đầu tiên.

Chọn IDE cho Java

Toàn bộ nội dung bên dưới được chạy thật trên OpenJDK 21.0.6; mọi thông báo lỗi đều trích nguyên văn từ terminal.

Tại sao Java cần IDE?

Bạn hoàn toàn có thể học Java bằng một text editor và javac, và một bài sau trong series này làm đúng như vậy để bạn thấy IDE đang làm gì thay bạn. Nhưng không ai đi làm theo cách đó, vì bốn lý do rất cụ thể:

  • Incremental compilation. IDE compile ngầm sau mỗi lần gõ, nên một lỗi chính tả được gạch đỏ sau khoảng một giây, thay vì sau cả một lượt build.
  • Autocomplete hiểu type. Standard library của Java rất lớn và tên thì dài. Autocomplete biết static type của biểu thức ngay tại con trỏ sẽ biến list. thành một danh sách đã lọc đúng những gì List<String> làm được.
  • Refactor. Đổi tên một class trong text editor là find-and-replace, và nó sẽ đổi luôn cả chuỗi string trùng tên. Đổi tên trong IDE sửa mọi chỗ tham chiếu, sửa tên file, sửa import — và không đụng vào thứ gì khác.
  • Debugger. Gắn debugger thủ công nghĩa là truyền -agentlib:jdwp=... cho JVM rồi tự nói chuyện với một wire protocol. IDE rút gọn việc đó xuống một cú click vào lề trái.

Về nguyên tắc thì không có gì trong đó chỉ đúng cho Java. Nó quan trọng với Java hơn các ngôn ngữ scripting vì compiler mới là thứ nói cho bạn biết chương trình có đúng hay không, mà compiler thì không nằm trong editor trừ khi bạn tự đưa nó vào.

Nên dùng IDE nào cho Java?

IntelliJ IDEA CommunityIntelliJ IDEA UltimateEclipse IDEVS Code + Extension Pack for Java
GiáMiễn phí, Apache 2.0Trả phí theo subscription; có bản dùng thử, miễn phí cho sinh viên và dự án OSSMiễn phí, EPL 2.0Miễn phí
Mức tiêu tốn bộ nhớNặng — cả IDE chạy trên một JVMNặng, hơn Community một chútTrung bìnhEditor nhẹ nhất, nhưng language server cho Java là một process JVM thứ hai
Tốc độ indexingLần mở đầu index lâu, sau đó rất nhanhNhư CommunityKhông có index toàn cục kéo dài; builder incremental khởi động nhanhIndex chạy nền; lần đầu có thể chờ một lúc main mới chạy được
Hỗ trợ Spring / JakartaKhông có sẵnRất mạnh: Spring, Jakarta EE, JPA, HTTP clientQua plugin (Spring Tools 4, Eclipse Web Tools)Qua extension rời (Spring Boot Extension Pack)
Maven / GradleCó sẵn cả hai, mở project cũ là tự importCó sẵn cả haiMaven qua m2e (đi kèm), Gradle qua BuildshipCả hai qua extension đi kèm
Hợp với người mớiTốt nhất — wizard rõ ràng nhất, inspection giải thích kỹ nhấtỔn, nhưng bạn chưa cần tới thứ gì trong đóDùng được; workspace model và giao diện cũ làm bạn mất thời gianTốt nếu bạn vốn đã dùng VS Code; khả năng refactor yếu nhất trong ba

Hãy dùng IntelliJ IDEA Community Edition. Nó miễn phí, không bắt bạn chọn plugin trước khi tạo được project, và thông báo inspection của nó giải thích vấn đề chứ không chỉ báo đỏ — đó chính là toàn bộ giá trị của một IDE khi bạn còn đang học ngôn ngữ.

Apache NetBeans là lựa chọn thứ tư và thực sự không tệ — miễn phí, Apache 2.0, hỗ trợ Maven và Gradle tốt, kèm một GUI builder cho Swing nếu bạn cần. Nó chỉ nằm ở mức chú thích tại đây vì cộng đồng nhỏ hơn nhiều, nên khi bạn dán một lỗi lên công cụ tìm kiếm, thứ bạn nhận về sẽ là câu trả lời cho IntelliJ và Eclipse.

Cài đặt IntelliJ IDEA, Eclipse và VS Code

Chỉ cần cài một. Hai cái còn lại có mặt ở đây để sau này bạn theo dõi được màn hình của đồng nghiệp.

IntelliJ IDEA: tải trực tiếp hay dùng JetBrains Toolbox

Hai đường:

  • Tải trực tiếp từ trang JetBrains. Chọn bản Community Edition đúng OS và đúng CPU — trên máy Apple silicon phải lấy bản aarch64, không phải bản Intel, nếu không IDE chạy qua lớp giả lập và rất ì. Bộ cài .exe trên Windows có hỏi thêm về PATH và file association; cả hai đều không bắt buộc.
  • JetBrains Toolbox App, một launcher nhỏ lo việc cài, cập nhật và quay lui phiên bản cho mọi IDE của JetBrains. Chọn đường này nếu bạn định dùng nhiều sản phẩm JetBrains hoặc muốn khỏi lo update. Cái giá là thêm một process chạy nền.

Cả hai đường đều không cài JDK giúp bạn, nhưng IntelliJ có thể tải một JDK ngay trong hộp thoại New Project nếu nó không tìm thấy cái nào.

Eclipse: dùng installer hay bản đóng gói sẵn

Cũng hai đường, và khác biệt ở đây đáng chú ý hơn ở IntelliJ:

  • Eclipse Installer (eclipse-inst) hỏi bạn muốn bản nào rồi mới tải về. Chọn Eclipse IDE for Java Developers — gói nhỏ nhất mà vẫn đủ dùng. Các mục còn lại kèm theo tooling cho C++, PHP hay Jakarta EE mà bạn sẽ không đụng tới.
  • Bản đóng gói sẵn, là file .zip / .tar.gz / .dmg của chính bản đó. Giải nén rồi chạy. Không có gì được ghi ra ngoài thư mục đó, nên bạn giữ song song hai phiên bản Eclipse rất dễ.

Lần chạy đầu tiên Eclipse hỏi thư mục workspace. Đó không phải là project — xem phần Eclipse ở dưới.

VS Code: Extension Pack for Java

VS Code không hỗ trợ Java sẵn. Hãy cài Extension Pack for Java (publisher là Microsoft), thực chất là một gói gồm sáu extension:

ExtensionNhiệm vụ
Language Support for Java™ by Red HatLanguage server: compile, báo lỗi, completion, refactor
Debugger for JavaBreakpoint, step, xem giá trị biến
Test Runner for JavaChạy và báo cáo test JUnit, TestNG
Maven for JavaCây project Maven, lifecycle goal, archetype
Project Manager for JavaView Java Projects, source root, referenced libraries
IntelliCodeGợi ý completion có xếp hạng

⚠️ Language server của Red Hat bản thân nó là một chương trình Java và cần JDK 17 trở lên để chạy, tách biệt hoàn toàn với JDK mà project của bạn nhắm tới. Nếu máy bạn chỉ có JDK 11 thì extension sẽ không khởi động. Trỏ nó sang một JDK mới bằng setting java.jdt.ls.java.home, còn JDK của project thì khai báo riêng trong java.configuration.runtimes.

Tạo project đầu tiên trong IntelliJ IDEA

Theo đường menu, từ màn hình welcome hoặc từ File | New | Project…:

  1. Ở cột trái của hộp thoại New Project, chọn New Project (mục Java thuần — không phải Maven Archetype, không phải Spring).
  2. Name: demo. Location: nơi bạn để code. IntelliJ tạo <location>/demo.
  3. Language: Java.
  4. Build system: IntelliJ, Maven hoặc Gradle. Chọn IntelliJ.
  5. JDK: chọn JDK bạn đã cài. Nếu danh sách rỗng, mở ra và chọn Download JDK….
  6. Cứ để Add sample code được tick, và bỏ tick Create Git repository nếu bạn chưa cần.
  7. Create.

Về lựa chọn build system: IntelliJ nghĩa là IDE tự compile project, không có file build nào cả — đó là câu trả lời đúng cho một project không có dependency và không rời khỏi máy bạn. MavenGradle thêm một file build (pom.xml hoặc build.gradle) để khai báo dependency và build được project mà không cần IDE — cần thiết ngay khi bạn thêm thư viện bên thứ ba hoặc đưa vào CI, và nên chuyển sang lúc đó chứ không phải bây giờ.

Khi Add sample code được tick, IntelliJ sinh ra một class Main với method main in ra một lời chào. Nội dung cụ thể thay đổi theo phiên bản IntelliJ; phần luôn giống nhau là bộ khung:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

Từng chữ trong file đó có ý nghĩa gì là nội dung của bài tiếp theo. Còn bây giờ nó chỉ là thứ IDE vừa sinh ra để có cái mà chạy.

Cấu trúc project và ý nghĩa từng thư mục

Một project Java do IntelliJ tự build có cấu trúc rất gọn:

demo/
  .idea/          config của IDE
  src/            source root — các file .java của bạn
  out/            file .class sau khi compile
  demo.iml        định nghĩa module

Nếu chọn Maven hoặc Gradle, bạn nhận được cấu trúc mà phần còn lại của thế giới Java đang dùng:

Cấu trúc project Java và quy tắc package

Đường dẫnChứa gì
src/main/javaSource chính. Đây là source root: tên package được tính tương đối so với nó.
src/main/resourcesFile chương trình đọc lúc runtime — .properties, .json, template. Quá trình build copy chúng nằm cạnh các class để chúng có mặt trên classpath.
src/test/javaClass test. Là một source root riêng, nên test nhìn thấy code chính còn chiều ngược lại thì không.
out/ hoặc target/classesKết quả compile — mỗi class một file .class, đặt trong các thư mục phản chiếu đúng package. Không sửa tay, không commit.
.idea/Trạng thái riêng của IntelliJ: misc.xml (project SDK và language level), modules.xml, compiler.xml, và workspace.xml chứa trạng thái giao diện của từng người nên để ngoài version control.

Thư mục resources hay làm người ta vấp: file phải lên được classpath chứ không chỉ nằm trên đĩa. Nếu nó không được copy, getResourceAsStream trả về null và bạn thấy cái này thay vì một lỗi thiếu file:

Exception in thread "main" java.lang.NullPointerException: inStream parameter is null

Quy tắc làm hỏng project đầu tiên của mọi người

Package của một class phải khớp với đường dẫn thư mục chứa nó, tính từ source root. File nằm ở src/main/java/com/example/App.java bắt buộc phải mở đầu bằng package com.example;, không được là gì khác.

Compiler cho thấy điều đó rất rõ. Compile đúng cấu trúc thì class rơi đúng chỗ mà package đã khai:

javac -d out src/main/java/com/example/App.java
java -cp out com.example.App
Hello, World!

Cờ -d out không bỏ class thẳng vào out/ — nó dựng lại nguyên đường dẫn package bên dưới:

out/com/example/App.class

Giờ phá nó đi. Chuyển Greeter.java lên thẳng source root trong khi vẫn khai package com.example;, rồi compile class đang dùng nó:

javac -d out -sourcepath src/main/java src/main/java/com/example/Main.java
src/main/java/com/example/Main.java:5: error: cannot find symbol
        System.out.println(Greeter.greet("World"));
                           ^
  symbol:   variable Greeter
  location: class Main
1 error

Compiler đi tìm com.example.Greeter dưới src/main/java/com/example/, vì tên package nói rằng nó phải nằm ở đó, và không thấy. IntelliJ báo đúng tình trạng này dưới dạng Cannot resolve symbol 'Greeter', kèm một cảnh báo ngay trên dòng package.

Hai lỗi họ hàng cũng sinh ra từ chính quy tắc đó. Một public class có tên không trùng tên file thì bị từ chối thẳng:

src/main/java/com/example/Greeting.java:3: error: class Greeter is public, should be declared in a file named Greeter.java
public class Greeter {
       ^
1 error

Và một class đã compile mà chạy từ sai gốc classpath sẽ hỏng lúc load, với thông báo chỉ đích danh chỗ lệch:

java -cp out/com/example App
Error: Could not find or load main class App
Caused by: java.lang.NoClassDefFoundError: App (wrong name: com/example/App)

File class nhớ package mà nó được compile cùng. Hãy trỏ classpath vào thư mục chứa com/, đừng bao giờ trỏ thẳng vào thư mục package.

Chạy chương trình

Mở Main.java. Một tam giác xanh xuất hiện ở lề trái, cạnh khai báo class và cạnh main. Bấm vào đó rồi chọn Run 'Main.main()'.

Ba việc xảy ra. IntelliJ compile module ra out/production/demo, nó lặng lẽ tạo một run configuration tên Main, và mở cửa sổ Run ở dưới cùng để hiện output. Run configuration giờ đã nằm trong dropdown ở thanh công cụ góc trên bên phải, nên những lần chạy sau chỉ tốn một cú click hoặc một phím tắt — bạn không cần quay lại cái tam giác đó nữa.

IDE làm gì khi bạn bấm nút Run

Không có gì huyền bí ở đây: mỗi bước đều ứng với một argument mà một bài sau trong series này sẽ tự gõ tay cho javacjava.

Cửa sổ Run hiện dòng lệnh đầy đủ ở trên cùng, System.outSystem.err của chương trình xen kẽ nhau, và exit code ở cuối:

Process finished with exit code 0

Exit code khác 0 hoặc một stack trace nghĩa là chương trình chết; stack trace trong cửa sổ đó bấm được, mỗi frame nhảy thẳng tới dòng tương ứng.

Program arguments

main(String[] args) nhận đúng những gì được truyền trên dòng lệnh. Trong IDE, chỗ để điền là run configuration: Run | Edit Configurations…, chọn configuration Main, rồi điền vào ô Program arguments. Gõ alpha beta cho ra kết quả y hệt việc truyền chúng cho java:

java -cp out com.example.App alpha beta
Hello, World!
arg: alpha
arg: beta

Ô VM options ngay bên cạnh là chuyện khác: những giá trị đó đi vào JVM (-Xmx512m, các property -D), không đi vào chương trình của bạn.

Đặt breakpoint và step một dòng

Bấm vào lề trái, ngay số dòng của lệnh System.out.println — một chấm đỏ hiện ra. Giờ chạy đúng configuration đó bằng Debug thay vì Run.

Chương trình dừng lại trước khi dòng đó chạy. Cửa sổ Debug hiện call stack bên trái và toàn bộ biến đang trong scope bên phải, gồm cả args. Bấm F8 để step qua một dòng và nhìn output hiện ra; F7 thì step vào trong method được gọi; F9 chạy tiếp tới breakpoint kế. Bỏ breakpoint bằng cách bấm lại vào chấm đỏ.

Vòng lặp chỉ có vậy, và nó thay thế phần lớn kiểu debug bằng System.out.println mà bạn sẽ phải viết nếu không có nó.

Những settings nên đổi ngay ngày đầu

Mở settings bằng Cmd+, trên macOS hoặc Ctrl+Alt+S trên Windows và Linux.

SettingỞ đâuVì sao
Cỡ font editorEditor → FontMặc định khá nhỏ trên màn hình lớn; 14–16pt là cỡ làm việc bình thường.
Add unambiguous imports on the flyEditor → General → Auto ImportList là tự thêm import java.util.List; mà không cần popup. Bật luôn Optimize imports on the fly ngay bên cạnh để bỏ import thừa.
Show whitespacesEditor → General → AppearanceLàm một dấu tab lạc vào file dùng space trở nên nhìn thấy được, thay vì thành chuyện bí ẩn.
File encodings → UTF-8Editor → File EncodingsĐặt Global, ProjectDefault encoding for properties files đều là UTF-8; chỉ tick Transparent native-to-ASCII conversion nếu buộc phải sửa file .properties cũ.
Code styleEditor → Code Style → JavaMặc định đã theo đúng convention của Java: 4 space, không dùng tab. Cứ để nguyên, và reformat bằng Cmd+Alt+L / Ctrl+Alt+L trước mỗi lần commit.

Về encoding: từ JDK 18, charset mặc định của JVM là UTF-8 trên mọi nền tảng (JEP 400). Trên JDK 21 dùng cho bài này, một chương trình in ra:

file.encoding   = UTF-8
native.encoding = UTF-8

Setting trong IDE vẫn quan trọng, vì nó quyết định editor ghi byte ra đĩa theo kiểu nào, và vì javac trên các JDK cũ hơn đọc source theo charset mặc định của hệ thống trừ khi bạn truyền -encoding UTF-8.

Những shortcut IntelliJ nên thuộc trước

Đây là mặc định của keymap macOS và keymap Windows.

Thao tácmacOSWindows / Linux
Chạy configuration hiện tạiCtrl+RShift+F10
Chạy thứ đang ở dưới con trỏCtrl+Shift+RCtrl+Shift+F10
Debug configuration hiện tạiCtrl+DShift+F9
Reformat codeCmd+Alt+LCtrl+Alt+L
Optimize importsCmd+Alt+OCtrl+Alt+O
Đổi tên (refactor)Shift+F6Shift+F6
Nhảy tới khai báoCmd+BCtrl+B
Tìm nơi sử dụngAlt+F7Alt+F7
Search everywhereShift, ShiftShift, Shift
Generate (constructor, getter, toString)Cmd+NAlt+Insert
Comment / bỏ comment dòngCmd+/Ctrl+/
Bật tắt breakpointCmd+F8Ctrl+F8
SettingsCmd+,Ctrl+Alt+S

Nếu chỉ nhớ được hai, hãy nhớ Search everywhere (bấm Shift hai lần — tìm class, file, setting và cả action trong cùng một ô) và Generate, thứ viết hộ bạn đống boilerplate mà Java vốn nổi tiếng.

Các bước tương đương trong Eclipse và VS Code

Eclipse

Khái niệm trung tâm của Eclipse là workspace: một thư mục chứa các project của bạn cộng thêm thư mục .metadata/ đựng settings của chính Eclipse. Những tùy chọn như formatter hay JRE mặc định gắn với từng workspace chứ không phải toàn cục, nên đổi workspace là đổi luôn settings. Cứ dùng một workspace duy nhất lúc này.

File → New → Java Project. Đặt tên, để nguyên Use default location, chọn JRE, và bỏ tick Create module-info.java file — khai báo module là thứ rắc rối bạn chưa cần. Eclipse tạo ra src/bin/ cùng hai file ẩn .project.classpath, tương đương với .idea/ bên IntelliJ.

Package Explorer bên trái là cây project; lưu ý mặc định nó hiện package dưới dạng tên phẳng kiểu com.example chứ không phải thư mục lồng nhau — tùy chọn Package Presentation → Hierarchical trong menu của view đổi lại điều đó, và giúp bạn nhìn cấu trúc thư mục dễ hơn nhiều khi quy tắc package còn mới với bạn.

Chuột phải vào class → Run As → Java Application, hoặc Ctrl+F11. Vài phím tắt đáng nhớ: Ctrl+Shift+F reformat, Alt+Shift+R đổi tên, F3 mở khai báo, Ctrl+Shift+G tìm nơi tham chiếu, Ctrl+Shift+R mở nhanh file theo tên.

VS Code

VS Code mở thư mục, không mở project. Hãy mở đúng thư mục chứa src/ — cao hơn hoặc thấp hơn một cấp là language server không nhận ra source root. Thư mục có pom.xml hoặc build.gradle ở gốc thì được nhận diện tự động; thư mục trơn thì được coi là project không có build tool, với src/ làm source root.

View Java Projects trong sidebar Explorer liệt kê source root, referenced libraries và JDK đang dùng; nút Create Java Project ở đó là thứ gần nhất với wizard của IntelliJ, hỏi bạn loại project (No build tools, Maven, Gradle) và vị trí lưu.

Phía trên mỗi method main, extension vẽ một code lens Run | Debug. Bấm Run tương đương Ctrl+F5; DebugF5 và sẽ dừng ở các breakpoint bạn đặt bằng cách bấm vào lề. Format bằng Shift+Alt+F. Khi completion hoặc lỗi không chịu cập nhật, chạy Java: Clean Java Language Server Workspace từ Command Palette — tương đương việc invalidate caches bên IntelliJ.

Xử lý các lỗi setup thường gặp

Triệu chứngNguyên nhânCách sửa
Đỏ hết cả file, Cannot resolve symbol 'String'Chưa đặt project SDK. IntelliJ hiện chữ J đỏ trên module và banner Project SDK is not definedFile → Project Structure → Project → SDK, chọn một JDK. Đặt Language level cho khớp.
Cannot resolve symbol 'Greeter' với class do chính bạn viếtpackage của file không khớp thư mục, hoặc file nằm ngoài source rootChuyển file cho đường dẫn khớp package, hoặc sửa dòng package. Đánh dấu đúng thư mục là Sources Root qua chuột phải → Mark Directory as.
Error: Could not find or load main class AppChạy với gốc classpath không phải gốc packageTrỏ classpath vào thư mục chứa com/, không phải vào com/example/.
NoClassDefFoundError: App (wrong name: com/example/App)Vẫn là lệch đó, nhưng bị bắt lúc load class — file .class tự ghi nhớ package của nóNhư trên. Nhớ compile lại sau khi chuyển file, đừng chạy bản cũ.
error: class Greeter is public, should be declared in a file named Greeter.javaTên public class và tên file khác nhauĐổi tên file, hoặc đổi tên class bằng Shift+F6 để IDE đổi cả hai.
Error: Main method not found in class NoMainClass không có public static void main(String[] args)Thêm vào, hoặc chạy class có nó. Thông báo đầy đủ trích ở dưới.
Code đúng vẫn bị gạch đỏ; completion cũ; IDE bảo một class không tồn tạiIndex của IDE lạc hậu, thường sau khi đổi branch hoặc file bị sửa từ bên ngoàiFile → Invalidate Caches…, tick Clear file system cache and Local History, rồi Invalidate and Restart.

Hai dòng đầu thực ra là cùng một tình huống — một thư mục mà IDE chưa bao giờ được cho biết phải đối xử thế nào:

Thư mục mở như file rời so với chính thư mục đó mở như một project

Thông báo thiếu main nói thẳng ra chữ ký mà nó cần, và đó là cách nhanh nhất để phát hiện lỗi gõ kiểu String args thay vì String[] args:

Error: Main method not found in class NoMain, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Hãy để Invalidate Caches làm cách cuối, đừng làm đầu tiên. Nó vứt bỏ index và bắt quét lại từ đầu, với project lớn thì mất vài phút; trong khi lỗi project SDK hay lỗi đường dẫn package khả năng cao hơn nhiều và chỉ mất vài giây để kiểm tra.

FAQ

IntelliJ IDEA Community có đủ không, hay phải mua Ultimate? Community đủ cho toàn bộ series này và cho công việc Java thuần nói chung. Ultimate xứng đáng với giá của nó ở Spring, Jakarta EE, JPA và tooling cho database — những thứ bạn chưa viết tới. Có bản dùng thử miễn phí, và có license miễn phí cho sinh viên và dự án open-source nếu bạn muốn xem thử.

Có IDE với compiler sẵn rồi thì còn cần JDK không? Vẫn cần. IntelliJ và Eclipse có compiler incremental riêng để báo lỗi trong editor, nhưng chúng compile và chạy dựa trên một JDK do bạn chọn, còn VS Code thì gọi thẳng javac. Không có JDK thì không có project.

Sao class mới tạo đã đỏ lòm khi tôi chưa viết gì? Gần như luôn là do chưa đặt project SDK, hoặc file không nằm dưới source root. Kiểm tra Project Structure → Project → SDK trước, rồi kiểm tra thư mục chứa src đã được đánh dấu Sources Root chưa.

Mở một project Maven hoặc Gradle có sẵn mà không qua wizard được không? Được — File → Open rồi chọn pom.xml hoặc build.gradle. IntelliJ import dependency, source root và thư mục output từ file build. Làm vậy với một project Java thuần thì lại ra một module chưa được cấu hình.

out/, target/.idea/ có nên đưa vào Git không? Không, với out/target/ — chúng là thứ sinh ra. Với .idea/, hãy commit misc.xml, modules.xml, compiler.xml và các file code style nếu cả team dùng chung settings; luôn loại trừ workspace.xmlshelf/ vì chúng thuộc về từng người.

VS Code có phải lựa chọn tệ cho Java không? Không, chỉ là đánh đổi khác: khởi động nhanh hơn, tốn bộ nhớ ít hơn, nhưng bộ refactor nhỏ hơn và tooling riêng cho Java thì phải tự lắp từ các extension. Nếu bạn vốn sống trong VS Code, Extension Pack for Java là điểm bắt đầu hoàn toàn ổn.

Kết luận

Giờ bạn đã có IDE, có project, và có hình dung về thứ wizard vừa tạo ra: một source root mà cấu trúc thư mục của nó chính là cấu trúc package, một thư mục output phản chiếu lại đúng cấu trúc đó bằng các file .class, và một run configuration nối hai thứ lại. Phần lớn rắc rối trong tuần đầu học Java là một trong ba lỗi bạn vừa thấy — chưa đặt project SDK, package không khớp đường dẫn, hoặc classpath trỏ sai gốc — và mỗi lỗi đều có thông báo nói rõ nó là cái nào.

Bài tiếp theo mở đúng file mà wizard vừa sinh ra và đọc nó từng dòng: viết Hello World từ đầu, và giải phẫu một file .javapublic, class, staticString[] args mỗi thứ nghĩa là gì, và vì sao main bắt buộc phải trông đúng như vậy.

Bài viết liên quan

[Java Basics] Mảng một chiều trong Java: khai báo, khởi tạo và duyệt mảng

Hướng dẫn đầy đủ về mảng một chiều trong Java - mọi cách khai báo, giá trị mặc định, field length, index và ArrayIndexOutOfBoundsException, duyệt mảng bằng for và for-each, cái bẫy reference, copy thật với Arrays.copyOf và System.arraycopy, cùng Arrays.equals, mọi ví dụ đều compile và chạy trên JDK 21.

[Java Basics] Vòng lặp lồng nhau, break và continue trong Java

Vòng lặp lồng nhau trong Java và hai keyword cắt ngang vòng lặp: số lần thân vòng lặp trong chạy, break chỉ thoát vòng lặp gần nhất, continue bỏ qua update trong while, labeled break và continue, cùng bẫy switch nằm trong loop.

[Java Basics] Câu lệnh điều kiện trong Java: if, else if, else và switch

Câu lệnh điều kiện trong Java: chuỗi if / else if / else, vì sao phải có ngoặc nhọn, bẫy dangling else, điều kiện chỉ nhận boolean, switch với break và fall-through, label mũi tên, switch expression cùng yield và pattern matching của Java 21.

[Java Basics] Nhập xuất dữ liệu trong Java với Scanner và bẫy nextLine

Cách nhập xuất dữ liệu trong Java với Scanner: nextInt và nextLine, bẫy chuỗi rỗng, InputMismatchException, validate bằng hasNextInt, bẫy locale của nextDouble và định dạng bằng printf.