intellij:在非模块化应用程序中对模块路径设置一些依赖关系

pdtvr36n  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(536)

我有一个非模块化的java15应用程序,它依赖于独立的nashorn(作为一个例子)。
我在intellij中建立了一个maven项目,其中包含nashorn依赖项:

<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只能用作jpms模块,因此程序最终会以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及其依赖项放在模块路径上,而不是类路径上?

1sbrub3j

1sbrub3j1#

您可以通过手动将nashornjar及其依赖项添加到模块路径,以及添加 org.openjdk.nashorn 模块,作为运行配置中的其他vm选项:

这里我刚刚从intellij的run命令复制了类路径的一部分,该命令包含nashorn及其依赖项。
您可能需要首先通过单击“修改选项”链接来启用窗体中的“vm选项”字段:

这使程序按预期运行,打印“hello,world!”。看起来intellij仍然会将这些jar放在类路径上,但是由于模块路径优先于类路径,所以这可以以任何方式工作。
不幸的是,目前在intellij中似乎没有一种方法可以将某些依赖项标记为仅模块化的依赖项,使它们自动放在模块路径而不是类路径上。

相关问题