2010-03-18 6 views

Respuesta

20

No estoy al tanto de una manera genérica para obtener este tipo de información.

Una sugerencia:

Cuando se inicia un programa Java (o un servidor web) en el interior de Tomcat, basta con añadir un argumento que indique que este programa se puso en marcha por Eclipse.

Puede hacerlo abriendo el "Diálogo Abrir ejecución" (menú "Ejecutar"), luego seleccione su tipo de aplicación y agregue en la pestaña "Argumentos" un -DrunInEclipse=true.

En su código Java, se puede comprobar el valor de la propiedad:

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

De esta manera, si el programa no se ejecuta dentro de Eclipse (o por desgracia si se olvidó de establecer la propiedad) la propiedad ser null y luego el booleano inEclipse será igual a falso.

+0

+1 para configurar una opción de tiempo de ejecución explícita. – Thilo

+0

en realidad estoy buscando una forma genérica. –

1

No creo que haya ninguna manera de hacer esto. Pero lo que sugeriría es solo un argumento de línea de comando como 'depurar'. Luego, en su principal método simplemente hacer

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 
} 

esta manera también se puede obtener su código extra para funcionar siempre que lo desee con sólo especificando el parámetro de depuración, pero en condiciones normales nunca va a ejecutar.

2

En realidad, el código no se ejecuta dentro de Eclipse, sino en un proceso separado de Java iniciado por Eclipse, y Eclipse no hace nada predeterminado para que sea diferente de cualquier otra invocación de su programa.

¿Es lo que desea saber si su programa se ejecuta bajo un depurador? Si es así, no puedes decirlo con certeza. Sin embargo, usted PUEDE inspeccionar los argumentos utilizados para invocar su programa y ver si hay algo allí que no le gusta.

+3

Si se ejecuta con depurador, habrá un argumento similar a -agentlib: jdwp = transport = dt_socket, suspend = y, address = localhost: 2124, que se puede obtener de ManagementFactory.getRuntimeMXBean(). GetInputArguments(). Get () – saugata

+0

@saugata - con Oracle JVM i –

+0

@ ThorbjørnRavnAndersen ... como no poder citar adecuadamente los argumentos que no queremos interpolar, por ejemplo''* .txt.gz''? –

-2

Usted puede intentar algo como esto:

if (ClassLoader.getSystemResource("org/eclipse/jdt/core/BindingKey.class")!=null){ 
    System.out.println("Running within Eclipse!!!"); 
} else { 
    System.out.println("Running outside Eclipse!!!"); 
} 
+0

No. Me estoy ejecutando dentro de Eclipse pero el código muestra lo contrario ... – BullyWiiPlaza

6

1) Crear un método de ayuda como:

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

2) Añadir una variable de entorno a su configuración de lanzamiento:

enter image description here

enter image description here

3) Ejemplo de uso:

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

Si el espacio de trabajo coincide con algún patrón como "/ home/usuario/espacio de trabajo/Proyecto" que puede usar el código de abajo:

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

A más genérico y de manera precisa, que puede ser utilizado en cualquier IDE sería bucle en:

ManagementFactory.getRuntimeMXBean().getInputArguments()

buscando "-Xdebug" || (comenzando con) "-agentlib: jdwp =".

Vine con esto de @saugata comment here.

Esto es excelente si desea lanzar una excepción condicional que impida que la aplicación simplemente salga. Use un booleano como "ideWait" y agréguelo a las expresiones de reloj de Eclipse como ideWait = false, así que cuando se detiene en ese tiro, y "drop to frame" puede continuar depurando felizmente (¡lo digo en serio!)

0

Esto podría funcionará si su flujo de trabajo de ejecución alternativa proporciona un conjunto diferente de dependencias:

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

Lo siguiente debería funcionar.

Aunque estoy de acuerdo con que el código que detecta un IDE único como dev env no es una solución óptima. Usar una bandera en tiempo de ejecución es mejor.

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