如何检测代码是否在Eclipse IDE中运行
我不知道有一种通用的方法可以获取这种信息。
一个建议:
当您在Tomcat内启动Java程序(或Web服务器)时,只需添加一个参数,指示此程序是由Eclipse启动的。
您可以通过打开“打开运行对话框”(“运行”菜单),然后选择您的应用程序类型并在“参数”选项卡中添加-DrunInEclipse = true
来实现。
在您的Java代码中,您可以检查属性的值:
String inEclipseStr = System.getProperty("runInEclipse");
boolean inEclipse = "true".equalsIgnoreCase(inEclipseStr);
这样,如果程序没有在Eclipse中运行(或者不幸的是您忘记设置属性),该属性将为null
,然后布尔值inEclipse
将等于false。
尽管我同意让代码检测单个IDE作为开发环境并不是最优解,但以下的代码是可行的。
和其他人建议的一样,在运行时设置一个标志会更好。
public static boolean isEclipse() {
boolean isEclipse = System.getProperty("java.class.path").toLowerCase().contains("eclipse");
return isEclipse;
}
1) 创建一个类似以下的帮助方法:
public boolean isDevelopmentEnvironment() {
boolean isEclipse = true;
if (System.getenv("eclipse42") == null) {
isEclipse = false;
}
return isEclipse;
}
2) 将环境变量添加到启动配置中:
3) 使用示例:
if (isDevelopmentEnvironment()) {
// Do bla_yada_bla because the IDE launched this app
}
如果你的工作空间符合类似于 "/home/user/workspace/Project" 的模式,你可以使用下面的代码:
Boolean desenv = null;
boolean isDevelopment() {
if (desenv != null) return desenv;
try {
desenv = new File(".").getCanonicalPath().contains("workspace");
}
catch (IOException e) {
e.printStackTrace();
}
return desenv;
}
一种更通用和精确的方法,可在任何IDE上使用,即循环执行以下代码:
ManagementFactory.getRuntimeMXBean().getInputArguments()
查找“-Xdebug” || (以)“-agentlib:jdwp =”开头。
我从@saugata评论这里得到了这个想法。
如果您想抛出条件异常以防止应用程序仅退出,则此方法非常好。 使用布尔值“ideWait”并将其添加到Eclipse观察表达式中,例如 ideWait=false,因此每当您停在该位置并“跳转到帧”时,您都可以继续愉快地进行调试(我的意思是!)
实际上,代码并不是在Eclipse内运行,而是在由Eclipse启动的单独Java进程中运行,因此默认情况下,Eclipse不会采取任何措施使其与程序的任何其他调用有所不同。
您想知道的是,程序是否在调试器下运行? 如果是这样,您无法确定。 但是,您可以检查用于调用程序的参数,并查看其中是否存在任何不喜欢的内容。
'*.txt.gz'
? - Pierre D“*”
或“*.ext”
(不带双引号)作为命令行参数传递,从shell中我可以写成'*'
。但是我无法在Eclipse调试器中这样做,因为它会保留引号。所以在这种情况下,我们需要清理一些参数。 - Pierre D我认为没有任何方法可以做到这一点。但是我建议只使用命令行参数,例如“debug”。然后在您的主方法中执行。
if (args.length > 0 && args[0].equalsIgnoreCase("debug")) {
// do whatever extra work you require here or set a flag for the rest of the code
}
这样一来,只需指定调试参数,您就可以在需要时运行额外的代码,但在正常情况下,它永远不会执行。
System.out.println("Is my parent eclipse[.exe]? " +
ProcessHandle.current()
.parent()
.flatMap(parent -> parent.info().command())
.orElse("")
.matches("^.*eclipse(\\.exe)?$"));
如果您的替代执行工作流提供了不同的依赖关系集合,那么这可能会起作用:
boolean isRunningInEclipe = false;
try {
Workbench.getInstance();
isRunningInEclipe = true;
} catch (NoClassDefFoundError error) {
//not running in Eclipse that would provide the Workbench class
}
你可以检测当前是否在JAR文件中,参考运行时如何判断Java程序是否在JAR包内?
Eclipse会从classes/
目录下运行你的应用程序,而大多数终端用户将从JAR文件中运行该应用程序。