2011-12-23 31 views
38

En C#, tenemos 2 modos para crear proyectos: Debug y Release, me pregunto si Java tiene lo mismo. Estoy usando IntelliJ IDEA como Java IDE y hasta ahora no he visto en ningún lugar configurar un modo de compilación como en VS IDE.¿Java tiene el modo de compilación 'Debug' y 'Release' como C#?

+0

¿Ha buscado en la web algo así como ** java using assert **? en cuanto a IDEA, si nos fijamos en /bin/idea.exe.vmoptions lo más probable es que descubra que se ejecuta en el modo 'Debug' en sí, si hay configuración' -ea' presente :) – gnat

+0

@gnat, sí, hay configuración '-ea' en' idea.exe.vmoptions'.Pero ¿qué ocurre cuando se construye un artefacto (un archivo jar), todavía en el modo 'Debug' con un artefacto? – JatSing

+1

en el archivo vmoptions, '-ea' impacta cómo se ejecuta IDEA (¿es una aplicación java que conoces?) ** no ** el código que crea. En cuanto a los frascos, administras su modo en tiempo de ejecución especificando u omitiendo '-ea'. Como escribí, solo busque en la web para java, afirme que hay muchos tutoriales en ese – gnat

Respuesta

32
javac 
    -g       Generate all debugging info 
    -g:none     Generate no debugging info 
    -g:{lines,vars,source}  Generate only some debugging info 

Puede elegir incluir símbolos de depuración en las clases compiladas (esta es la configuración predeterminada) o no hacerlo. No hay mucho beneficio para no hacer eso. Los archivos jar serán a little smaller, pero el beneficio de rendimiento es mínimo (si corresponde). Sin estos símbolos, ya no obtendrá números de línea en los rastros de pila. También tiene la opción de incluir additional symbols with local variable names (de manera predeterminada solo hay nombres de archivos de fuente y números de línea).

java 
    -ea[:<packagename>...|:<classname>] 
    -enableassertions[:<packagename>...|:<classname>] 
        enable assertions 

También puede activar afirmaciones en tiempo de ejecución (por defecto está desactivada), lo cual es a veces útil durante el desarrollo y pruebas. Esto tiene un impacto en el rendimiento (si el código en cuestión sí hizo uso de aserciones, que creo que es uncommon).

Independientemente de cualquiera de estas configuraciones, la JVM siempre le permite adjuntar un depurador.

Lo que Java no tiene es una compilación condicional donde se compilará un código completamente diferente en función de alguna configuración externa. Lo más cercano que puede obtener es algo así como public static final boolean DEBUG_BUILD = true; en algún lugar de su código y use eso en las declaraciones if. Esto realmente hará que el compilador excluya el código que se vuelve inalcanzable, pero debe establecer esta constante en el código fuente.

+1

de todos modos para hacer 'public static final boolean DEBUG_BUILD' en preproceso, algo así como' # ifdebug' en C#? – JatSing

+3

@JatSing: No directamente. Podría tener algún tipo de script que actualice el valor antes de iniciar el compilador. O tal vez tener un Constants.java y dos versiones de eso, y establecer el classpath de compilación para uno de ellos. Pero nada en la cadena de herramientas oficial. – Thilo

4

Usted está pidiendo diferentes tipos de construcciones para compilar en diferentes cosas, supongo. Por ejemplo, para tener Debug.WriteLine y Console.WriteLine.

"No, Java no tiene una coincidencia exacta para esa funcionalidad. Podría usar aspectos, o usar un contenedor IOC para inyectar diferentes clases de implementación." robó esto desde la siguiente pregunta: Conditional Java compilation

(hay otras respuestas agradables para que allí)

13

Es una práctica normal en Java para liberar todo es una forma que se puede depurar. Para algunos proyectos que requieren ofuscación, podrían tener una compilación de lanzamiento, pero nunca he visto esto en 12 años de desarrollo de Java.

Las cosas como aserciones y mensajes de depuración generalmente se desactivan en el tiempo de ejecución para una instancia de producción, pero se pueden activar en cualquier momento (incluso dinámicamente) si es necesario.

En mi humilde opinión, es una buena práctica usar la misma construcción en todos los entornos, no solo en la misma fuente sino también en los mismos JAR. Esto le da la mejor posibilidad de que, si funciona en prueba, funcionará en producción y si tiene un problema en la producción, puede volver a producirlo en la prueba.

Como tanto código Java está escrito de esta manera, el JIT es muy bueno en la optimización de código muerto que nunca se llama. Tanto es así que en mi humilde opinión la mayoría de los micro-"benchmarks" donde Java out realiza C++, es cuando el benchmark no hace nada y el JIT es mejor para detectar esto. En mi humilde opinión, C++ supone que el desarrollador es lo suficientemente inteligente como para no escribir código que no hace nada.

+1

"Nunca he visto esto en 12 años de desarrollo de Java". Para mí, esa es la parte más relevante de su respuesta, ya que está escribiendo Java para HFT (!). ¿Eso significa que compilar código Java para incluir toda la información de depuración no/interfiere con el JVM JIT? Supongo que sí, pero busca la confirmación. – kevinarpe

Cuestiones relacionadas