Где используется механизм сценариев 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')");

Почему вы используете один? Несколько причин:

  1. у вас есть библиотека на языке сценариев, которую вы хотите использовать в Java (например, библиотека Python, которую вы можете запустить через Jython)
  2. Вы хотите предоставить настраиваемый механизм программирования для клиентов, чтобы они могли предоставлять короткие фрагменты кода. Например, я делал это в прошлом, позволяя клиентам писать фильтры с использованием JavaScript (например, это x < 2 и y > 5 и z > 10?).
  3. Вы можете реализовать более сложную логику в таких инструментах, как Ant, используя сценарии непосредственно в файле конфигурации
  4. Вы можете реализовывать решения на языке, более подходящем для этой области (например, используя лямбды через 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.

"Каковы все правильные варианты использования скриптового движка?" Это довольно расплывчатый вопрос. Есть много вариантов использования. Вот некоторые из них, о которых я могу думать сразу:

  1. Плагин / система расширения
  2. IDE
  3. Учебник по программированию с живыми демонстрациями

Я предполагаю, что вы имеете в виду JSR 223 в частности. Если это так, вы должны посмотреть на https://scripting.dev.java.net/

Я не использовал JavaScript специально, но я интегрировал Groovy в свою прикладную инфраструктуру для обеспечения языка, специфичного для домена (DSL). Я создал функции и классы, которые подключаются к моему приложению.

Пользователь может создавать сценарии общих операций в приложении (макросы), а также реализовывать упрощенную обработку, чтобы избежать более тяжелого решения code-compiler-jar-deploy. Если у пользователя есть идея для плагина для моей платформы обработки, он может создать прототип через Groovy в режиме реального времени и вернуться к Java (возможно, даже к встроенному), когда есть время (или когда требуется скорость). Имейте в виду, что сценарии обычно на несколько порядков медленнее, чем Java/C#/C/C++

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