Java有像C#那样的“debugging”和“发布”构build模式吗?

在C#中,我们有两种模式来构build项目: DebugRelease ,我不知道Java是否有相同的东西。 我正在使用IntelliJ IDEA作为Java IDE,到目前为止,我还没有看到任何地方可以像VS IDE一样configuration构build模式。

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

你可以select在编译的类中包含debugging符号(这是默认的),或者不这样做。 没有太多的好处,不这样做。 jar文件会稍小一点 ,但是性能上的好处是最小的(如果有的话)。 没有这些符号,你不会再得到堆栈跟踪中的行号。 您也可以select使用本地variables名称添加其他符号 (默认情况下,只有源文件名和行号)。

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

您也可以在运行时启用断言(默认为closures),这在开发和testing过程中有时很有用。 这确实会对性能产生影响(如果有问题的代码确实使用了断言,我认为这是不常见的 )。

不pipe这些设置如何,JVM总是允许你附加一个debugging器。

Java没有的是有条件的编译,其中完全不同的代码将根据外部设置进行编译。 你可以得到最接近的东西就像public static final boolean DEBUG_BUILD = true; 在你的代码的某处,并在if语句中使用。 这实际上会使编译器排除无法访问的代码,但您必须在源代码中设置此常量。

在Java中正常的做法是释放一切是一种可以被debugging的方式。 对于一些需要模糊处理的项目,他们可能会有一个发布版本,但在开发Java的12年中我从未见过这个。

断言和debugging消息等事情通常在生产实例的运行时closures,但可以随时(甚至dynamic地)在需要时打开。

恕我直言,最好的做法是在每个环境中使用相同的构build,不仅仅是相同的源代码,而是相同的JAR。 这给了你最好的机会,如果它在testing中工作,它将在生产中工作,如果你在生产中有问题,你可以在testing中重新生产。

由于如此多的Java代码是这样编写的,所以JIT非常擅长优化从未被调用的死代码。 所以,恕我直言,大多数Java执行C ++的微型“基准”是当基准testing没有做任何事情时,JIT更擅长于检测这一点。 恕我直言,C + +假定开发人员足够聪明,不写代码不做任何事情。

你正在寻求不同的构build来编译我猜不同的东西。 例如要有Debug.WriteLine和Console.WriteLine。

“不,Java没有完全匹配这个function,你可以使用方面,或者使用一个IOC容器来注入不同的实现类。” 从以下问题中偷走了这个: 有条件的Java编译

(那里有其他很好的答案)