2015-02-24 43 views
2

我们有一个项目,我们无法在命令行中使用类路径(-cp)参数。我们决定在运行时使用rootLoader加载必要的类。但是,我们遇到了使用rootLoader在运行时加载类的问题。以下是两个简单的例子。第一个工作,但第二个不起作用。当然,第二个例子是我需要工作的例子。这两个示例都使用cmd文件运行。Groovy rootLoader问题

工作示例

println this.class.name 
println new File("W:/JavaApps/lib/TWS_Test.jar").exists() 
this.class.classLoader.rootLoader.addURL(new URL("file:///W:/JavaApps/lib/TWS_Test.jar")) 
def simpleJar = Class.forName("Simple_Jar").newInstance(); 
simpleJar.printGreeting() 
println simpleJar.returnGreeting() 
println "Hello, TWS!" 

这是从上面的输出。

HelloTWS_LC 
true 
Java-printGreeting 
Java-returnGreeting 
Hello, TWS! 
"finish HelloTWS.groovy for High Volume Letters - rc 0" 

在这个例子中,其明确定义了类和主要方法,rootLoader返回从非工作示例空

class HelloTWS_LC { 
    static void main(def args) { 
     println this.class.name 
     println new File("W:/JavaApps/lib/TWS_Test.jar").exists() 
     this.class.classLoader.rootLoader.addURL(new URL("file:///W:/JavaApps/lib/TWS_Test.jar")) 
     def simpleJar = Class.forName("Simple_Jar").newInstance(); 
     simpleJar.printGreeting() 
     println simpleJar.returnGreeting() 
     println "Hello, TWS!" 
    } 
} 

输出。

java.lang.Class 
true 
"finish HelloTWS.groovy for High Volume Letters - rc 1" 

有在cmd窗口中的错误。

W:\JavaApps\DMCGroovyScripts>groovy W:\JavaApps\DMCGroovyScripts\HelloTWS_LC.groovy 1>W:\JavaApps\DMCGroovyScripts\HelloTWS.txt 
Caught: java.lang.NullPointerException: Cannot get property 'rootLoader' on null object java.lang.NullPointerException: Cannot get property 'rootLoader' on null object 
     at HelloTWS_LC.main(HelloTWS_LC.groovy:5) 
+0

为什么你不能使用classpath参数? – 2015-02-24 07:02:15

+0

@ Voy3966是我的答案有用吗?问题解决了吗? – Opal 2015-03-08 19:20:37

回答

1

这不是rootLoadergetClassLoader方法返回

以下作品的代码中找到(打印rootLoader):

public class Lol { 
    static void main(args) { 
     println Lol.class.classLoader.rootLoader 
    } 
} 

这个例子不工作(NPE):

public class Lol { 
    static void main(args) { 
     println getClass().classLoader.rootLoader 
    } 
} 

也许this问题将是也很有用。

+0

@ Voy3966,你在找什么? – Opal 2015-02-25 09:54:10

+2

作为附加说明:第二个示例是使用静态方法。这个静态方法中的this是指这个类。因此this.getClass()始终是java.lang.Class,大部分时间在loader中都是null,因为这是加载该类的系统加载器。 – blackdrag 2015-02-25 14:02:55

+0

@blackdrag,太棒了!这是缺点。 – Opal 2015-02-25 14:05:09