3

我有一个关于Beanshell的问题,我在任何地方都找不到答案。我只能以 2 种方式中的 1 种方式运行 Beanshell 脚本:

  1. 其中 Classpath 在调用 Beanshell 之前定义,而 Beanshell 使用 JRE 默认类加载器。

  2. 在启动 Beanshell 之前根本没有定义类路径,然后我使用 addClassPath()andimportCommands()在 Beanshell 的类加载器中动态构建类路径。此方法似乎没有继承作为默认 JRE 类加载器一部分的 jar。

经过大量实验,我了解到我无法使用预定义的 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!");
}
4

1 回答 1

1

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

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

您的代码在第一种情况下有效,因为当前目录位于默认系统类路径中。问题是-cp开关覆盖了默认的类路径,所以importCommands再也没有办法找到bin目录。

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

%JAVA_HOME%\jre\bin\java.exe -cp .;ant.jar bsh.Interpreter Test.bsh
于 2012-02-09T14:36:09.193 回答