Есть ли в Java режимы отладки и выпуска, как в C #? - PullRequest
41 голосов
/ 23 декабря 2011

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

Ответы [ 3 ]

34 голосов
/ 23 декабря 2011
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.Это фактически заставит компилятор исключить код, который становится недоступным, но вы должны установить эту константу в исходном коде.

15 голосов
/ 23 декабря 2011

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

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

ИМХО, рекомендуется использовать одну и ту же сборку в каждой среде, а не только один и тот же источник, но одни и те же файлы JAR. Это дает вам максимальную вероятность того, что, если он работает в тестовом режиме, он будет работать в производственном процессе, а если у вас возникнут проблемы в производственном процессе, вы можете повторно воспроизвести его в тестовом режиме.

Поскольку так много Java-кода написано таким образом, JIT очень хорош в оптимизации мертвого кода, который никогда не вызывается. Настолько, что IMHO, большинство микро-«эталонов», где Java out выполняет C ++, это когда эталон ничего не делает и JIT лучше обнаруживает это. ИМХО, C ++ предполагает, что разработчик достаточно умен, чтобы не писать код, который ничего не делает.

4 голосов
/ 23 декабря 2011

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

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

(там есть и другие хорошие ответы для вас)

...