Beanshell不允许我将jar添加到“默认”JRE类加载器中?

时间:2011-09-23 23:19:44

标签: java classloader beanshell dynamic-class-loaders groovyclassloader

我有一个关于Beanshell的问题,我无法在任何地方找到答案。我只能通过以下两种方式之一运行Beanshell脚本:

  1. 在调用Beanshell和Beanshell之前定义Classpath JRE默认的类加载器。

  2. 在开始Beanshell然后我使用之前,根本没有定义类路径 addClassPath()importCommands()动态构建类路径  在Beanshell的类加载器中。这种方法似乎没有继承罐子  这是默认JRE类加载器的一部分。

  3. 经过多次实验,我了解到我无法使用预定义的Classpath启动脚本,然后可以使用addClassPath()添加到类路径中。我不知道这是否是设计的或者我做错了什么

    很容易看出我的问题是什么。例如,这是脚本:

    ::Test.bat (where bsh.jar exists in JRE/lib/ext directory)
    @echo off
    set JAVA_HOME=C:\JDK1.6.0_27
    :: first invoke:  this first command works
    %JAVA_HOME%\jre\bin\java.exe bsh.Interpreter Test.bsh
    :: second invoke: this command fails
    %JAVA_HOME%\jre\bin\java.exe -cp ant.jar bsh.Interpreter Test.bsh
    

    第二次调用导致此错误:

    Evaluation Error: Sourced file: Test.bsh : Command not 
    found: helloWorld() : at Line: 5 : in file: Test.bsh : helloWorld ( )
    

    Test.bat启动此Beanshell脚本:

    // Test.bsh
    System.out.println("Trying to load commands at: " + "bin" );
    addClassPath("bin");  
    importCommands("bin");
    helloWorld();
    

    而且,这是我的helloWorld.bsh脚本:

    // File: helloWorld.bsh
    helloWorld() { 
        System.out.println("Hello World!");
    }
    

1 个答案:

答案 0 :(得分:1)

您的Test.bsh有一个小错误:importCommands在类路径中查找名为“bin”的目录并从那里加载所有.bsh文件,因此您应该添加到{{1}是当前目录:

addClassPath

您在第一种情况下使用的代码,因为当前目录位于默认的系统类路径中。问题是// Test.bsh System.out.println("Trying to load commands at: " + "bin" ); addClassPath("."); // current directory importCommands("bin"); helloWorld(); 开关会覆盖默认的类路径,因此-cp不再有任何方法可以找到importCommands目录。

或者,您可以将bin添加到JVM级别的类路径中:

.