我可以将我的应用程序作为独立应用程序(例如从命令行)或一种特定方式启动 - 它直接来自“源代码”,即使用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,那就没关系了。
答案 0 :(得分:8)
我过去使用过以下内容来检查调试设置。你可以使用类似的东西
ManagementFactory.getRuntimeMXBean().getInputArguments()
答案 1 :(得分:2)
当我在IDEA中运行应用程序时,它会设置一些变量,如-Didea.launcher.port和-Didea.launcher.bin.path。也许您可以检查它们是否已设置。
答案 2 :(得分:1)
您无法以通用方式执行此操作,因为Intellij以与您从命令行完全相同的方式启动Java应用程序。不完全相同,但差异不能指望。
您可以从应用中检测是否附加了调试器(请参阅Amirs的回答),但这不一定是Intellij,可能是jvisualvm之类的东西。如果我理解正确,这与Visual Studio和C#中的限制相同。如果你没有在调试模式下启动,这将无效。
您可以随时使用-Dlaunchedfromintellij在Intellij中启动,正如Christian所建议的那样,但这并不一致,正如您所说,对所有应用程序都很痛苦。
第三个建议是,当您启动Intellij或Eclipse时,确保为linux设置了特定的环境变量:
$ LAUNCHED_FROM_IDE = intellij
然后intellij中任何已启动的进程都将继承此环境变量,但命令行中的进程不会。它的价值是什么并不重要,因为你正在测试它是否存在。
答案 3 :(得分:0)
有没有办法检测应用程序是否是从IntelliJ启动的? 只有这个,二元决定。
Here是我正在使用的解决方案。
答案 4 :(得分:0)
我在 JUnit 测试中使用它。
Assume.assumeTrue("this test is executed in IntelliJ", Boolean.getBoolean("intellij.debug.agent"));
基本上它在从 IntelliJ在调试模式运行时检测系统属性。