Groovy根加载器问题

Groovy根加载器问题,groovy,classpath,Groovy,Classpath,我们有一个无法在命令行上使用class path(-cp)参数的项目。我们决定使用rootLoader在运行时加载必要的类。然而,我们在运行时使用rootLoader加载类时遇到了一个问题。下面是两个简单的例子。第一个有效,但第二个无效。当然,第二个例子是我需要研究的。这两个示例都使用cmd文件运行 工作示例 println this.class.name println new File("W:/JavaApps/lib/TWS_Test.jar").exists() this.class.c

我们有一个无法在命令行上使用class path(-cp)参数的项目。我们决定使用rootLoader在运行时加载必要的类。然而,我们在运行时使用rootLoader加载类时遇到了一个问题。下面是两个简单的例子。第一个有效,但第二个无效。当然,第二个例子是我需要研究的。这两个示例都使用cmd文件运行

工作示例

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"
java.lang.Class
true
"finish HelloTWS.groovy for High Volume Letters - rc 1"
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)
在这个显式定义类和main方法的示例中,rootLoader返回null

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!"
   }
}
非工作示例的输出。

HelloTWS_LC
true
Java-printGreeting
Java-returnGreeting
Hello, TWS!
"finish HelloTWS.groovy for High Volume Letters - rc 0"
java.lang.Class
true
"finish HelloTWS.groovy for High Volume Letters - rc 1"
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)
命令窗口中有错误。

HelloTWS_LC
true
Java-printGreeting
Java-returnGreeting
Hello, TWS!
"finish HelloTWS.groovy for High Volume Letters - rc 0"
java.lang.Class
true
"finish HelloTWS.groovy for High Volume Letters - rc 1"
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)

不是
rootLoader
为null,而是
getClassLoader
方法返回null

下面的代码用于查找(打印
rootLoader
):

此示例不起作用(NPE):


也许这个问题也会有用。

为什么不能使用classpath参数?@Voy3966我的答案有用吗?问题解决了吗?@Voy3966,这就是你想要的吗?作为补充说明:第二个例子是使用静态方法
在静态方法中,此
引用类。因此,this.getClass()始终是java.lang.Class,它在大多数情况下作为加载程序为null,因为它是加载该类的系统加载程序。