我有一个非模块化 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
来使其工作。模块,作为运行配置中的附加虚拟机选项:
在这里,我刚刚从 Intellij 的运行命令中复制了包含 Nashorn 及其依赖项的类路径部分。
您可能需要首先通过单击“修改选项”链接来启用表单中的“虚拟机选项”字段:
这使得程序按预期运行,并打印“Hello, World!”。看起来 Intellij 仍然会将这些 jar 放在类路径上,但由于模块路径优先于类路径,因此无论如何都可以。
关于java - IntelliJ : Put some dependencies on the module path in non-modular application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65267831/