Eğitim Portalı/Java/Komut Satırı Argümanları
Java01-java/79-komut-satiri-argumanlari

Komut Satırı Argümanları

Bir programa çalışırken dışarıdan veri vermenin en temel yolu komut satırı argümanlarıdır. main metodunun String[] args parametresi, programı başlatırken verdiğin değerleri taşır. Komut satırı araçları (CLI), betikler…

Komut Satırı Argümanları

Bir programa çalışırken dışarıdan veri vermenin en temel yolu komut satırı argümanlarıdır. main metodunun String[] args parametresi, programı başlatırken verdiğin değerleri taşır. Komut satırı araçları (CLI), betikler ve toplu işler (batch jobs) bu mekanizmayla yapılandırılır.

Not: Bu portal programları argümansız çalıştırır (args.length == 0). Bu yüzden örnekler hem gerçek args'ı kontrol eder hem de örnek bir diziyle ayrıştırmayı gösterir.

main(String[] args)

public static void main(String[] args) { ... }

java Program a b c komutunda args = ["a", "b", "c"] olur.

Önemli: C/C++'ın aksine, Java'da args program adını içermez — ilk eleman doğrudan ilk gerçek argümandır.

Argümanlar her zaman String'tir; sayı gerekiyorsa dönüştürürsün:

int yas = Integer.parseInt(args[1]);

Örnek 1 (./Ornek1.java) argümanları gezer, sayıya çevirir ve eksik argüman kontrolünü gösterir (bu kontrol şarttır: eksik argüman ArrayIndexOutOfBoundsException, hatalı sayı NumberFormatException atar).

Bayrak ve seçenek ayrıştırma

Gerçek CLI araçları üç tür argüman alır:

TürÖrnekAnlamı
Bayrak (flag)-v, --verboseDeğersiz; var/yok (aç/kapa)
Seçenek (option)--cikti rapor.txtAnahtar + değer
Konumsal (positional)girdi.txtSırasıyla anlamlı

Basit bir ayrıştırıcı elle yazılabilir: -- ile başlayanlar seçenek (sonraki eleman değeri), tek - bayrak, gerisi konumsal. Örnek 2 (./Ornek2.java) bunu uygular ve bir Map'e doldurur.

Üretimde: CLI kütüphaneleri

Elle ayrıştırma küçük araçlar için yeterlidir; ama karmaşık CLI'lerde (otomatik yardım metni, tip dönüşümü, zorunlu/opsiyonel doğrulama, alt komutlar) kütüphane kullanılır:

  • picocli (en popüler, anotasyon tabanlı, Spring Boot ile iyi çalışır)
  • JCommander, Apache Commons CLI
@Command(name = "araç")
class Arac implements Runnable {
    @Option(names = "--cikti") String cikti;
    @Parameters String girdi;
    public void run() { ... }
}

Argümanların alternatifleri

Komut satırı argümanları tek yol değildir; yapılandırma için ayrıca:

  • Ortam değişkenleri (System.getenv) — konteyner dünyasında yaygın.
  • Sistem özellikleri (-Dkey=value, System.getProperty) — topic 74.
  • Yapılandırma dosyaları (.properties/.yml) — Spring Boot.

Genelde bunlar bir öncelik sırasıyla birleştirilir (argüman > env > dosya > varsayılan).

Özet

main(String[] args) ile programa dışarıdan veri vermeyi; argümanların String olduğunu, program adını içermediğini ve eksik/hatalı argüman kontrolünün gerekliliğini (Örnek 1); bayrak/seçenek/ konumsal argüman ayrıştırmayı (Örnek 2) öğrendik; üretimde CLI kütüphanelerini ve argümanların yapılandırma alternatiflerini gördük. Sırada, metotsuz "etiketleyen" arayüzler: Marker Interface.

