limitar fecha bar java eclipse compiler-construction sun incremental-compiler

fecha - ¿Puede Sun javac estándar hacer compilación incremental?



slide java (4)

Recientemente comencé a usar el compilador java de Eclipse, porque es significativamente más rápido que el javac estándar. Me dijeron que es más rápido porque realiza una compilación incremental. Pero todavía estoy un poco inseguro acerca de esto, ya que no puedo encontrar ninguna documentación autorizada sobre "característica incremental" de eclispse y sun''s. ¿Es cierto que el compilador de Sun siempre compila todos los archivos de origen y que el compilador de Eclipse compila solo los archivos modificados y aquellos que se ven afectados por tal cambio?

Edición: no estoy usando la función de autoedición de Eclipse, sino que estoy configurando

-Dbuild.compiler=org.eclipse.jdt.core.JDTCompilerAdapter

para mis hormigas construye.


¿Es cierto que el compilador de Sun siempre compila todos los archivos de origen y que el compilador de Eclipse compila solo los archivos modificados y aquellos que se ven afectados por tal cambio?

Creo que tienes razón en ambos aspectos.

Por supuesto, puedes forzar a Eclipse a compilar todo.

Pero la otra parte de la ecuación es que las herramientas de compilación de Java como Ant y Maven solo son capaces de compilar las clases que han cambiado, y su árbol de clases dependientes.

EDITAR

En Ant, la compilación incremental se puede hacer de dos maneras:

  • Por defecto, la tarea <javac> compara las marcas de tiempo de .java y los archivos de .java correspondientes, y solo le dice al compilador de Java que compile los archivos de origen (.java) que son más nuevos que sus archivos de destino (.class) correspondientes o que no t tiene un archivo de destino en absoluto.

  • La tarea <depend> también tiene en cuenta las dependencias entre clases, que determina al leer y analizar la información de dependencia incorporada en los archivos .class . Habiendo determinado qué archivos .class están desactualizados, la tarea <depend> elimina, por lo que la siguiente tarea <javac> volverá a compilar. Sin embargo, esto no es totalmente infalible. Por ejemplo, los cambios extensos en el código fuente pueden llevar a que la tarea <depend> pueda estar analizando las dependencias obsoletas. Además, ciertos tipos de dependencia (por ejemplo, en constantes estáticas) no son evidentes en el formato de archivo .class .

    Para comprender por qué Ant <depend> no es infalible, lea la sección "Limitaciones" de la documentación .


Eclipse ciertamente hace esto. También lo hace en el tiempo de ahorro si tiene esa opción activada (y está predeterminada). Parece que el sol tampoco hace esto (es muy fácil de probar, simplemente haga un pequeño proyecto en el que A sea la clase principal que usa la clase B, pero B no usa la clase A. Luego cambie A y compile el proyecto nuevamente, ver si la marca de tiempo para b.class ha cambiado.

Esta es la forma en que funcionan muchos compiladores (también gcc, por ejemplo). Puede usar herramientas como ant y make para compilar solo la parte del proyecto que ha cambiado. También tenga en cuenta que estas herramientas no son perfectas, a veces el eclipse simplemente pierde la pista de los cambios y tendrá que hacer una reconstrucción completa.


Javac solo compila los archivos de origen que se nombran en la línea de comandos o son dependencias y están desactualizados. Eclipse puede tener una forma más precisa de decidir lo que eso significa.


Repitiendo lo que he escuchado aquí y expresándolo para gente perezosa como yo:

Puede lograr compilaciones incrementales con la tarea javac en ant, pero debe usar la tarea depend para borrar los archivos .class de su .java modificado Y no debe dejar la declaración de inclusión sin especificar en la tarea javac. (Al especificar solo la ruta src en la tarea javac y al salir, se incluyen las causas no especificadas. Javac recompila todas las fuentes que encuentra).

Aquí están mis tareas dependientes y javac. Con el compilador java estándar de Oracle, solo se compilan los archivos .java que modifico. ¡Espero que esto ayude!

<depend srcdir="JavaSource" destdir="${target.classes}" cache="${dependencies.dir}" closure="yes"> <classpath refid="compiler.classpath" /> <include name="**/*.java"/> </depend> <javac destdir="${target.classes}" debug="true" debuglevel="${debug.features}" optimize="${optimize.flag}" fork="yes" deprecation="no" source="1.6" target="1.6" encoding="UTF-8" includeantruntime="no"> <classpath refid="compiler.classpath"/> <src path="JavaSource"/> <include name="**/*.java" /> <!-- This enables the incremental build --> </javac>