Grooveek
Grooveek

Reputation: 10094

Groovy script classpath issue with SystemClassLoader

I'm writing a Groovy script which uses third party java code that I can't change. This code uses (badly, I think) ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file") and expect to read a file.

Everything goes well from Java when using java -cp "/path/to/jar/file" ...

However, the third-party code is now to be integrated with a bunch of Groovy code we've already written, so we wanted to run it from groovy.

So we wrote a Groovy script, let it call test.groovy, and ran it as groovy -cp "/path/to/jar/file" test.groovy.

The problem is that code can't access the file resource, as it seems Groovy doesn't load its jars in the System ClassLoader directly.

For proof, with Thread.currentThread().getContextClassLoader().getResourceAsStream("/hard/file/path/in/jar/file") within the Groovy Script, I can read the file, but with ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file"), I can't.

So, does anyone know how to load the class in System ClassLoader from a Groovy Script without beginning to try some dirty hacks (like metaclassing getSystemClassloader to return the context classloader)?

Upvotes: 2

Views: 1679

Answers (2)

tim_yates
tim_yates

Reputation: 171164

You could try adding the jar to the system classloader as well when your script runs, like so:

ClassLoader.systemClassLoader.addURL new File( '/path/to/jar/file' ).toURI().toURL()

PS: I assume you mean ClassLoader.getSystemClassLoader() in your question, rather than System.getSystemClassLoader()

Upvotes: 1

Andrey Adamovich
Andrey Adamovich

Reputation: 20683

You can try to put your jar into %GROOVY_HOME%\lib folder or make a wrapper around your groovy command and modify %CLASSPATH% variable before you start your Groovy process.

Upvotes: 0

Related Questions