【发布时间】:2018-03-06 02:28:21
【问题描述】:
我正在尝试通过我使用JShell API 创建的 JShell 实例在运行时运行一些 Java 代码。为了演示我的问题,我将分享我的简单代码。
根据我当前的设置,我有一个名为 lib 的目录,其中包含 MySQL Java 驱动程序:mysql-connector-java-5.1.35.jar。
通过命令工具启动 JShell 并将所需模块添加为:
jshell --module-path lib --add-modules mysql.connector.java
然后加载 mysql 驱动程序对我有用:
jshell> Class.forName("com.mysql.jdbc.Driver").newInstance();
$1 ==> com.mysql.jdbc.Driver@42f93a98
我用module-info.java 创建了一个类似的Java 9 模块:
module example.loadmysql {
requires java.sql;
requires mysql.connector.java;
requires jdk.jshell;
}
src/example/loadmysql/Runner.java 为:
package example.loadmysql;
import jdk.jshell.*;
import java.sql.*;
public class Runner {
public static void main(String[] args) throws Exception {
// this works because this module requires mysql.connector.java
System.out.println(Class.forName("com.mysql.jdbc.Driver").newInstance());
JShell js = JShell.create();
String code = ""
+ "try {"
+ " Class.forName(\"com.mysql.jdbc.Driver\").newInstance();"
+ "} catch (Exception e) {"
+ " System.out.println(e.toString());"
+ "}";
js.eval(code);
}
}
构建/打包后:
java -p lib -m example.loadmysql
com.mysql.jdbc.Driver@6a4f787b
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
很明显,尽管 example.loadmysql 模块需要 mysql 连接器,但创建的 JShell 实例不需要。所以找不到类。
关于如何以编程方式将模块添加到 JShell 实例,使其像直接 JShell 编码示例一样工作的任何想法?
更新 - 我已经弄清楚如何设置模块路径:
String modulePath = System.getProperty("jdk.module.path");
js.eval("System.setProperty(\"jdk.module.path\", \""
+ modulePath + "\");");
但这还不够。我仍然以某种方式添加了所需的模块。
【问题讨论】:
-
您是否尝试将
addToClassPath放在eval之前? -
我可以添加到类路径中,这似乎可行。尽管它不符合 Java 9 和使用模块的精神!如果类路径方法仍然有效,我不确定mysql连接器是否最终转换为模块。如果没有其他解决方案,我可能会这样做!非常感谢。
标签: java java-9 jshell module-path