Где используется механизм сценариев Java?
Как эффективно использовать "Скриптовый движок" внутри Java?
Каковы все правильные сценарии использования для использования механизма сценариев?
Есть ли проект с открытым исходным кодом, использующий Scripting Engine?
Одна вещь приходит на ум - поддержка "Закрытие, функциональное программирование" возможна, но она более технически полезна, чем "Требование к приложению".
Настраиваемые плагины в порядке. Но все же многие шаблоны (посетитель, декоратор) на высоком уровне могут делать то же самое.
Я не очень хорошо знаю требование... насколько эффективно оно может использоваться в шаблонах Java EE... где оно может дополнять существующие шаблоны.
Кроме того, я хотел бы видеть больше ответов с некоторыми деловыми случаями. Может быть, как найти комплексную скидку на продукт во время продажи на основе членства или местоположения. Нахождение ранжирования для сложного алгоритма. Особенно почему не Java в каком-то сценарии? (или C# в мире.NET)
4 ответа
В Java 6 встроена поддержка механизма сценариев. Например,
// Create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// Create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
// Evaluate JavaScript code from String
engine.eval("print('Hello, World')");
Почему вы используете один? Несколько причин:
- у вас есть библиотека на языке сценариев, которую вы хотите использовать в Java (например, библиотека Python, которую вы можете запустить через Jython)
- Вы хотите предоставить настраиваемый механизм программирования для клиентов, чтобы они могли предоставлять короткие фрагменты кода. Например, я делал это в прошлом, позволяя клиентам писать фильтры с использованием JavaScript (например, это x < 2 и y > 5 и z > 10?).
- Вы можете реализовать более сложную логику в таких инструментах, как Ant, используя сценарии непосредственно в файле конфигурации
- Вы можете реализовывать решения на языке, более подходящем для этой области (например, используя лямбды через Clojure), но при этом сохраняете свою зависимость от JVM.
Реализации включают Rhino (Java-реализацию Javascript), Jython (Java Python) и многие другие.
Вот несколько случаев, когда я использовал это.
1) Java хочет вызвать язык сценариев, пример 1. У меня есть приложение Java, которое принимает комментарии пользователей через виджет WMD JavaScript. (Фактически, тот же виджет, который использует Stackru.) Пользователь вводит комментарии в формате Markdown, а библиотека JavaScript с именем Showdown преобразует его в HTML в двух местах: (1) на клиенте для поддержки предварительного просмотра в реальном времени; и (2) на сервере, так как я хочу, чтобы клиент отправлял чистую Markdown на сервер и сохранял ее там, чтобы пользователь мог позже редактировать Markdown (вместо того, чтобы каким-либо образом преобразовывать HTML в Markdown). При сохранении комментария на сервере я также запускаю преобразование и сохраняю HTML-код рядом с Markdown, поэтому мне не нужно динамически преобразовывать Markdown при отображении списков комментариев. Чтобы убедиться, что HTML на сервере совпадает с HTML на клиенте, я хочу использовать точно такую же библиотеку Showdown. Поэтому я запускаю серверную часть Showdown внутри движка Rhino JavaScript.
2) Java хочет назвать язык сценариев, пример 2. Я работаю над приложением для автоматизации развертывания, в котором участвуют заинтересованные стороны из разных ролей, такие как разработчики, системные администраторы и релиз-инженеры. Общее приложение (рабочий процесс и пользовательский интерфейс) является Java-приложением, но в разных местах оно вызывает различные сценарии (например, Ruby, bash), например, для отправки пакетов, проверки конфигурации, установки пакетов, тестирования дыма и т. Д. Это отчасти потому, что сценарий лучше / экономичнее для создания каталогов, копирования, перемещения, создания виджетов и т. д., и отчасти потому, что люди, которые владеют этой конкретной частью пирога, знают, как работать с языками сценариев, но не с Java. Поэтому мы вызываем скрипты здесь, используя Java Scripting API. По общему признанию в этом случае мы могли бы только выполнить сценарии вне Java, но см. № 3 ниже.
3) Язык сценариев хочет называть Java. В вышеупомянутом приложении развертывания у нас есть веб-журналы развертывания, и мы прилагаем много усилий для того, чтобы сделать журналы развертывания как можно более легкими для чтения и понимания, потому что большое количество разработчиков /SQA/ релиз-инженеров использует журналы, и Не все понимают все детали того, что именно происходит с развертыванием. Pretty-печать и цветное кодирование являются частью подхода. Мы реализовали API-интерфейс журнала развертывания в Java, но хотим, чтобы скрипты вызывали его. Так, например, при запуске push-скрипта Ruby мы хотим, чтобы он записывал свой прогресс на симпатичный принтер. Запуск Ruby внутри JRuby позволяет сценарию Ruby видеть API-интерфейс симпатичного принтера Java.
"Каковы все правильные варианты использования скриптового движка?" Это довольно расплывчатый вопрос. Есть много вариантов использования. Вот некоторые из них, о которых я могу думать сразу:
- Плагин / система расширения
- IDE
- Учебник по программированию с живыми демонстрациями
Я предполагаю, что вы имеете в виду JSR 223 в частности. Если это так, вы должны посмотреть на https://scripting.dev.java.net/
Я не использовал JavaScript специально, но я интегрировал Groovy в свою прикладную инфраструктуру для обеспечения языка, специфичного для домена (DSL). Я создал функции и классы, которые подключаются к моему приложению.
Пользователь может создавать сценарии общих операций в приложении (макросы), а также реализовывать упрощенную обработку, чтобы избежать более тяжелого решения code-compiler-jar-deploy. Если у пользователя есть идея для плагина для моей платформы обработки, он может создать прототип через Groovy в режиме реального времени и вернуться к Java (возможно, даже к встроенному), когда есть время (или когда требуется скорость). Имейте в виду, что сценарии обычно на несколько порядков медленнее, чем Java/C#/C/C++