Dyl*_*son 5 java java-9 jshell module-path
我试图通过我使用JShell API创建的JShell实例在运行时运行一些Java代码.为了演示我的问题,我将分享我的简单代码.
在我目前的设置中,我有一个名为lib的目录,它有MySQL Java驱动程序:mysql-connector-java-5.1.35.jar.
通过命令工具启动JShell并添加所需的模块:
jshell --module-path lib --add-modules mysql.connector.java
Run Code Online (Sandbox Code Playgroud)
然后加载mysql驱动程序适合我:
jshell> Class.forName("com.mysql.jdbc.Driver").newInstance();
$1 ==> com.mysql.jdbc.Driver@42f93a98
Run Code Online (Sandbox Code Playgroud)
我用module-info.javaas 创建了一个类似的Java 9模块:
module example.loadmysql {
requires java.sql;
requires mysql.connector.java;
requires jdk.jshell;
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
建筑/包装后:
java -p lib -m example.loadmysql
com.mysql.jdbc.Driver@6a4f787b
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
Run Code Online (Sandbox Code Playgroud)
很明显,即使example.loadmysql模块需要mysql连接器,创建的JShell实例也不需要.所以找不到班级.
关于如何以编程方式将模块添加到JShell实例的任何想法,所以它的工作方式类似于直接的JShell编码示例?
更新 - 我已经弄清楚如何设置模块路径:
String modulePath = System.getProperty("jdk.module.path");
js.eval("System.setProperty(\"jdk.module.path\", \""
+ modulePath + "\");");
Run Code Online (Sandbox Code Playgroud)
但这还不够.我还是以某种方式添加了所需的模块.
您可能可以在代码中使用addToClassPathbefore ,如下所示:eval
JShell js = JShell.create();
js.addToClasspath("path/to/add/to/the/classpath");
String code = ""
+ "try {"
+ " Class.forName(\"com.mysql.jdbc.Driver\").newInstance();"
+ "} catch (Exception e) {"
+ " System.out.println(e.toString());"
+ "}";
js.eval(code);
Run Code Online (Sandbox Code Playgroud)
指定的路径将添加到中使用的类路径
eval()的末尾。请注意,无法从放置代码的包访问未命名的包。eval(String)
从文档看来,JShell 返回的状态是eval基于类路径执行代码的,因此为了向其添加任何进一步的依赖项,您需要使用相同的方法将其添加到类路径中。
在你的情况下,我在这里猜测,当你这样做时,理想情况下mysql-connector-java-5.1.35.jar将被视为类路径上存在的自动模块com.mysql.jdbc.Driver,因此该类将是可访问的。
更新:- 进一步探索我认为实现此目的的更好方法可能是尝试使用Jshell.Builder及其选项compilerOptions来创建具有默认编译选项的实例,有点像(未测试)-
JShell js = JShell.builder()
.compilerOptions("--module-path lib","--add-modules mysql.connector.java").build();
String code = ""
+ "try {"
+ " Class.forName(\"com.mysql.jdbc.Driver\").newInstance();"
+ "} catch (Exception e) {"
+ " System.out.println(e.toString());"
+ "}";
js.eval(code);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |