Что произойдет, если в Java-проекте несколько классов имеют метод `public static void main(String[] args)`?

Ответ

Проект скомпилируется без ошибок. Проблема возникает на этапе запуска (execution), где необходимо явно указать, какой класс является точкой входа.

Поведение:

  1. Компиляция (javac): Успешна, так как метод main — это просто статический метод. Каждый класс может иметь свой.
  2. Запуск (java): Требует указания конкретного класса для исполнения.

Пример структуры:

// File: AppA.java
public class AppA {
    public static void main(String[] args) {
        System.out.println("Starting App A");
    }
}

// File: AppB.java
public class AppB {
    public static void main(String[] args) {
        System.out.println("Starting App B");
    }
}

Способы запуска:

  • Из командной строки: java AppA или java AppB.
  • В IDE: Выбор класса с методом main при конфигурации запуска.
  • В Maven/Gradle: Указание главного класса в настройках плагина (напр., maven-jar-plugin).

Практическое применение: Это позволяет создавать в одном проекте несколько самостоятельных приложений (например, основной сервис, утилиту для миграций, консольный клиент).

Ответ 18+ 🔞

Да ты посмотри, какая история интересная вырисовывается! Ну вот представь: пишешь ты код, два класса, в каждом свой main. Компилируешь — и всё, сука, как по маслу, ни одной ошибки! Компилятор-то, этот javac, он просто проверяет, что синтаксис правильный. А наличие main — это для него просто ещё один статический метод, их хоть двадцать наделай, ему похуй.

А вот потом начинается цирк, ёпта! Пытаешься запустить — и тебе в ответ: «А класс-то, блядь, какой? Укажи, мудила, точку входа!». Потому что java-то уже не компилирует, а исполняет. Ему надо знать, с какого именно main начинать этот пиздец.

Вот смотри, как это выглядит в реале:

// File: AppA.java
public class AppA {
    public static void main(String[] args) {
        System.out.println("Starting App A");
    }
}

// File: AppB.java
public class AppB {
    public static void main(String[] args) {
        System.out.println("Starting App B");
    }
}

Скомпилировал? Отлично. А теперь запускаешь в консоли:

  • Хочешь первое приложение — пишешь java AppA. Выведет «Starting App A».
  • Хочешь второе — java AppB. Получишь «Starting App B».

В IDE, понятное дело, ты просто выбираешь в настройках запуска, какой класс «главный» на этот раз. В Maven/Gradle тоже самое — в конфигах плагина прописываешь, какой класс считать точкой входа для итогового jar-ника.

А практический смысл, блядь, в чём? Да овердохуищный! Это ж как раз тот случай, когда в одном проекте можно сделать несколько отдельных, ебаных приложений. Например, основное приложение-сервис — это один main. А рядом — утилитка для миграции базы или консольный клиент для админа — это уже другой main. Всё в одном месте, но запускается по-разному. Удобно же, в рот меня чих-пых!