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

问题描述 投票:0回答:3

在C#中,我们有两种构建项目的模式:

Debug
Release
,我想知道Java是否也有同样的东西。我使用 IntelliJ IDEA 作为 Java IDE,到目前为止,我还没有看到任何地方可以像 VS IDE 那样配置构建模式。

c# java .net debugging release
3个回答
40
投票
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 语句中使用它。这实际上会使编译器排除无法访问的代码,但您必须在源代码中设置此常量。


21
投票

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

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

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

由于如此多的 Java 代码都是这样编写的,JIT 非常擅长优化从未被调用的死代码。以至于恕我直言,大多数 Java 优于 C++ 的微“基准测试”是指基准测试不做任何事情,而 JIT 更擅长检测这一点。恕我直言,C++ 假设开发人员足够聪明,不会编写不执行任何操作的代码。


4
投票

我猜你要求不同类型的构建来编译不同的东西。例如拥有 Debug.WriteLine 和 Console.WriteLine。

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

(那里还有其他不错的答案)

© www.soinside.com 2019 - 2024. All rights reserved.