2009-06-19 16 views
8

¿Cómo utilizo efectivamente el "motor de scripting" dentro de Java?¿Dónde se usa el motor de scripting Java?

¿Cuáles son todos los casos de uso adecuados para utilizar el motor de scripting?

¿Hay algún proyecto de código abierto que use "Scripting Engine"?

Una cosa que viene a la mente es el soporte de "Cierre, programación funcional", pero es más de uso técnico que "Requisito de aplicación".

Los complementos configurables están bien. Pero todavía hay tantos patrones (visitante, decorador) en el nivel alto que pueden hacer lo mismo.

No conozco bien el requisito ... con qué eficacia se podría utilizar en los patrones de Java EE ... donde podría complementarse con los patrones existentes.

Además, me gustaría ver más respuestas con algunas aplicaciones empresariales. Tal vez como encontrar un descuento complejo para un producto durante la venta basado en membresía o ubicación. Encontrar ranking para un algoritmo complejo. Especialmente ¿por qué no Java en algún escenario? (o C# en el mundo .NET)

Respuesta

12

En Java 6, soporte de motor de secuencias de comandos está integrada. Por ejemplo,

// 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')"); 

¿Por qué utilizar uno? Algunas de las razones:

  1. que tienen una biblioteca en un lenguaje de script que desea utilizar en Java (por ejemplo, una biblioteca de Python que se puede ejecutar a través de Jython)
  2. Desea proporcionar un mecanismo de programación configurable para los clientes, de modo que puedan proporcionar fragmentos de código cortos. Por ejemplo, he hecho esto en el pasado permitiendo a los clientes escribir filtros usando JavaScript (por ejemplo, es x < 2 y y> 5 yz> 10?).
  3. Usted puede implementar de manera más lógica compleja en herramientas como Ant mediante secuencias de comandos directamente en el archivo de configuración
  4. Puede implementar soluciones en un lenguaje más adecuados para ese dominio (por ejemplo, el uso de lambdas a través de Clojure), pero mantienen su confianza en la JVM .

Las implementaciones incluyen Rhino (una implementación Java de Javascript), Jython (un Java Python) y muchas más.

+2

Nota: No hay garantía de que los motores se agrupen con la JVM; por lo que debe traer el suyo como parte de su solicitud. –

1

"¿Cuáles son todos los casos de uso adecuados para utilizar el motor de scripts?" Esta es una pregunta bastante vaga. Hay muchos casos de uso. Éstos son sólo algunos que se me ocurre de inmediato:

  1. Plugin sistema/extensión
  2. IDE
  3. Programación tutorial con demostraciones en vivo

Estoy asumiendo que usted se refiere a JSR 223 en particular, . Si es así, usted debe buscar en scripting.dev.java.net

1

No he usado JavaScript específicamente, pero he integrado Groovy en mi marco de trabajo de aplicaciones para proporcionar un lenguaje específico de dominio (DSL). Creé funciones y clases que se conectan a mi aplicación.

El usuario tiene permiso para programar operaciones comunes dentro de la aplicación (macros) así como también implementar un procesamiento liviano para evitar la solución code-compiler-jar-deploy mucho más pesada. Si el usuario tiene una idea para un complemento en mi marco de procesamiento, puede crear un prototipo a través de Groovy en tiempo real y volver a Java (incluso nativo) cuando hay tiempo (o cuando se necesita velocidad). Tenga en cuenta que las secuencias de comandos son, por lo general, órdenes de magnitud más lentas que Java/C#/C/C++

9

Aquí hay algunos casos en que lo he usado.

1) Java quiere llamar al lenguaje de scripting, ejemplo 1. Tengo una aplicación de Java que acepta los comentarios de los usuarios a través del widget WMD JavaScript. (El mismo widget que utiliza StackOverflow, de hecho.) El usuario ingresa los comentarios en el formato de Marcado y una biblioteca de JavaScript llamada Showdown la convierte a HTML en dos lugares: (1) en el cliente, para admitir vistas previas en tiempo real; y (2) en el servidor, ya que quiero que el cliente envíe Markdown puro al servidor y lo almacene allí para que el usuario pueda editar el Markdown más tarde (en lugar de tener que revertir de alguna manera el HTML en Markdown). Cuando guardo el comentario en el servidor, también ejecuto la conversión allí, y almaceno el HTML junto con Markdown para no tener que convertir dinámicamente el Markdown al mostrar listas de comentarios. Para garantizar que el HTML en el servidor coincida con el HTML en el cliente, quiero usar exactamente la misma biblioteca Showdown. Así que ejecuto Showdown en el lado del servidor dentro del motor de JavaScript de Rhino.

2) Java quiere llamar al lenguaje de scripting, ejemplo 2. Estoy trabajando en una aplicación de automatización de implementación que involucra a partes interesadas de diferentes roles, como desarrolladores, administradores de sistemas e ingenieros de lanzamiento. La aplicación general (flujo de trabajo y UI) es una aplicación Java, pero en varios lugares llama a varios scripts (por ejemplo, Ruby, bash), como empujar paquetes, verificar la configuración, instalar paquetes, probar humo, etc. Esto se debe en parte a la secuencia de comandos es mejor/más económico para expresar la creación de directorios, copiar, mover, wgetting, etc., y en parte porque las personas que poseen esa parte del pastel saben cómo trabajar con lenguajes de scripting pero no con Java. Así que invocamos scripts aquí usando la API de scripting de Java. Es cierto que en este caso podríamos simplemente ejecutar los scripts fuera de Java pero ver # 3 a continuación.

3) El lenguaje de scripting desea llamar a Java. En la aplicación de implementación antes mencionada, tenemos registros de implementación basados ​​en web, y hacemos un gran esfuerzo para que los registros de implementación sean tan fáciles de leer y entender como sea posible, porque una gran población de desarrolladores/SQA/técnicos de lanzamiento consume los registros. y no todos entienden todos los detalles de qué ocurre exactamente con una implementación. La impresión bonita y la codificación por colores son parte del enfoque. Implementamos una API de registro de implementación de impresión bonita en Java, pero queremos que las secuencias de comandos puedan invocar eso. Entonces, por ejemplo, cuando se ejecuta el script de inserción de Ruby, queremos que registre su progreso en la impresora bonita. Ejecutar Ruby dentro de JRuby permite que el script de Ruby vea la API de la impresora bonita de Java.

Cuestiones relacionadas