[英]Groovy Class loader wont load Java class
I have this groovy script written in .groovy file: 我用.groovy文件编写了这个groovy脚本:
import groovy.sql.Sql;
def doit() {
Class.forName('oracle.jdbc.driver.OracleDriver'); // If i skip this line it throws SQLException no driver registered for URL
def db = [url:'jdbc:oracle:thin:/@localhost:1555:AVDB', user:'sys as sysdba', password:'secret',driver:'oracle.jdbc.driver.OracleDriver'];
def sql = Sql.newInstance(db.url, db.user, db.password, db.driver) ;
sql.execute 'CREATE USER RandomUser identified by Secret123';
}
I am calling above Groovy from Java in following way: 我通过以下方式从Java调用Groovy:
ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(groovySource); // groovySource is a File object pointing to .groovy file
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
Object[] args = {};
groovyObject.invokeMethod("doit", args);
Problem : 问题 :
Class oracle.jdbc.driver.OracleDriver is present in Java's classpath but groovy cant find it at line: Class.forName('oracle.jdbc.driver.OracleDriver');
Java的类路径中存在类oracle.jdbc.driver.OracleDriver ,但在以下行上却找不到它:
Class.forName('oracle.jdbc.driver.OracleDriver');
Throws ClassNotFoundException. 引发ClassNotFoundException。
try magic lines before groovy method: 在常规方法之前尝试魔术线:
@groovy.transform.CompileStatic
def doit(){....}
you should simply pass java CL down into your groovy method: 您只需将Java CL向下传递到groovy方法中:
def doit( ClassLoader cl ) {
cl.loadClass 'oracle.jdbc.driver.OracleDriver'
....
}
then call 然后打电话
ClassLoader parent = getClass().getClassLoader();
Object[] args = { parent };
groovyObject.invokeMethod("doit", args);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.