2015-06-21 2 views
2

Так что я столкнулся с этой проблемой. Мы используем Java как наш язык сценариев, потому что мы уже используем его для всего остального, и для него не требуются дополнительные сторонние библиотеки.Компиляция/запуск .java-файлов во время выполнения против отражения

Теперь мы выполняем код выполнения через отражение. Что-то вроде:

Class triggerAction = null; 
    try { 
     triggerAction = Class.forName(actionName); 
     Gdx.app.log("Info", triggerAction.getName() + " attached to " 
       + this.toString()); 
     try { 
      this.triggerAction = (TriggerAction) triggerAction 
        .newInstance(); 
     } 

Это замечательно, но это не идеально. Любые файлы java, предназначенные для запуска во время выполнения, все равно должны быть скомпилированы в последнюю сборку. В идеале, не разработчики могли бы играть с файлами сценариев, хранящимися как в каталоге '/ scripts /', а затем просто запускать программу и выполнять модифицированный файл .java. Это то, чего я никогда не делал раньше, поэтому я немного не понимаю, как это сделать, чтобы это было безопасно для конечного пользователя.

Я нашел этот подход: Generating, compiling and using Java code at run time?

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

+3

* Мы используем Java как наш язык сценариев * Подождите, что? Java определенно не является языком сценариев. Если вы хотите использовать язык сценариев, используйте JavaScript. С помощью Java 8 вы получаете полную java-версию версии движка JavaScript под названием [Nashorn] (http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html), которую вы можете вызвать изнутри Java. В противном случае вы можете загружать классы во время выполнения, но это сложнее, поскольку вам нужно создать систему плагинов и [использовать загрузчик классов] (http://tutorials.jenkov.com/java-reflection/dynamic-class-loading -reloading.html). – Turing85

+0

Итак, ваш вопрос: «Как я могу скомпилировать исходный файл Java во время выполнения?»? – immibis

+0

Я не знал о Нашорне. Это интересно. Но как я могу взаимодействовать между скриптами и моей java-кодовой базой? –

ответ

0

Закончен с использованием двигателя Nashorn JS для Java. Работал как шарм! Для изменений сценария не требуется никаких рабочих процессов.

0

Используйте команду Runtime.getRuntime().exec("javac SomeFile.java") для компиляции файлов Java через командную строку.

Если вы не уверены, если javac или java находится в PATH, попробуйте указать в полностью путь непосредственно (т.е. C:\Program Files\Java\jdk1.8.0_xx\bin\javac) или просто спросить у пользователя, где он есть.

0

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

Используя javax.tools подход (описанный в Q & А вы связаны с) не требует от пользователя установить $PATH или $JAVA_HOME или $CLASS_PATH. AFAIK, все, что требуется, - это то, что пользователь запускает java из установки JDK.

+0

Хм нормально. Может быть выполнимо с оболочкой launch4j. Тем не менее, Dunno о юридическом материале о перераспределении JDK. –

+0

Правовые вопросы такие же, как и для JRE. (Но если вы сомневаетесь, поговорите с адвокатом вашей компании.) Кроме того, вам не нужна специальная обертка.Приложение Java может запускать компилятор Java в той же JVM. –

+0

Нет, если конечный пользователь не использует JDK, не так ли? Для нас это довольно большая проблема. Поэтому используйте launch4j, чтобы обернуть JDK, по крайней мере, это имеет смысл для меня, минус потенциальные юридические проблемы. –

Смежные вопросы