Kod Örnekleri(2)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: Komut satırı argümanları — main(String[] args).
2// (Portal argümansız çalıştırır; bu yüzden örnek bir args dizisiyle de gösteriyoruz.)
3// Gerçekte: java Ornek1 ada 30 istanbul   -> args = ["ada","30","istanbul"]
4// Çalıştırma: java Ornek1.java
5public class Ornek1 {
6
7    public static void main(String[] args) {
8        // args: programa komut satırından geçilen String dizisi (program adı DAHİL DEĞİL).
9        System.out.println("Gerçek argüman sayısı: " + args.length);
10        if (args.length == 0) {
11            System.out.println("(Portal argümansız çalıştırır; örnek bir dizi ile devam ediyoruz.)");
12        } else {
13            for (int i = 0; i < args.length; i++) System.out.println("  args[" + i + "] = " + args[i]);
14        }
15
16        // Simüle edilmiş argümanlar:
17        String[] ornekArgs = { "ada", "30", "istanbul" };
18        System.out.println("\nÖrnek args = [ada, 30, istanbul]:");
19        islet(ornekArgs);
20
21        // Eksik argüman kontrolü (gerçek programlarda şart):
22        System.out.println("\nEksik argümanla:");
23        islet(new String[]{ "burak" });
24
25        System.out.println("""
26
27                --- Komut satırı argümanları ---
28                main(String[] args): program çalıştırılırken verilen argümanlar bu diziye gelir.
29                'java Program a b c' -> args = ["a","b","c"] (program adı dahil değildir, C'den farklı olarak).
30                Argümanlar her zaman String'tir; sayı gerekiyorsa Integer.parseInt ile çevir.
31                MUTLAKA uzunluk/format kontrolü yap (eksik argüman -> ArrayIndexOutOfBounds; hatalı sayı -> NumberFormatException).""");
32    }
33
34    static void islet(String[] args) {
35        if (args.length < 3) {
36            System.out.println("  Eksik argüman! Beklenen: <ad> <yas> <sehir> (verilen: " + args.length + ")");
37            return;
38        }
39        String ad = args[0];
40        int yas = Integer.parseInt(args[1]); // String -> int
41        String sehir = args[2];
42        System.out.println("  " + ad + ", " + yas + " yaşında, " + sehir + "'de.");
43    }
44}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// Ornek2: Bayrak/seçenek (flag/option) ayrıştırma — --ad değer, -v gibi.
2// Çalıştırma: java Ornek2.java
3import java.util.HashMap;
4import java.util.Map;
5
6public class Ornek2 {
7
8    public static void main(String[] args) {
9        // Gerçek CLI araçları gibi: --çıktı dosya.txt --tekrar 3 -v girdi.txt
10        String[] ornek = { "--cikti", "rapor.txt", "--tekrar", "3", "-v", "girdi.txt" };
11        System.out.println("Argümanlar: " + String.join(" ", ornek));
12
13        Map<String, String> secenekler = new HashMap<>();
14        java.util.List<String> serbest = new java.util.ArrayList<>();
15        boolean ayrintili = false;
16
17        for (int i = 0; i < ornek.length; i++) {
18            String a = ornek[i];
19            if (a.equals("-v")) {
20                ayrintili = true;                       // değersiz bayrak (flag)
21            } else if (a.startsWith("--")) {
22                String anahtar = a.substring(2);
23                String deger = (i + 1 < ornek.length) ? ornek[++i] : ""; // sonraki = değer
24                secenekler.put(anahtar, deger);          // --anahtar değer
25            } else {
26                serbest.add(a);                          // konumsal (positional) argüman
27            }
28        }
29
30        System.out.println("\nSeçenekler (--): " + secenekler);
31        System.out.println("Bayrak -v (ayrıntılı): " + ayrintili);
32        System.out.println("Serbest argümanlar: " + serbest);
33        System.out.println("Tekrar sayısı (int): " + Integer.parseInt(secenekler.getOrDefault("tekrar", "1")));
34
35        System.out.println("""
36
37                --- Bayrak/seçenek ayrıştırma ---
38                CLI araçları üç tür argüman alır:
39                  bayrak (flag): -v, --verbose  (değersiz, var/yok)
40                  seçenek (option): --cikti dosya.txt  (anahtar + değer)
41                  konumsal (positional): girdi.txt  (sırasıyla anlamlı)
42                Basit ayrıştırma elle yazılabilir; karmaşık CLI için picocli, JCommander, Apache Commons CLI
43                gibi kütüphaneler (otomatik yardım, tip dönüşümü, doğrulama) tercih edilir.""");
44    }
45}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.