问题标签 [javax.script]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
269 浏览

java - 我无法使用 eval() 评估字符串

我正在尝试制作一个计算器应用程序。我想评估 TextView 的内容并将其显示为 toast 消息。eval() 语句引发 ScriptException 异常,如下所示。

即使我已经导入了 javax.script.ScriptException。我不明白为什么它会抛出异常。

这是我的xml代码:

这是我的java代码:

PS。我需要尽快回复,因为这是一个学校项目

0 投票
1 回答
2357 浏览

kotlin - 如何从 ScriptEngineManager 检索 Kotlin jsr223 脚本引擎?

我正在尝试编写一个界面(GUI)来运行一些 Kotlin 脚本。我从一个 Junit 测试开始,以确保我可以执行脚本。我什至无法加载 kotlin 引擎。看起来我的依赖项(gradle)是有序的,但你可以仔细检查一下。

多于:ext.kotlin_version = '1.3.0'

这是失败的测试:

最后一次assertNotNull失败,输出如下:

可以看到,虽然脚本引擎类似乎加载Class.forName成功,但名称kotlin并没有注册,可用引擎列表只包含 Nashorn。如何确保引擎已注册?

0 投票
0 回答
113 浏览

java - 使用 Python 3 运行 javax.script.ScriptEngine

我想调用Python 3从我的 Java 库中编写的类/函数。为此,我尝试使用javax.script.ScriptEngine;,但是当我执行这些行时:

在终端中执行完全相同的行时,加载的 python 版本是 2.7 而不是我找到的 3.6 版本(并且需要,因为我要调用的代码在 Python 3.6 中)。

如何加载 python 3.6 而不是 2.7?

0 投票
1 回答
139 浏览

java - 在 javax.script API 中重定向 KotlinScriptEngine 的标准输出

我正在使用 javax.script API 执行 kotlin 脚本。我想捕获输出并稍后打印日志。

我可以为 nashorn 脚本引擎做到这一点,但同样不适用于 KotlinScriptEngine。

Nashorn 的输出

为 kotlin 调整时的相同代码片段如下

kotlin 的输出

我正在使用 kotlin 版本 1.3.72 非常感谢任何帮助。谢谢。

0 投票
1 回答
296 浏览

java - 从 Java 调用 Kotlin 时如何获取错误的行号?

我试图从 java 调用 kotlin 脚本时获取哪一行生成错误。

下面的代码给出了行号-1。

我错过了什么吗?

0 投票
1 回答
34 浏览

sql-server - 带有 .SCRIPT 扩展名的文件 - 不在 SQL 中运行

我有一个名为“CreateDatabase1.script”的文件。我想从这个文件创建一个数据库,但是这个文件在 SQL Server 管理工作室中是不可执行的。如何运行此文件并创建此数据库?

0 投票
1 回答
76 浏览

java - 通过 javax.script 在 Java 中编写脚本:无法检索 Python 的 ScriptEngine

我有一个小 maven 项目来学习使用 javax.script API 编写 Java 脚本,即 JavaScript 和 Python。虽然 JavaScript 运行良好,例如在这个方法中

我根本无法运行 python,因为返回的引擎始终为空:

有什么想法可以让它发挥作用吗?


以下是我的 pom 的相关部分:

我使用https://stackoverflow.com/a/38039047/5333340中的方法来打印可用的引擎,我得到的输出是:

所以找到了引擎。但为什么我不能得到它?我仔细检查了里面的参数getEngineByName没有错别字。

我什至在我的计算机上安装了 python 2.7(虽然我认为这实际上没有必要;实现应该在 jython 包中),但它并没有改变任何东西。

0 投票
2 回答
60 浏览

javascript - 在 Java 中使用(最终用户定义的)JavaScript 代码时的安全注意事项

我正在开发一个 Java 项目。在其中,我们希望最终用户能够定义基于一组给定的原始类型或字符串变量计算的变量。在某些时候,所有给定的变量都设置为特定的值,然后应该进行计算。然后必须将所有生成的计算变量发送到 Java。

我正在评估最终用户定义其计算的方法。(当前)想法是让他编写 JavaScript 并让该代码在 Java 程序中解释/执行。我知道有两种方法可以做到这一点:使用 javax.scripting API 或 GraalVM/Truffle。在这两种情况下,我们都会这样做:

  1. 给定的变量被赋予到脚本中。在 javax.scripting 中ScriptEngine.put,在 Graal/Truffle 中,通过Value.putMember.
  2. 最终用户可以在全局上下文中定义变量(其名称不得与来自 Java 的名称冲突)。他如何设置它们的值取决于他 - 他可以直接设置它们(到一个常数,到给定变量之一,到其中一些的总和......)或定义对象和函数并通过调用这些来设置值.
  3. 当给定变量具有固定值时,将执行脚本。
  4. 脚本在全局上下文中定义的所有变量都将发送到 Java。在 javax.scripting 中ScriptEngine.get,在 Graal/Truffle 中,通过Value.getMember.

注意:我们不会授予脚本访问任何 Java 类或方法的权限。在 javax.scripting 中通过检查脚本是否包含字符串Java.type(并禁止这样的脚本),在 Graal/Truffle 中通过使用默认值Context(具有allowAllAccess=false)。

互联网上充满了关于 JavaScript 安全问题以及如何避免它们的提示和技巧。一方面,我觉得它们都不适用于这里(解释如下)。另一方面,我不太了解 JavaScript——除了纯粹的、无副作用的计算,我从未将它用于其他任何事情。

所以我在这里寻找一些指导:在这种情况下可能会出现什么样的安全问题?


为什么在这种情况下我看不到任何安全问题:

这是纯 JavaScript。它甚至不允许创建可用于例如在磁盘上创建文件的 Blob(它是 WebAPI 的一部分,而不是 JavaScript)。我知道 JavaScript 不包含任何逃避其沙箱的功能(如文件访问、线程、流......),它仅能够操纵提供给其沙箱的数据。请参阅https://262.ecma-international.org/11.0/#sec-overview的这一部分:

ECMAScript 是一种面向对象的编程语言,用于在主机环境中执行计算和操作计算对象。此处定义的 ECMAScript 并非旨在实现计算自给自足;实际上,本规范中没有规定外部数据的输入或计算结果的输出。相反,预计 ECMAScript 程序的计算环境将不仅提供本规范中描述的对象和其他设施,还提供某些特定于环境的对象,其描述和行为超出了本规范的范围,除非指出它们可以提供可以访问的某些属性和可以从 ECMAScript 程序调用的某些函数。

我们场景中的沙箱只放入了一些无害的玩具(即给定的原始类型或字符串的变量),在孩子玩过它们(脚本已运行)后,生成的建筑物(用户定义的变量)被拿走出来保存它们(在Java程序中使用)。

0 投票
1 回答
42 浏览

javascript - 验证是否使用 GraalVM

由于 Nashorn 已停产,我们目前正在尝试将我们的(仍然是 Java 8)应用程序(非常大的单体)从 Nashorn 更改为 GraalVM。由于该应用程序在多个项目中被用作库,而不是使用整个 GraalVM 运行时,我们决定只将必要的 jars 添加到类路径中(目前看来这是可行的)。

为了使用 GraalVM,我将所有出现的 getEngineByName 更改为 graal.js,如下所示:

由于应用程序非常复杂,理解应用程序的各个方面都相对困难,我想知道是否有一种方法可以验证使用准备好的 JavaScript 字符串作为输入的 JavaScript 引擎?我的目标是编写一个单元测试来验证每个将 JavaScript 作为输入的方法,如果 GraalVM 真的被使用的话。

实现这一目标的最佳方法是什么?