Java作为Java的脚本语言?

15

是否可以将Java用作Java的脚本语言?或者在运行时以某种方式将Java脚本编译成Java二进制文件?我尝试过搜索,但除了一些hack之外,找不到任何综合性的内容...

我有使用其他语言的经验,例如对于C#,我使用了lua,这非常方便,但现在我需要达到最大的性能,因为每帧调用脚本约为1,000,000次。

所以我想到将Java本身适应为Java程序的脚本语言,这应该为我提供最佳的性能和兼容性。

有什么建议吗?


1
你有没有看过LuaJ或者LuaJava?https://dev59.com/MnI95IYBdhLWcg3w3iHG - scrappedcola
@scrappedcola,据我所知,使用Lua可能无法提供最佳性能,但如果这是我的唯一选择,那么当然,这不会成为问题。但首先,我想尝试找到更快的东西,如果可能的话。 - NewProger
1
Groovy是由Sun为了这个目的而开发的:http://www.oracle.com/technetwork/articles/java/groovy-1695411.html - paulsm4
我认为Groovy不是Sun/Oracle开发的。我认为James Strachan对此负责。 - Brian Agnew
@BrianAgnew - 严格来说,James Strachan是为Apache基金会工作,而不是Sun。但是在那个时候,Sun和Apache基金会之间有着非常密切、富有成果的关系。Sun全力支持和鼓励Groovy的开发。 - paulsm4
8个回答

10

BeanShell 是 Java 常用的脚本解决方案。它是一种非常类似于 Java 的脚本语言。

还有其他使用 Java 基础设施和 JVM,但使用不同语言的解决方案。例如,Scala、Groovy 和 Jython(Java 兼容的 Python)。需要注意的是,所有这些解决方案都可以与使用标准 Java 创建的 Java 库进行交互操作,因此您可以轻松地使用(例如)Scala 驱动您使用 Java 语言创建的解决方案。

上述所有解决方案都提供 REPL (read-eval-print-loop),以便您可以在动态命令行环境中导入、实例化和交互操作您的对象。这对于测试和原型交互以及测试脚本非常有用。


哦,我在这里看到了BeanShell的用途。请查看我的帖子,以查看一些使用BeanShell编写的脚本。 - mtk

8
你可以使用BeanShell,但是Groovy、XTend和Scala可能更好。

嗯,“Groovy和Scala可能是更好的选择”,你能详细说明一下吗? - NewProger
4
引用的链接中提到:“Groovy是一种通用的脚本语言,运行在Java虚拟机(JVM)上,可以被视为Java的超集。” - paulsm4
@paulsm4 是的,现在我打开了那个链接,看起来就是我要找的东西。不知道为什么谷歌没有给我一些线索。无论如何,我现在要尝试一下 :) 谢谢! - NewProger

6

Java 11具有在未编译的情况下运行源代码的支持。

对于包含以下内容的文件HelloWorld.java

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

您可以运行

java HelloWorld.java

执行代码。有一个限制:所有的类都必须在同一个文件中定义。

如果文件没有 .java 扩展名,您需要包含 --source 选项。

例如,对于包含源代码的文件 HelloWorld,您需要运行

java --source 11 HelloWorld

要直接在shell中运行Java“脚本”,您可以使用

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

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

/usr/bin/javajava 二进制文件的路径。


6
答案是“是的”,您可以在Java程序本身中使用Java作为脚本语言。此外,还有几种其他语言也可用于此目的 - Javascript、LUA、Groovy、Ruby等等。随着javax.scripting API的引入,集成变得更加容易,该API标准化并大大简化了将第三方脚本语言集成到Java程序中的处理过程。我强烈建议阅读API和Oracle页面上的一些教程。

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


5
自从版本7.0以来,Java已经「官方」支持在运行时编译(如果SDK的tools.jar在类路径上)。可能执行速度可以与编译后的Java一样快,高于解释器。
阅读的起点(互联网上有很多示例):
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;


JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler!=null) {
    .... 
}

4

Janino 的主页已经更换了,现在是 http://janino-compiler.github.io/janino/。 - Anthony

2

在一些简单的情况下,当没有groovy等可用时,我会将Java嵌入到bash脚本中,详细信息请参见项目java-script-template。代码如下:

#!/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

RelProxy是一个即时(内存中)编译Java的编译器,它让Java感觉像脚本语言一样,但没有任何限制。当Groovy在Java环境中使用时,它还支持Groovy类的热加载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接