2010-08-21 18 views
6

En mi proyecto actual, necesito compilar el código java en tiempo de ejecución (en segundo plano para procesar la entrada del usuario). Esto funciona bien con tools.jar en el classpath. Sin embargo, no todos los usuarios de mi programa tienen JDK instalado en su sistema. Algunos de ellos solo tienen JRE y en ese caso no hay un compilador de Java disponible en tiempo de ejecución. Puedo resolver ese problema incluyendo tools.jar de Sun como parte de mi herramienta.compilador Java en Runtime

Pero tools.jar es muy grande (> 12 MB). El problema es que tengo que incluir el archivo jar grande, aunque solo estoy interesado en una pequeña fracción de la funcionalidad proporcionada por este contenedor.

  1. ¿Es posible romper el archivo tools.jar por lo que tengo una pequeño subconjunto de las clases que son requerido para compilar código Java solamente?

  2. ¿Esto es ilegal?

Muchas gracias.

Respuesta

3

El compilador eclise tiene solo 1.6 MB y debería funcionar sin eclipse. Puede descargarlo here. También parece que implementa la API JavaCompiler.

Está licenciado bajo la licencia pública eclipse por lo que incluirlo en su propia aplicación no debería ser un problema.

+0

Esta es una opción que consideré usar. Sí, es posible usar el compilador Eclipse sin Eclipse. Tuve algunos problemas al usarlo debido a su comportamiento de almacenamiento en memoria caché de subprocesos, es decir, no es posible obtener más de una instancia del compilador de un subproceso. En mi escenario de uso, tengo problemas para hacer un seguimiento de los mensajes de diagnóstico del compilador porque necesito una nueva instancia del compilador cada vez. – Dipmedeep

0

No creo que sea posible separar tools.jar, y tampoco debería ser legal incluir tools.jar.

Comprobar http://forums.sun.com/thread.jspa?threadID=5161541

Se podría buscar alguna tercera parte del compilador de Java y cambiar el código para utilizar mismo.

  • GCJ, una parte de gcc que compila C, Fortran, Pascal y otros idiomas además de programación Java. También puede generar código nativo usando el back-end de gcc. http://en.wikipedia.org/wiki/GNU_Compiler_for_Java

  • Tribunal de Justicia, el compilador de Eclipse para Java, es un incremento compilador de código abierto utilizado por el Eclipse JDT.

  • http://en.wikipedia.org/wiki/Jikes (Éste no es compatible con Java 6 y soporte limitado para Java5)

Pero no sé código exacto para compilar el uso de estos.

+1

GCJ es inútil. Jikes es prometedor pero no admite muchas características de Java 5, que es lo que la mayoría de nosotros usamos – TheLQ

0

¿quieres algo así como java-scripting como BeanShell? Ayuda a ejecutar código java sin compilarlos.

1

En lugar de compilar código en tiempo de ejecución, reescribo el código en un lenguaje de script y uso el scripting framework. No es necesario para jdk y no hay problemas legales para solucionar. Luego, también tiene muchas opciones de idiomas para usar, como Beanshell, JavaScript o jython.

+0

He usado la implementación de Rhino incorporada y funciona muy bien. También tiene la ventaja de unas pocas funciones integradas que nunca llegaron a Rhino, además de simplificar todo el proceso. – TheLQ

+0

JRuby alguien? :) –

0

Es posible que desee echar un vistazo a la biblioteca Javassist que contiene un compilador de fragmentos adecuado para crear un método para hacer un cálculo y luego usar ese método.

Cuál es el más adecuado depende de sus necesidades reales, especialmente con qué frecuencia necesita hacer esto.

1

Probablemente una mejor pregunta es ¿por qué?

Si necesita hacer cálculos matemáticos dinámicos, entonces considere JEval. Si necesita personas para escribir complementos simples, considere algunos de los lenguajes dinámicos como Javascript o Python que @Jay mencionó.

Para cualquier otra cosa, debe requerir que su usuario descargue el JDK, ya que eso es lo que requiere escribir Java. Sería difícil encontrar una buena razón por la que desea insertar un compilador en su programa