Java comme langage de script pour Java?


Est-il possible d'utiliser Java comme langage de script java? Ou peut-être compiler en quelque sorte des scripts java en binarries java à l'exécution? J'ai essayé de chercher mais je n'ai rien trouvé de complet, sauf quelques hacks...

J'ai de l'expérience avec d'autres langages et par exemple pour C# j'ai utilisé lua qui était assez pratique mais maintenant je dois atteindre la plus grande performance car les appels de scripts seront d'environ 1.000.000 par image.

J'ai donc pensé que l'adaptation de java lui-même en tant que le langage de script pour le programme java devrait me fournir les meilleures performances et compatibilité.

Des suggestions?

Author: djechlin, 2012-12-06

8 answers

BeanShell est une solution de script couramment utilisée pour Java. C'est un langage de script qui ressemble beaucoup à Java.

D'autres solutions existent qui utilisent l'infrastructure Java et la JVM, mais avec un langage différent. par exemple, Scala, Groovy et Jython (un Python compatible Java). La chose importante à réaliser avec tout cela est qu'ils vont interopérer avec les bibliothèques Java créées à l'aide de Java standard, de sorte que vous pouvez trivialement utiliser (disons) Scala pour piloter votre langage Java créé solution.

Tout ce qui précède fournit un REPL ( read-eval-print-loop) afin que vous puissiez importer, instancier et interagir avec vos objets dans un environnement de ligne de commande dynamique. C'est très utile pour tester et prototyper les interactions, ainsi que pour tester vos scripts.

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

Vous pouvez utiliser BeanShell pour cela, mais Groovy, XTend et Scala pourraient faire de meilleurs choix.

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

La réponse est "Oui", vous pouvez utiliser Java comme langage de script dans un programme Java lui-même. En outre, il existe plusieurs autres langues qui peuvent également être utilisées à cette fin - Javascript, LUA, Groovy, Ruby, la liste est longue. L'intégration a été rendue beaucoup plus facile avec l'introduction du javax.API de script, qui normalise et simplifie grandement le traitement de l'intégration de langages de script tiers dans les programmes Java. Je recommande fortement de lire sur l'API et quelques tutoriels sur la page Oracles.

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

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

Vous pouvez utiliser JANINO http://docs.codehaus.org/display/JANINO/Home ...un compilateur JavaTM léger et "intégré" qui compile des programmes simples en mémoire dans le bytecode JavaTM qui s'exécute dans la JVM du programme en cours d'exécution... Voir les exemples http://docs.codehaus.org/display/JANINO/Basic

Ou Vous pouvez utiliser MVEL http://mvel.codehaus.org / Il est similaire à BeanShell, mais beaucoup plus rapide.

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

Depuis la version 7.0, Java a un support "officiel" pour la compilation au moment de l'exécution (if tools.jar du SDK est sur classpath). Probablement, la vitesse d'exécution peut être aussi élevée que java compilé, supérieure à celle des interprètes.

Point de départ à lire (de nombreux exemples sur 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

Pour des choses simples lorsque groovy etc n'est pas disponible, j'intègre java dans des scripts bash comme détaillé sur project java-script-template. Le code ressemble à ceci:

#!/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 est un compilateur Java à la volée (en mémoire), il donne à Java l'impression d'être un langage de script mais sans limitation. Il prend également en charge le rechargement à chaud des classes Groovy lorsque Groovy est utilisé dans un environnement Java.

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

Java 11 prend en charge l'exécution de code source sans compilation.

Pour un fichier HelloWorld.java contenant

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

, Vous pouvez exécuter

java HelloWorld.java

Pour exécuter le code. Il y a une limitation: toutes les classes doivent être définies dans le même fichier.

Si le fichier n'a pas d'extension .java, vous devez inclure l'option --source.

Par exemple pour un fichier HelloWorld contenant un code source, vous devez exécuter

java --source 11 HelloWorld.

Pour exécuter un java "script" directement dans le shell, vous pouvez utiliser

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

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

/usr/bin/java est un chemin vers java binaire.

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