Java是否具有像C#这样的“调试”和“发布”构建模式?

时间:2011-12-23 07:53:36

标签: c# java .net debugging release

在C#中,我们有两种模式来构建项目:DebugRelease,我想知道Java是否有相同的东西。我使用IntelliJ IDEA作为Java IDE,到目前为止,我还没有看到任何地方配置VS IDE中的构建模式。

3 个答案:

答案 0 :(得分:34)

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

您可以选择在已编译的类中包含调试符号(这是默认值)或不执行此操作。不这样做没有多大好处。 jar文件将是a little smaller,但性能优势很小(如果有的话)。如果没有这些符号,则不再在堆栈跟踪中获取行号。您还可以选择包含additional symbols with local variable names(默认情况下,只有源文件名和行号)。

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

您还可以在运行时启用断言(默认为关闭),这在开发和测试期间有时很有用。这确实会对性能产生影响(如果有问题的代码确实使用了断言,我认为这是uncommon)。

无论这些设置如何,JVM始终允许您附加调试器。

Java没有的是条件编译,其中根据某些外部设置编译完全不同的代码。最接近的是类似public static final boolean DEBUG_BUILD = true;代码中的某个地方,并在if语句中使用它。这实际上会使编译器排除无法访问的代码,但您必须在源代码中设置此常量。

答案 1 :(得分:15)

在Java中,通常的做法是释放所有内容,这是一种可以调试的方式。对于一些需要混淆的项目,他们可能有一个发布版本,但我在12年的Java开发过程中从未见过这个。

断言和调试消息等内容通常在运行时为生产实例关闭,但如果需要,可以随时(甚至动态)打开。

恕我直言最佳做法是在每个环境中使用相同的构建,而不仅仅是相同的源,而是相同的JAR。这为您提供了最好的机会,如果它在测试中起作用,它将在生产中工作,如果您在生产中遇到问题,您可以在测试中重新生成它。

由于这样编写了如此多的Java代码,JIT非常擅长优化从未调用过的死代码。因此,恕我直言,大多数Java out out执行C ++的微观“基准测试”,当基准测试没有做任何事情并且JIT更好地检测到它时。恕我直言,C ++假设开发人员足够聪明,不会编写无法执行任何操作的代码。

答案 2 :(得分:4)

你想要用不同的东西来编译不同类型的构建。例如,要有Debug.WriteLine和Console.WriteLine。

“不,Java与该功能没有完全匹配。您可以使用方面,或使用IOC容器注入不同的实现类。”从以下问题中偷走了这个问题:Conditional Java compilation

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