Java 如何检测代码在EclipseIDE中运行

Java 如何检测代码在EclipseIDE中运行,java,ide,Java,Ide,如何检测EclipseIDE中运行的代码我不知道获取此类信息的一般方法 一项建议: 当您在Tomcat中启动Java程序(或web服务器)时,只需添加一个参数,指示此程序是由Eclipse启动的 您可以通过打开“打开运行对话框”(“运行”菜单)来实现这一点,然后选择您的应用程序类型并添加到“参数”选项卡a-DrunInEclipse=true 在Java代码中,可以检查属性的值: String inEclipseStr = System.getProperty("runInEclipse");

如何检测EclipseIDE中运行的代码我不知道获取此类信息的一般方法

一项建议:

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

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

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

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

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

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

通过这种方式,您还可以随时运行额外的代码,只需指定调试参数,但在正常情况下它将永远不会执行。

实际上,代码不是在Eclipse内部运行的,而是在Eclipse启动的单独Java进程中运行的,默认情况下,Eclipse没有做任何事情使其与程序的任何其他调用有所不同


如果您的程序是在调试器下运行的,您想知道的是什么?如果是的话,你不能肯定。但是,您可以检查用于调用程序的参数,看看其中是否有您不喜欢的内容。

您可以尝试以下方法:

if (ClassLoader.getSystemResource("org/eclipse/jdt/core/BindingKey.class")!=null){ 
    System.out.println("Running within Eclipse!!!"); 
} else {
    System.out.println("Running outside Eclipse!!!");
}
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”这样的布尔值,并将其作为ideWait=false添加到Eclipse watch表达式中,这样,每当您停止该抛出并“放到帧”时,您就可以愉快地继续调试(我是说!)

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

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

你可以检测你是否在罐子里,根据


Eclipse将从
classes/
dir运行您的应用程序,而您的大多数最终用户将从JAR运行应用程序。

以下操作应该可以运行

尽管我同意让代码检测单个IDE作为开发环境并不是一个最佳的解决方案。在运行时使用标志更好

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

你必须详细说明。背景是什么?你想实现什么?我想执行一些额外的代码,以防它在EclipseIdeWarning中运行!发现不良行为!实际上,我正在寻找通用的方法。如果使用调试器运行,则会有一些类似于-agentlib:jdwp=transport=dt_socket、suspend=y、address=localhost:2124的参数,可以从ManagementFactory.getRuntimeMXBean().getInputArguments().get()获得@saugata-使用Oracle JVMi@ThorbjørnRavnAndersen…例如无法正确引用我们不希望插入的参数,例如,
“*.txt.gz”
?@PierreD我不理解你的评论。@ThorbjørnRavnAndersen我指的是你答案的最后一句话:“但是,您可以检查用于调用程序的参数,并查看其中是否有您不喜欢的内容”。这正是让我想到这个问题的原因:如果我想逐字传递字符串
“*”
“*.ext”
(不带双引号)作为命令行参数,我可以从shell中编写
“*”
。但是我不能从Eclipse调试器中这样做,因为它会留下引号。因此,在这种情况下,并且仅在这种情况下,我们需要执行一些参数清理。