Есть ли у Java режим "отладки" и "выпуска", например, С#?

В С# у нас есть 2 режима построения проектов: Debug и Release, интересно, имеет ли Java одно и то же. Я использую IntelliJ IDEA в качестве Java IDE, и до сих пор я нигде не видел настройки режима сборки, например, в VS IDE.

Ответ 1

javac 
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info

Вы можете включить символы отладки в скомпилированные классы (это значение по умолчанию) или не делать этого. Не так много пользы, чтобы этого не делать. Файлы jar будут немного меньше, но преимущество в производительности минимально (если есть). Без этих символов вы больше не получаете номера строк в трассировке стека. У вас также есть возможность включать дополнительные символы с именами локальных переменных (по умолчанию есть только имена исходных файлов и номера строк).

java
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions

Вы также можете включить утверждения во время выполнения (по умолчанию отключено), что иногда полезно при разработке и тестировании. Это влияет на производительность (если этот код действительно использовал утверждения, которые, я думаю, необычные).

Независимо от любого из этих параметров, JVM всегда позволяет вам прикрепить отладчик.

То, что у Java нет, - это условная компиляция, где полностью другой код будет скомпилирован на основе некоторой внешней настройки. Самое близкое, что вы можете получить, это что-то вроде public static final boolean DEBUG_BUILD = true; где-то в вашем коде и использовать это в операторах if. Это фактически заставит компилятор исключить код, который становится недоступным, но вы должны установить эту константу в исходный код.

Ответ 2

Это обычная практика в Java, чтобы освободить все, что можно отладить. Для некоторых проектов, требующих обфускации, они могут иметь сборку релизов, но я никогда не видел этого за 12 лет разработки Java.

Вещи, такие как утверждения и отладочные сообщения, обычно отключаются во время выполнения для экземпляра производства, но могут быть включены в любое время (даже динамически), если это необходимо.

IMHO лучше использовать одну и ту же сборку в каждой среде, а не только в том же источнике, но в тех же JAR. Это дает вам наилучший шанс, что, если он будет работать в тесте, он будет работать на производстве, и если у вас возникнут проблемы с производством, вы можете повторно произвести его в тесте.

Так как такой код Java написан таким образом, JIT очень хорош в оптимизации мертвого кода, который никогда не вызывается. Настолько, что IMHO большинство микро- "контрольных показателей", где Java выступает на С++, - это когда эталон ничего не делает, и JIT лучше обнаруживает это. IMHO, С++ предполагает, что разработчик достаточно умен, чтобы не писать код, который ничего не делает.

Ответ 3

Вы просите, чтобы различные типы сборки собирались в разных вещах, я думаю. Например, иметь Debug.WriteLine и Console.WriteLine.

"Нет, Java не имеет точного соответствия для этой функции. Вы можете использовать аспекты или использовать контейнер IOC для ввода различных классов реализации". украл это из следующего вопроса: Условная компиляция Java

(там есть другие приятные ответы)