我有一个非模块化的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及其依赖项放在模块路径上,而不是类路径上?
1条答案
按热度按时间1sbrub3j1#
您可以通过手动将nashornjar及其依赖项添加到模块路径,以及添加
org.openjdk.nashorn
模块,作为运行配置中的其他vm选项:这里我刚刚从intellij的run命令复制了类路径的一部分,该命令包含nashorn及其依赖项。
您可能需要首先通过单击“修改选项”链接来启用窗体中的“vm选项”字段:
这使程序按预期运行,打印“hello,world!”。看起来intellij仍然会将这些jar放在类路径上,但是由于模块路径优先于类路径,所以这可以以任何方式工作。
不幸的是,目前在intellij中似乎没有一种方法可以将某些依赖项标记为仅模块化的依赖项,使它们自动放在模块路径而不是类路径上。