I'll restate the problem. At startup, and goes and looks at the it's own global lib folder, and adds any jars it finds to a brand new classloader.
Then, those jars have to be able to find *all* their dependants, using that same new classloader. So, the <scriptdef> classes have an internal dep on the BSFManager and BSFExtension; those libraries have to be available to this new classloader(or any of it's parents). The actual language implementations, forunately, do not; they can loaded from a build.xml controlled path. If someone just types 'ant', which then uses the global classloader, there is no way to add any additional libraries once the loader heirarchy has been initialized. This is really a problem with the way ant is designed, unfortunately. Classloaders are always notoriously hard to get right.