В С# у нас есть 2 режима построения проектов: Debug
и Release
, интересно, имеет ли Java одно и то же. Я использую IntelliJ IDEA в качестве Java IDE, и до сих пор я нигде не видел настройки режима сборки, например, в VS IDE.
Есть ли у Java режим "отладки" и "выпуска", например, С#?
Ответ 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
(там есть другие приятные ответы)