pom plugin compiler java maven jvm javac java-compiler-api

java - pom - maven-compiler-plugin version



¿Cuál es la diferencia entre usar javac y javax.tools.JavaCompiler? (1)

javac (como "java compiler") es un ejecutable, que podría ser teóricamente incluso un ejecutable dependiente de la plataforma o un script. Esto se llama para compilar un .java a un .class .

En windows es su nombre javac.exe , y normalmente está en algún lugar debajo de C:/Program Files*/jdk*/bin .

Este compilador fue desarrollado en java también. Eso significa que, si iniciamos este .exe, se debe iniciar una nueva máquina virtual Java para ejecutarlo. Esto es lento

Pero, como fue escrito en Java, hay una alternativa mucho más rápida: desde nuestro jvm que ya está en ejecución, simplemente import su clase principal (fe javax.tools.JavaCompiler o algo así) y llamamos a esto. Esto no necesita iniciar un jvm innecesario. Eso es lo que hace el experto. Simplemente 10 años fue suficiente para hacer esto correctamente. :-)

Por supuesto que también tiene algunos fallbacks. La causa más probable es que, en el caso del compilador interno, debe ejecutarse desde el mismo jvm y en el mismo espacio de nombres que el núcleo de Maven. También es imposible especificar un jvm alternativo, y podría haber algunos efectos secundarios como resultado de las colisiones en el espacio de nombres. Pero son muy improbables, porque ambos son software bien diseñado.

La documentación del complemento del compilador de Maven states :

El complemento del compilador se utiliza para compilar las fuentes de su proyecto. Desde la versión 3.0, el compilador predeterminado es javax.tools.JavaCompiler (si está utilizando java 1.6) y se utiliza para compilar fuentes Java. Si desea forzar el complemento utilizando javac, debe configurar la opción de complemento forceJavacCompilerUse

Y de hecho, cuando no se especifica forceJavacCompilerUse en nuestra compilación, hay algunos errores de compilación, por ejemplo, cuando el código hace referencia a com.sun. paquetes (legado, sabemos que es una mala idea ...)

¿Cuáles son otras diferencias entre estos dos modos de compilación en general y con maven? ¿Hay alguna diferencia de salida que uno deba saber?