如何检测代码是否在Eclipse IDE中运行

31

如何检测代码是否在Eclipse IDE中运行


你需要更详细地阐述。上下文是什么?你想要实现什么? - Itay Maman
我想在代码运行于Eclipse IDE中时执行一些额外的代码。 - Dipak Chaudhari
2
警告!检测到不良实践! - chburd
11个回答

22

我不知道有一种通用的方法可以获取这种信息。

一个建议:

当您在Tomcat内启动Java程序(或Web服务器)时,只需添加一个参数,指示此程序是由Eclipse启动的。

您可以通过打开“打开运行对话框”(“运行”菜单),然后选择您的应用程序类型并在“参数”选项卡中添加-DrunInEclipse = true来实现。

在您的Java代码中,您可以检查属性的值:

String inEclipseStr = System.getProperty("runInEclipse");
boolean inEclipse = "true".equalsIgnoreCase(inEclipseStr);

这样,如果程序没有在Eclipse中运行(或者不幸的是您忘记设置属性),该属性将为null,然后布尔值inEclipse将等于false。


实际上我正在寻找通用的方法。 - Dipak Chaudhari

7

尽管我同意让代码检测单个IDE作为开发环境并不是最优解,但以下的代码是可行的。

和其他人建议的一样,在运行时设置一个标志会更好。

public static boolean isEclipse() {
    boolean isEclipse = System.getProperty("java.class.path").toLowerCase().contains("eclipse");
    return isEclipse;
}

2
请注意,如果您的项目依赖于其他Eclipse项目(例如Jetty),则此操作会产生误报。 - John Coker

6

1) 创建一个类似以下的帮助方法:

public boolean isDevelopmentEnvironment() {
    boolean isEclipse = true;
    if (System.getenv("eclipse42") == null) {
        isEclipse = false;
    }
    return isEclipse;
}

2) 将环境变量添加到启动配置中:

enter image description here

enter image description here

3) 使用示例:

if (isDevelopmentEnvironment()) {
    // Do bla_yada_bla because the IDE launched this app
}

2

如果你的工作空间符合类似于 "/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;
}

2

一种更通用和精确的方法,可在任何IDE上使用,即循环执行以下代码:

ManagementFactory.getRuntimeMXBean().getInputArguments()

查找“-Xdebug” || (以)“-agentlib:jdwp =”开头。

我从@saugata评论这里得到了这个想法。

如果您想抛出条件异常以防止应用程序仅退出,则此方法非常好。 使用布尔值“ideWait”并将其添加到Eclipse观察表达式中,例如 ideWait=false,因此每当您停在该位置并“跳转到帧”时,您都可以继续愉快地进行调试(我的意思是!)


2

实际上,代码并不是在Eclipse内运行,而是在由Eclipse启动的单独Java进程中运行,因此默认情况下,Eclipse不会采取任何措施使其与程序的任何其他调用有所不同。

您想知道的是,程序是否在调试器下运行? 如果是这样,您无法确定。 但是,您可以检查用于调用程序的参数,并查看其中是否存在任何不喜欢的内容。


3
如果使用调试器运行,则会有类似于“-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:2124”的参数,可以通过ManagementFactory.getRuntimeMXBean().getInputArguments().get(<int>)获得。 - saugata
@saugata - 使用Oracle JVM - Thorbjørn Ravn Andersen
@ThorbjørnRavnAndersen ...比如我们不想进行内插的参数无法正确引用,例如'*.txt.gz' - Pierre D
@PierreD 我不明白你的评论。 - Thorbjørn Ravn Andersen
@ThorbjørnRavnAndersen 我指的是你回答中的最后一句话:““You CAN, however, inspect the arguments used to invoke your program and see if there is anything in there you do not like”。这正是我提出这个问题的原因:如果我想要将字符串“*”“*.ext”(不带双引号)作为命令行参数传递,从shell中我可以写成'*'。但是我无法在Eclipse调试器中这样做,因为它会保留引号。所以在这种情况下,我们需要清理一些参数。 - Pierre D
这是一个执行Java程序的shell工具。由于Eclipse不像shell那样解析您的参数,因此您可以省略引号。 - Thorbjørn Ravn Andersen

1

我认为没有任何方法可以做到这一点。但是我建议只使用命令行参数,例如“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
}

这样一来,只需指定调试参数,您就可以在需要时运行额外的代码,但在正常情况下,它永远不会执行。


1
System.out.println("Is my parent eclipse[.exe]? " + 
    ProcessHandle.current()
                 .parent()
                 .flatMap(parent -> parent.info().command())                                                                       
                 .orElse("")
                 .matches("^.*eclipse(\\.exe)?$"));

0

如果您的替代执行工作流提供了不同的依赖关系集合,那么这可能会起作用:

boolean isRunningInEclipe = false;
try {
    Workbench.getInstance();
    isRunningInEclipe = true;
} catch (NoClassDefFoundError error) {
    //not running in Eclipse that would provide the Workbench class
} 

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接