我正在开发一个需要执行JavaScript的Java应用程序。Nashorn JS引擎即将被弃用,取而代之的是Graal SDK提供的一组API,它利用了GraalVM。基本上执行多种语言的虚拟机。
至少我是这么想的。所以我花了一天时间试图让它工作。我下载了使用JDK 8的GraalVM rc6。我使用IntelliJ IDEA并将GraalVM添加为新的JDK。我发现我应该添加虚拟机作为开发工具包很奇怪,但我知道它是基于JDK 8的,所以我没意见。
问题与其他问题不同,我无法让新包工作。我的IDE告诉我它无法解决它们。
实际上,org.graalvm包都无法解决。
所以我下载了JDK 11 build 28,因为据我所知,JDK 11从build 20开始就附带了GraalVM。
实际上,在本例中,可以找到一些包,但远低于预期:例如org。格拉尔文。一夫多妻制仍然无法解决。
最后,我尝试从Maven添加Graal SDK,并解决了这些包。现在我在运行时遇到一个异常:
Context ctx = Context.create(“js”);
在类路径上找不到语言和多语言实现。确保松露api。jar在类路径上。
我认为前2种情况下的问题实际上不是获取GraalVM JDK,但它甚至以这种方式抛出异常。
有经验的人能解释这件事吗?
IntelliJ并没有将Graal SDK中的所有JAR添加到您的类路径中。
您可以通过导航到将Jars添加到IntelliJ中的类路径
File > Project Structure > SDKs > Choose your Graal SDK
然后单击底部的按钮添加Jar文件。添加graal sdk。jar将解决查找
org的问题。graalvm
软件包。
这将避免修改pom。xml
文件来修复IDE的问题。
所以我发现了问题。IntelliJ IDEA非常习惯于标准的JDK Home结构,以至于它没有加载GraalSDK和其他api。
让我更接近结果的Maven jar文件与GraalVM捆绑的文件完全相同。
GraalVM是一种高性能的可嵌入多语言虚拟机,目前支持多种编程语言:Java(和JVM语言)、JavaScript(包括node.js)、Ruby、R、Python和C/C以及其他LLVM后端语言。
您可以在此处下载GraalVM的预构建发行版:https://www.graalvm.org/downloads.除此之外,它还包括一个java运行时、一个节点运行时、一个名为Graal的JavaScript引擎。js等等。
Graal SDK是polyglot API,允许GraalVM与它可以运行的所有语言实现一起工作。此polyglot API打包为jar文件:$GRAALVM_HOME/jre/lib/boot/graal sdk。jar
。
将该文件作为外部库添加到IDEA项目/模块中,将允许IDE找到如下类:org。格拉尔文。通晓多种语言。上下文和组织。格拉尔文。通晓多种语言。值
,这是与语言(包括JavaScript实现)进行互操作所必需的。
如果您的项目使用的是Maven,您可以在该文件上添加一个系统依赖项,Maven将在任何系统上找到它,其中$JAVA_HOME
设置为指向GraalVM发行版。
<dependency>
<groupId>org.graalvm</groupId>
<artifactId>graal-sdk</artifactId>
<version>1.0.0-rc</version>
<scope>system</scope>
<systemPath>${java.home}/lib/boot/graal-sdk.jar</systemPath>
</dependency>
现在,当您从GraalVM发行版运行java
命令时,必要的文件将自动添加到类路径中。因此,在IDE中运行类似于以下内容的操作不需要更多内容:
import org.graalvm.polyglot.*;
public class Main {
public static void main(String[] args) {
Context polyglot = Context.create();
Value array = polyglot.eval("js", "[1,2,42,4]");
System.out.println(array.getArrayElement(2).asInt());
}
}
现在这是因为GraalVM默认启用了Graal.jsJavaScript引擎。
如果你想在一个普通的JDK上运行它,你需要在类路径中添加更多的东西。
有一个关于如何管理Graal的问题。JDK股票上的js:如何使用graaljs?有没有地方可以买到汽车。jar文件/文件?。公认的答案更详细地说明了在哪里可以找到必要的jar文件,以使其在Java8上工作。
简而言之,您需要将以下jar文件添加到类路径以使其实际运行:
你可以在下载的GraalVM发行版中找到它们,两个版本都可以。
现在,如果没有Graal编译器,JavaScript引擎的性能将不会达到最佳。正如您所提到的,JDK 11附带了Graal编译器的快照(不是GraalVM,它是GraalVM项目的完整发行版,包括JS引擎、LLVM位码解释器、节点实现、JVM等)。您可以通过将--XX:UnlockExperimentalVMOptions--XX:UseJVMCompiler
传递到java
命令来启用Graal编译器。
现在在JDK 11上运行这一切可能不起作用,因为JDK 11与JDK 8有很大的不同,模块系统可能存在问题,或者缺少一些东西(比如jax-b),但它也可能起作用。它可以在JDK 8上运行。
问题内容: 我正在使用/ /在Mac OS X上进行一些研究计算。为了提高性能,我们从大学租了一个400节点的集群(使用Linux),以便可以并行完成任务。问题是我们不允许在集群上安装任何额外的软件包(否或任何安装工具),它们仅提供原始python本身。 然后如何在群集上运行脚本?有没有办法集成模块(我认为numpy和scipy也具有一些已编译的二进制文件),以便可以在不安装软件包的情况下进行解释
问题内容: 我怎么能包括为没有MANIFEST.in文件? 我的setup.py看起来像这样: 版本: 我就是无法加入。 还是此博客文章仍然正确? http://blog.codekills.net/2011/07/15/lies,-more-lies-and-python-packaging- documentation-on– package_data-/ 不过,在过去的一个小时中,我了解到这
问题内容: 我正在使用这个名为Viper的配置库 在我的主要我有: 然后,我有了一个以毒蛇为参数的结构: 在我的主目录中,我有一个返回该MyConfig的函数,例如: 我收到此错误: 不知道该怎么办? 问题答案: 当您导入像 包名称(在这种情况下)将作为新标识符提供给您。您可以使用此标识符来构造合格的标识符,以引用包的导出标识符(以大写字母开头的标识符)。 程序包名称本身不能使用。出现错误的行:
我正在尝试安装一个没有依赖项的python模块。 我跑: 但是这个安装依赖项,任何想法怎么能做到这一点?
我使用了,但对于当前的问题,它没有帮助。我希望能够创建特定于项目的包: 我尝试了多种方法,但如何获得
问题内容: 在C#中,我们有和有或没有命名空间(包在Java世界中)得到一个类型(类在这种情况下)的名称。 java等于什么? 显然,有比手动使用和删除软件包名称更好的方法。 问题答案: 返回源代码中给定的基础类的简单名称。如果基础类是匿名的,则返回一个空字符串。 数组的简单名称是组件类型的简单名称,后接“ []”。特别是其组件类型为匿名的数组的简单名称为“ []”。 它实际上是从名称中删除软件包