Java компилятор во время выполнения

В моем текущем проекте мне нужно скомпилировать код Java во время выполнения (в фоновом режиме для обработки ввода от пользователя). Это прекрасно работает с tools.jar в classpath. Однако не все пользователи моей программы имеют установленный JDK в своей системе. Некоторые из них имеют только JRE, и в этом случае во время выполнения не будет доступен компилятор Java. Я могу решить эту проблему, включив tools.jar от Sun как часть моего инструмента.

Но tools.jar очень большой (>12 МБ). Проблема в том, что мне нужно включить большой файл jar, хотя меня интересует лишь небольшая часть функций, предоставляемых этим jar.

  1. Можно ли разбить файл tools.jar, чтобы у меня было небольшое подмножество классов, необходимых только для компиляции кода Java?

  2. Это незаконно?

Большое спасибо.

6 ответов

Решение

Компилятор eclise занимает всего 1,6 МБ и должен работать без затмения. Вы можете скачать его здесь. Также похоже, что он реализует API JavaCompiler.

Он лицензируется по публичной лицензии eclipse, поэтому включение его в вашу собственную заявку не должно быть проблемой.

Вместо того чтобы компилировать код во время выполнения, я бы переписал код на языке сценариев и использовал среду сценариев. Тогда нет необходимости в jdk, и нет никаких юридических проблем, чтобы обойти. Кроме того, у вас есть много вариантов выбора языков, таких как Beanshell, JavaScript или jython.

Наверное, лучший вопрос, почему?

Если вам нужно выполнить динамические математические вычисления, рассмотрите JEval. Если вам нужны люди для написания простых плагинов, рассмотрите некоторые динамические языки, такие как Javascript или Python, которые упоминал @Jay.

Во всем остальном вы должны потребовать, чтобы ваш пользователь загрузил JDK, поскольку это то, что требуется для написания Java. Было бы трудно найти вескую причину, по которой вы хотели бы встроить компилятор в вашу программу.

Я не думаю, что было бы возможно разбить tools.jar, а также не должно быть законным включать tools.jar.

Проверьте http://forums.sun.com/thread.jspa?threadID=5161541

Вы можете найти сторонний Java-компилятор и изменить свой код, чтобы использовать его.

  • GCJ, часть gcc, которая компилирует C, Fortran, Pascal и другие языки программирования помимо Java. Он также может генерировать нативный код с помощью серверной части gcc. http://en.wikipedia.org/wiki/GNU_Compiler_for_Java

  • ECJ, Eclipse Compiler для Java, является инкрементным компилятором с открытым исходным кодом, используемым Eclipse JDT.

  • http://en.wikipedia.org/wiki/Jikes(Этот не поддерживает Java 6 и ограниченную поддержку Java5)

Но я не знаю точного кода для компиляции с использованием этих.

Вы хотите что-то вроде сценариев Java, таких как BeanShell? Это поможет запустить код Java без их компиляции.

Возможно, вы захотите взглянуть на библиотеку Javassist, которая содержит компилятор сниппета, подходящий для создания метода для вычисления и последующего использования этого метода.

Какой из них наиболее подходит, зависит от ваших реальных потребностей - особенно от того, как часто вам нужно это делать.

Другие вопросы по тегам