如何检测我的应用程序是否从IntelliJ启动?

时间:2011-12-07 15:07:53

标签: java debugging scala intellij-idea

我可以将我的应用程序作为独立应用程序(例如从命令行)或一种特定方式启动 - 它直接来自“源代码”,即使用IntelliJ。

有没有办法检测app是否是从 IntelliJ 启动的?只有这个,二元决定。

解决方法很多,在启动时添加了额外的选项,但是我正在寻找直接的解决方案,就像这样对于C# How to know that the application is launched by debugger (VisualStudio) C#

该解决方案适用于任何IDE,但必须至少对IntelliJ有效。

小更新

对于那些(包括我)寻求准备使用代码的人( Scala代码):

object ProgramInfo
{
  val isStandaloneApp = sun.management.ManagementFactory.getRuntimeMXBean().getInputArguments.isEmpty
  val isDebugMode = scala.collection.JavaConversions.iterableAsScalaIterable(sun.management.ManagementFactory.getRuntimeMXBean().getInputArguments).exists(it => it.startsWith("-agentlib"))
}

它不适用于复杂的情况,但是如果你没有将大量参数传递给JVM,那就没关系了。

5 个答案:

答案 0 :(得分:8)

我过去使用过以下内容来检查调试设置。你可以使用类似的东西

ManagementFactory.getRuntimeMXBean().getInputArguments()

enter image description here

答案 1 :(得分:2)

当我在IDEA中运行应用程序时,它会设置一些变量,如-Didea.launcher.port和-Didea.launcher.bin.path。也许您可以检查它们是否已设置。

答案 2 :(得分:1)

您无法以通用方式执行此操作,因为Intellij以与您从命令行完全相同的方式启动Java应用程序。不完全相同,但差异不能指望。

  1. 您可以从应用中检测是否附加了调试器(请参阅Amirs的回答),但这不一定是Intellij,可能是jvisualvm之类的东西。如果我理解正确,这与Visual Studio和C#中的限制相同。如果你没有在调试模式下启动,这将无效。

  2. 您可以随时使用-Dlaunchedfromintellij在Intellij中启动,正如Christian所建议的那样,但这并不一致,正如您所说,对所有应用程序都很痛苦。

  3. 第三个建议是,当您启动Intellij或Eclipse时,确保为linux设置了特定的环境变量:

    $ LAUNCHED_FROM_IDE = intellij

  4. 然后intellij中任何已启动的进程都将继承此环境变量,但命令行中的进程不会。它的价值是什么并不重要,因为你正在测试它是否存在。

答案 3 :(得分:0)

  

有没有办法检测应用程序是否是从IntelliJ启动的?   只有这个,二元决定。

Here是我正在使用的解决方案。

答案 4 :(得分:0)

我在 JUnit 测试中使用它。

Assume.assumeTrue("this test is executed in IntelliJ", Boolean.getBoolean("intellij.debug.agent"));

基本上它在从 IntelliJ在调试模式运行时检测系统属性。