在Java 15应用程序中运行JavaScript和Python代码

dfddblmv  于 11个月前  发布在  Java
关注(0)|答案(2)|浏览(175)

我正在GraalVM上运行Java 15应用程序中的JavaScript代码。这是一个在Tomee上运行的Web应用程序。它运行得很好,现在我还需要用GraalVM运行Python代码。
我需要在pom.xml中包含哪些库?我在这里看到几个:
https://mvnrepository.com/artifact/org.graalvm.python
这就是我今天在pom.xml中的内容:

<dependency>
        <groupId>org.graalvm.js</groupId>
        <artifactId>js</artifactId>
        <version>22.1.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.graalvm.js</groupId>
        <artifactId>js-scriptengine</artifactId>
        <version>22.1.0.1</version>
    </dependency>

字符串
我应该从graal.js更改为graal.sdk吗?我希望能够使用相同的引擎运行JavaScript或Python。

x6h2sr28

x6h2sr281#

编辑:
对于JDK < 21,GraalPy(GraalVM上的Python)没有任何Maven工件。此外,对于JDK < 21,GraalPy的先前版本不会被维护。最重要的是JDK 15已经过时了,所以“I hope this is not an important system”;-)
但是,您可以使用较旧的GraalVM版本,理想情况下是仍然受支持的LST,例如,截至目前为21.3。您可以选择基于JDK 17或JDK 11的GraalVM 21.3。可能还有其他一些基于JDK 15的不受支持的GraalVM版本。然后为给定的GraalVM下载GraalPy(https://github.com/oracle/graalpython/releases)并使用$GRAALVM_HOME/bin/gu install -F the-graalpython-release.jar安装它。然后你使用GraalVM安装作为你的JDK(即$JAVA_HOME)。GraalPy将“只是”开箱即用。不需要任何依赖关系。你可以为JavaScript做同样的事情。
如果您可以将Java升级到21或更高版本:
你想要在Java中嵌入Python的是:

这些是mata-pom,包含了org.graalvm.python组和其他地方的所有必要依赖项。因此,您的pom.xml应该如下所示:

<dependencies>
        <dependency>
            <groupId>org.graalvm.polyglot</groupId>
            <artifactId>polyglot</artifactId>
            <version>23.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.graalvm.polyglot</groupId>
            <artifactId>python-community</artifactId>
            <version>23.1.1</version>
            <type>pom</type>
        </dependency>
    </dependencies>

字符串
然后你可以做一些事情,比如:

try (var ctx = org.graalvm.polyglot.Context.create("python")) {
    ctx.eval("python", "print('Hello world')"); 
}


看起来你正在通过脚本引擎API使用JavaScript。Python不支持这一点。你可以找到一些脚本引擎实现的例子,但推荐的方法是使用Context API。它与语言无关,所以你可以将它用于Python和JavaScript。

m4pnthwp

m4pnthwp2#

检查oracle/graal问题6852是否有帮助:
我们正在寻找来自Java开发人员的反馈,他们使用org.graalvm.polyglot API在Java中嵌入语言,如JavaScript,Python,Ruby,Espresso,WebAssembly,LLVM等。(9月发布)将对Java应用程序的嵌入方式进行一些重大更改。(例如,gu install python)。在23.1之后,这将不再可能。您需要从Maven Repository下载工件并使用模块路径运行它们。
为了阐明这是如何工作的,这里有一个包含Python的新Maven配置的简短示例。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yourcorp.yourapp</groupId>
    <artifactId>yourartefact</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency> <!-- We also move from graal-sdk => polyglot --> 
            <groupId>org.graalvm.polyglot</groupId>
            <artifactId>polyglot</artifactId>
            <version>23.1.0</version>
        </dependency>
        <dependency> <!-- you can also depend on org.graalvm.polyglot:languages for all languages --> 
            <groupId>org.graalvm.python</groupId>
            <artifactId>python</artifactId>
            <version>23.1.0</version>
            <type>pom</type>
        </dependency>
        <dependency> <!-- all tools we include in Oracle GraalVM --> 
            <groupId>org.graalvm.polyglot</groupId>
            <artifactId>tools</artifactId>
            <version>23.1.0</version>
            <type>pom</type>
        </dependency>
    </dependencies>
</project>

字符串

**注意:**如果你想要所有这些组件的开源版本,你需要将工件名称更改为python-community和tools-community。
**注意:**我们还将org.graalvm.sdk模块(graal-sdk.jar)分解为几个部分:nativeimage、polyglot、word和collections。我们仍将在下一版本中部署此模块的弃用版本,以免破坏您的代码。

这将说明您可以在pom.xml中测试的依赖关系类型。
这也将指出GraalVM updater gu,一个用于安装和管理可选GraalVM语言运行时和实用程序的命令行工具,它可以在您的情况下帮助maven依赖项不可用。
是的,我试过这个,但它没有工作,似乎它只支持Java 21?
此外,我不确定如何将GraalVM更新程序应用于Tomee中的Myjar文件。
也许可以检查一下“tomitribe/graalvm-microprofile“中描述的过程是否可以给予一些想法,因为它确实提到(4年前,在Java 21之前)使用gu install python在GraalVM中安装Python语言。
但是:我不确定如何将GraalVM更新程序应用于Tomee server环境中的JAR文件。通常,GraalVM更新程序用于在GraalVM安装中安装或更新语言和工具。但是,将其集成到JAR部署中需要在JAR文件中打包正确版本的库和脚本。
作为替代方法,您可以考虑:

  • 如果更新Java不是一个选项,那么可以在代码中显式地使用GraalVM Polyglot API来管理Python脚本的执行。这可能会提供更多的控制和与现有Java版本的兼容性。
  • 在一个单独的服务中运行Python代码,可能在一个容器中,并从Java应用程序与它通信。这种方法可以绕过直接集成到GraalVM的限制,并提供更大的灵活性。

相关问题