java - IntelliJ : Put some dependencies on the module path in non-modular application

标签 java intellij-idea nashorn java-platform-module-system java-15

我有一个非模块化 Java 15 应用程序,它依赖 stand-alone Nashorn (作为示例)。

我在 Intellij 中设置了一个带有 Nashorn 依赖项的 Maven 项目:

<dependency>
    <groupId>org.openjdk.nashorn</groupId>
    <artifactId>nashorn-core</artifactId>
    <version>15.0</version>
</dependency>

以及用于测试的以下Main类:

public class Main {    
    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("nashorn");
        engine.eval("print('Hello, World!');");
    }    
}

由于我的应用程序是非模块化的,所以我没有 module-info.java 文件,并且在运行主类时(通过单击绿色播放按钮)Intellij 放置我的主类以及类路径上的所有依赖项:

"C:\Program Files\Java\jdk-15\bin\java.exe" "-javaagent:J:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.1.1\lib\idea_rt.jar=53813:J:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath "H:\WS-new\non-modular nashorn\target\classes;C:\Users\Jorn\.m2\repository\org\openjdk\nashorn\nashorn-core\15.0\nashorn-core-15.0.jar;C:\Users\Jorn\.m2\repository\org\ow2\asm\asm\7.3.1\asm-7.3.1.jar;C:\Users\Jorn\.m2\repository\org\ow2\asm\asm-commons\7.3.1\asm-commons-7.3.1.jar;C:\Users\Jorn\.m2\repository\org\ow2\asm\asm-analysis\7.3.1\asm-analysis-7.3.1.jar;C:\Users\Jorn\.m2\repository\org\ow2\asm\asm-tree\7.3.1\asm-tree-7.3.1.jar;C:\Users\Jorn\.m2\repository\org\ow2\asm\asm-util\7.3.1\asm-util-7.3.1.jar" main.Main

但是,自从 Nashorn can only be used as a JPMS module ,程序最终失败并出现 NPE:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null
    at main.Main.main(Main.java:12)

如果我从命令行运行程序并将 Nashorn 及其依赖项放在模块路径而不是类路径上,它就会起作用。

java -classpath <dir with Main class> --module-path <nashorn jars> --add-modules org.openjdk.nashorn main.Main

如何告诉 IntelliJ 将 Nashorn 及其依赖项放在模块路径上,而不是放在类路径上?

最佳答案

不幸的是,目前 Intellij 中似乎没有一种方法可以将某些依赖项标记为仅模块化,以便将它们自动放在模块路径而不是类路径上。

但是,您可以通过手动添加 Nashorn jar 及其对模块路径的依赖项以及添加 org.openjdk.nashorn 来使其工作。模块,作为运行配置中的附加虚拟机选项:

enter image description here

在这里,我刚刚从 Intellij 的运行命令中复制了包含 Nashorn 及其依赖项的类路径部分。

您可能需要首先通过单击“修改选项”链接来启用表单中的“虚拟机选项”字段:

enter image description here

这使得程序按预期运行,并打印“Hello, World!”。看起来 Intellij 仍然会将这些 jar 放在类路径上,但由于模块路径优先于类路径,因此无论如何都可以。

关于java - IntelliJ : Put some dependencies on the module path in non-modular application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65267831/

相关文章:

java - Backspace 删除 IntelliJ 中光标/插入符右侧的内容?

Java代码编译成常量池中的MethodHandle

java - Nashorn 类型错误 : Cannot call undefined in <eval>

javascript - 四舍五入后无法从 Nashorn 引擎接收非小数位数字

java - 是否弃用了 DTO 模式?

java - DocumentBuilder 给出 java.net.MalformedURLException : no !/in 规范

java - Android GoogleAPIClient-NoClassDefFoundError : com/google/android/gms/internal/zzsa

java - 用于 IntelliJ IDEA 的 OpenJDK 或 Sun Java

java - 如何在 Java 和 Bluej 中使用 Jackson

intellij-idea - IntelliJ IDEA输出窗口削减输出