Java come linguaggio di scripting per Java?


È possibile utilizzare Java come linguaggio di scripting per java? O forse in qualche modo compilare script java in binarries java in fase di runtime? Ho provato a cercare ma non sono riuscito a trovare nulla di completo tranne alcuni hack...

Ho esperienza con altri linguaggi e ad esempio per c# ho usato lua che era abbastanza conveniente, ma ora ho bisogno di ottenere le massime prestazioni poiché le chiamate per gli script saranno circa 1.000.000 per frame.

Quindi ho pensato che adattare java stesso come un il linguaggio di scripting per il programma java dovrebbe fornirmi le migliori prestazioni e compatibilità.

Qualche suggerimento?

Author: djechlin, 2012-12-06

8 answers

BeanShell è una soluzione di scripting comunemente usata per Java. È un linguaggio di scripting che è molto simile a Java.

Esistono altre soluzioni che utilizzano l'infrastruttura Java e la JVM, ma con un linguaggio diverso. ad esempio Scala, Groovy e Jython (un Python compatibile con Java). La cosa importante da realizzare con tutti questi è che interagiranno con le librerie Java create utilizzando Java standard, quindi è possibile utilizzare banalmente (ad esempio) Scala per guidare il linguaggio Java creato soluzione.

Quanto sopra fornisce un REPL (read-eval-print-loop ) in modo da poter importare, istanziare e interagire con i tuoi oggetti in un ambiente dinamico da riga di comando. Questo è molto utile per testare e prototipare le interazioni, oltre a testare i tuoi script.

 7
Author: Brian Agnew, 2012-12-06 16:13:57

Puoi usare BeanShell per questo, ma Groovy, XTend e Scala potrebbero fare scelte migliori.

 7
Author: Peter Lawrey, 2013-09-03 22:56:50

La risposta è 'Sì', è possibile utilizzare Java come linguaggio di scripting all'interno di un programma Java stesso. Inoltre, ci sono molte altre lingue che possono essere utilizzate anche per questo scopo: Javascript, LUA, Groovy, Ruby, la lista è lunga. L'integrazione è stata resa molto più semplice con l'introduzione del javax.API di scripting, che standardizza e semplifica notevolmente l'elaborazione di integrare linguaggi di scripting di terze parti in programmi Java. Consiglio vivamente di leggere l'API e alcuni tutorial sulla pagina Oracles.

Http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

 5
Author: Perception, 2013-03-24 23:11:27

Puoi usare JANINO http://docs.codehaus.org/display/JANINO/Home ...un leggero," incorporato " JavaTM compilatore che compila semplici programmi in memoria in bytecode JavaTM che viene eseguito all'interno della JVM del programma in esecuzione... Vedi esempi http://docs.codehaus.org/display/JANINO/Basic

Oppure puoi usare MVEL http://mvel.codehaus.org / È simile a BeanShell, ma molto più veloce.

 3
Author: Andrej Fink, 2013-01-20 19:41:51

Dalla versione 7.0, Java ha il supporto "ufficiale"per la compilazione in fase di runtime (if tools.jar da SDK è su classpath). Probabilmente, la velocità di esecuzione può essere alta quanto java compilato, superiore agli interpreti.

Punto di partenza da leggere (molti esempi in Internet):

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;


JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler!=null) {
    .... 
}
 3
Author: Jacek Cz, 2017-03-17 09:16:42

Per cose semplici quando groovy etc non è disponibile, inserisco java negli script bash come dettagliato sul progetto java-script-template. Il codice è simile a questo:

#!/bin/bash
set -e
TEMP_DIRECTORY=/tmp
TEMPFILE=`mktemp $TEMP_DIRECTORY/ScriptXXXXX|sed -e 's/\.//g'`
CLASS_NAME=`basename "$TEMPFILE"`
JAVA_SOURCE=$TEMPFILE.java
cat <<EOF >$JAVA_SOURCE.tmp

//Write your java class here with a main method
//Be sure to leave the name of the class as Script 

//import some commonly used imports
import java.io.*;
import java.text.*;
import java.util.*;

public class Script {

    public static void main(String[] args) throws Exception {
       System.out.println("Here's a test run for you");
    }

}

EOF

## change the name of the class to match the file
sed "s/public class Script /public class $CLASS_NAME /g" $JAVA_SOURCE.tmp >$JAVA_SOURCE

## compile the java
javac $JAVA_SOURCE 

## run the class using all passed in parameters from the command line
java -classpath $TEMP_DIRECTORY $CLASS_NAME
 1
Author: Dave Moten, 2014-05-07 05:40:53

RelProxy è un compilatore Java al volo (in memoria), rende Java come un linguaggio di scripting ma senza limitazioni. Supporta anche la ricarica hot class delle classi Groovy quando Groovy viene utilizzato in un ambiente Java.

 0
Author: jmarranz, 2014-02-15 11:42:50

Java 11 supporta l'esecuzione di codice sorgente senza compilazione.

Per un file HelloWorld.java contenente

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World!!!");
  }
}

È possibile eseguire

java HelloWorld.java

Per eseguire il codice. C'è una limitazione: tutte le classi devono essere definite nello stesso file.

Se il file non ha l'estensione .java, è necessario includere l'opzione --source.

Ad esempio per un file HelloWorld contenente un codice sorgente è necessario eseguire

java --source 11 HelloWorld.

Per eseguire un java "script" direttamente nella shell è possibile utilizzare

#!/usr/bin/java --source 11

public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World")
  }
}

Dove /usr/bin/java è un percorso di java binario.

 0
Author: fxmasa, 2018-08-15 19:38:37