Program latihan kita sejauh ini selalu satu-dua berkas di satu folder. Cepat atau lambat jumlah berkas akan bertambah: puluhan class, berkas data, konfigurasi, kode pengujian. Pada titik itu, proyek tanpa tata letak menjadi beban: class sulit dicari, kode tercampur dengan data, dan IDE pun sulit menebak maksud tiap folder. Kabar baiknya, dunia Java lama sepakat pada satu tata letak standar. Pada Chapter penutup Section ini kita akan mempelajari struktur tersebut: package, folder sumber, folder resources, dan berkas build yang menjaganya.
Dari Berkas Tunggal ke Paket Terstruktur #
Kita sudah melihat pada Chapter Menjalankan Program Java bahwa mode satu berkas menempatkan class di unnamed package. Konsep package adalah cara Java mengelompokkan class: com.toko.AplikasiInventaris berarti class AplikasiInventaris hidup di dalam package com.toko. Aturan mekanisnya ketat — deklarasi package com.toko; di dalam berkas menuntut berkas itu berada di direktori com/toko/. Kompiler javac menolak berkas yang jalurnya tidak cocok dengan deklarasi package-nya.
Kelompok direktori yang mencerminkan nama package inilah fondasi struktur proyek. Tambahkan kebutuhan lain — memisahkan kode dari data, memisahkan kode utama dari kode uji — dan kita tiba pada tata letak yang dipakai hampir seluruh proyek Java di dunia.
Tata Letak Standar Maven #
Tata letak berikut dipopulerkan build tool Maven dan diadopsi Gradle beserta seluruh IDE besar — disebut Maven Standard Layout. Struktur proyek aplikasi-inventaris tampak seperti ini:
aplikasi-inventaris/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/toko/AplikasiInventaris.java
│ │ └── resources/
│ │ └── daftar-barang.txt
│ └── test/
│ └── java/
│ └── com/toko/AplikasiInventarisTest.java
└── pom.xmlEmpat bagian pentingnya:
src/main/java— seluruh kode program. Struktur direktori di bawahnya mengikuti nama package (com/tokountuk packagecom.toko).src/main/resources— data yang ikut terpakai oleh program: berkas teks, gambar, konfigurasi. Isinya bukan kode, tetapi program dapat memuatnya saat berjalan.src/test/java— kode pengujian otomatis, terpisah dari kode utama agar tidak ikut terkirim ke pengguna.pom.xml— berkas build yang menjelaskan proyek ke build tool.
Pemisahan main dan test disebut source set: kelompok sumber yang dikompilasi dengan tujuan berbeda. IDE mengenali keduanya secara otomatis.
Contoh Mini: Kode dan Data Terpisah #
Mari kita rasakan manfaat pemisahan java dan resources pada contoh mini. Program inventaris berikut tidak lagi menyimpan daftar barang di dalam kode — program membacanya dari berkas daftar-barang.txt yang berada satu folder dengannya:
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
public class AplikasiInventaris {
public static void main(String[] args) throws IOException {
List<String> daftar = Files.readAllLines(Path.of("daftar-barang.txt"), StandardCharsets.UTF_8);
System.out.println("Inventaris toko Budi:");
for (String barang : daftar) {
System.out.println("- " + barang);
}
System.out.println("Total item: " + daftar.size());
}
}Output yang Dihasilkan:
Inventaris toko Budi:
- Buku Tulis 2500
- Pulpen 3000
- Penghapus 1500
Total item: 3Isi berkas daftar-barang.txt yang menyertai program:
Buku Tulis 2500
Pulpen 3000
Penghapus 1500Mari kita telaah bagian-bagian barunya:
- Baris 1-6 (
import ...): mengimpor class pustaka standar —FilesdanPathuntuk membaca berkas,StandardCharsetsagar teks dibaca sebagai UTF-8,Listuntuk menampung hasil. - Baris 9 (
throws IOException): membaca berkas dapat gagal bila berkasnya tidak ada; Java meminta kemungkinan itu diakui eksplisit di tanda tanganmain. Mekanisme ini dibahas tuntas pada Section Dasar Pemrograman. - Baris 10 (
Files.readAllLines(...)): membaca seluruh isi berkas menjadiList<String>— satu elemen untuk tiap baris. ArgumenPath.of("daftar-barang.txt")merujuk berkas pada direktori kerja program. - Baris 13-15 (
for (String barang : daftar)): perulangan for-each mencetak tiap barang yang terbaca.
Manfaatnya nyata: mengubah isi toko cukup dengan menyunting berkas teks — kode tidak perlu dikompilasi ulang. Pada tata letak Maven penuh, berkas seperti ini tinggal dipindah ke src/main/resources dan dimuat lewat classpath.
Menjalankan Proyek Berpaket #
Untuk proyek berpaket, siklus kompilasi dari Chapter Menggunakan Java Compiler menerima sentuhan struktur. Dari akar proyek:
javac -d bin src/main/java/com/toko/*.java
java -cp bin com.toko.AplikasiInventarisOpsi -d bin menempatkan hasil kompilasi ke folder bin dengan struktur direktori yang mengikuti package — bytecode class com.toko.AplikasiInventaris berada di bin/com/toko/AplikasiInventaris.class. Saat eksekusi, -cp bin menunjuk classpath ke folder tersebut dan nama class ditulis lengkap dengan package-nya. Satu catatan untuk contoh kita: program membaca daftar-barang.txt dari direktori kerja, jadi berkas tersebut perlu berada di folder tempat perintah java dijalankan. Pola -d plus -cp inilah yang dikelola otomatis IDE dan build tool saat kita menekan tombol Run.
Berkas Build Maven dan Gradle #
Seiring proyek membesar, perintah kompilasi manual digantikan build tool — program yang mengompilasi, menguji, dan mengemas proyek berdasarkan satu berkas deskripsi. Dua yang terpopuler:
<!-- cuplikan pom.xml untuk Maven -->
<project>
<groupId>com.toko</groupId>
<artifactId>aplikasi-inventaris</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.release>25</maven.compiler.release>
</properties>
</project>// cuplikan build.gradle.kts untuk Gradle
plugins {
java
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
}
}Kedua cuplikan menyatakan hal yang sama: identitas proyek dan versi Java yang dipakai — release 25. Berkas build juga tempat mendeklarasikan dependency pustaka pihak ketiga; Maven dan Gradle kita jelajahi tuntas pada Section khusus di akhir Course.
Section Persiapan Lingkungan resmi selesai: JDK terpasang, environment variable terkonfigurasi, jshell, compiler, tiga jalur eksekusi, IDE pilihan, dan peta struktur proyek sudah kita kuasai. Perangkat lengkap — saatnya menulis program yang sesungguhnya di Section Dasar Pemrograman, dimulai dari Chapter Program Java Pertama.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
AplikasiInventaris.java
Unduh berkasimport java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
public class AplikasiInventaris {
public static void main(String[] args) throws IOException {
List<String> daftar = Files.readAllLines(Path.of("daftar-barang.txt"), StandardCharsets.UTF_8);
System.out.println("Inventaris toko Budi:");
for (String barang : daftar) {
System.out.println("- " + barang);
}
System.out.println("Total item: " + daftar.size());
}
}