¿Es el compilador de Java de Eclipse solo un envoltorio del mismo núcleo que el javac
programa está envuelto, o es un compilador separado por completo? Si es lo último, ¿por qué reinventarían la rueda?
¿Cuál es la diferencia entre javac y el compilador de Eclipse?
Bart van Heukelom
jjnguy
Eclipse ha implementado su propio compilador llamado como Compilador de Eclipse para Java (TJE).
Es diferente de javac, el compilador que se envía con Sun JDK. Una diferencia notable es que el compilador de Eclipse le permite ejecutar código que en realidad no se compiló correctamente. Si el bloque de código con el error nunca se ejecuta, su programa funcionará bien. De lo contrario, arrojará una excepción que indica que intentó ejecutar un código que no se compila.
Otra diferencia es que el compilador de Eclipse permite compilaciones incrementales desde el IDE de Eclipse, es decir, todo el código se compila tan pronto como termina de escribir.
El hecho de que Eclipse venga con su propio compilador también es evidente porque puede escribir, compilar y ejecutar código Java en Eclipse sin siquiera instalar el SDK de Java.
Algunos ejemplos en los que se prefiere ECJ sobre javac son:
- gato apache utiliza ECJ para compilar JSP,
- IDEA IntelliJ tiene apoyo para ECJ, a partir de Compilador GNU para Java (GCJ) 4.3,
- GCJ se integra con ECJ,
- Liferay construye con ECJ.
-
@Bart, el compilador de Eclipse funciona lo suficientemente bien para compilaciones de lanzamiento empresarial.
– jjnguy
17 de junio de 2010 a las 12:51
-
@jinguy No estoy de acuerdo con que deba usar el compilador Eclipse para los lanzamientos. Como indicó en la respuesta, puede compilar código con errores, no quiere cosas como public void foo() { throw new Error (“Problema de compilación no resuelto: \n\tFOOBAR no se puede resolver\n”); } para que aparezca en mi código de producción.
– Mateo Farwell
28 de septiembre de 2011 a las 13:18
-
@Matthew Farwell No dijo que deberías, pero que puedes. Y si alguna vez crea una compilación con errores, entonces algo está mal con su proceso de compilación en primer lugar.
– Stefan
14 de noviembre de 2011 a las 22:28
-
Tenga en cuenta que incrustar ECJ en su aplicación permite que su programa se ejecute bajo un JRE en lugar de requerir un JDK.
– Thorbjorn Ravn Andersen
4 de junio de 2015 a las 8:07
-
@MatthewFarwell para cerrar un ciclo aquí: para versiones de lanzamiento, se recomienda simplemente no especificar el argumento del compilador
-proceedOnError
y simplemente no producirá archivos .class desde la fuente con errores.– Stephan Hermann
01/08/2015 a las 19:58
poligenelubricantes
Todos ya han explicado que son diferentes. Aquí hay algunas diferencias en los comportamientos que he notado entre los dos compiladores. Todos se reducen a un error en (al menos) una de las implementaciones.
Relacionado con la optimización del tiempo de compilación
- error del eclipse? Activar un nulo con solo el caso predeterminado
Relacionado con la inferencia de tipos genéricos
- Generics compila y se ejecuta en Eclipse, pero no compila en javac
-
Los compiladores se comportan de manera diferente con un parámetro nulo de un método genérico
-
En realidad, me di cuenta de esta diferencia después de una larga noche: Eclipse estaba informando un error sobre algo que me parecía legal (no recuerdo qué), en mi desesperación (apenas podía mantenerme despierto) simplemente alimenté el código a javac y entonces funcionó sin problemas! Descubrí en Google que tenía que actualizar el JDT para solucionar ese problema.
–Abel Morelos
18 de junio de 2010 a las 15:18
-
He encontrado una serie de diferencias entre los compiladores que manejan genéricos en casos difíciles. Aquí hay dos preguntas sobre las que hice aquí en caso de que desee agregarlas a su respuesta: stackoverflow.com/questions/13501836/… stackoverflow.com/questions/13980552/…
– Elías Vasylenko
18 de marzo de 2013 a las 10:13
-
Las clases anónimas nunca son estáticas según JLS, pero se pueden declarar en un ámbito estático. Cuando se usa la reflexión para preguntar si dicha clase es estática, el código generado por ECJ dice que no, mientras que el de javac dice que si. Publicación relacionada aquí.
– Pablo Bellora
18/04/2013 a las 14:30
-
Cualquier diferencia semántica en el bytecode emitido es un error en cualquiera de las implementaciones. Esto no es muy interesante en mi opinión. Puedo producir fácilmente una larga lista de tales “diferencias” simplemente enumerando los errores abiertos de javac y ecj.
– aioobe
17/10/2014 a las 19:37
-
FYI, Netbeans no sufre de tales “diferencias” ya que usa la API interna de javac para hacer todo lo que hace EJC.
-Aleksandr Dubinsky
19 mayo 2015 a las 13:16
El compilador integrado de Eclipse se basa en el de IBM. Jikes compilador java. (Tenga en cuenta que Eclipse también comenzó su vida en IBM). Es completamente independiente del compilador Java de Sun en el JDK; no es un envoltorio alrededor de Sun javac
.
Jikes existe desde hace mucho tiempo, solía ser mucho más rápido que el compilador Java JDK estándar (pero no sé si eso sigue siendo cierto). En cuanto a por qué IBM quería escribir su propio compilador de Java: tal vez por razones de licencia (también tienen su propia implementación de Java).
-
ellos no De Verdad escribir su propio compilador de Java. Eclipse tiene un largo linaje que se remonta a Visual Age para Smalltalk, incluso antes de que Java existiera. Dado que los dos idiomas son en realidad algo similares, simplemente adaptaron su tecnología existente. El compilador de Sun tampoco es adecuado para su uso en un IDE, especialmente en un IDE de estilo Smalltalk incremental como el Visual Age para Java original, ya que siempre quiere compilar archivos completos. El compilador de IBM puede compilar incrementalmente solo los fragmentos que han cambiado. Incluso puede compilar fragmentos que ni siquiera son Java legales, que se utilizan en el
– Jörg W. Mittag
17 de junio de 2010 a las 14:35
-
Libro de recuerdos de Eclipse donde simplemente puede escribir fragmentos de código, resaltarlos y ejecutarlos, sin tener que ponerlos en una clase, un método principal o incluso en un método en absoluto.
– Jörg W. Mittag
17 de junio de 2010 a las 14:36
-
@JörgWMittag En realidad, la API interna de javac (como la usa Netbeans) se puede usar para lograr los mismos objetivos.
-Aleksandr Dubinsky
19 mayo 2015 a las 13:15
-
@AleksandrDubinsky: ¿Qué tan bien funcionó eso en 1997, cuando se lanzó Visual Age para Java?
– Jörg W. Mittag
3 de febrero de 2019 a las 10:22
Ben M
Es un compilador separado por completo. Esto es necesario ya que javac no permite la compilación de código ligeramente roto, desde el sitio del eclipse
Un compilador incremental de Java. Implementado como un constructor de Eclipse, se basa en la tecnología desarrollada a partir del compilador VisualAge para Java. En particular, permite ejecutar y depurar código que aún contiene errores sin resolver.