简体   繁体   English

Groovy类加载器不会加载Java类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM