From: Robert D. <rdi...@tr...> - 2003-10-19 22:22:42
|
So, I have jar (let's call it scripting.jar) whose manifest includes jython.jar and one of my jars, let's say it is called foo.jar. The manifest of foo.jar includes bar.jar. Now, I load classes from this jar using an URLClassLoader. Mainly, it is a wrapper around the PythonInterpreter. So, I do something like this: URL[] urls =3D new URL[]{ new URL( scriptingJarURL ) }; URLClassLoader loader =3D new URLClassLoader( urls, getClass().getClassLoader() ); Class class =3D loader.loadClass( "my.com.InterpreterWrapperImp" ); Interpreter interp =3D (Interpreter)class.newInstance(); Now I can "interp" and if my scripts change, create a new instance of the class with a new class loader. Everything is great EXCEPT that in the constructor of my wrapper, when creating the PythonInterpreter instance I am wrapper, I have to connect to the scripting.jar file, read it's manifest, connect to those jars, read their manifests and called: CachedJarsPackageManager#addJarToPackages ..for each one. If I don't, I get import errors in my scripts. Any thoughts? Is this normal? Basically, I do this: CachedJarsPackageManager pm =3D (CachedJarsPackageManager) Py.getSystemState().packageManager; // get the urls for this class loader URL[] urls =3D ((URLClassLoader)getClass().getClassLoader()).getURLs(); // collect all urls from the manifests Set urlSet =3D new HashSet(); for ( int at =3D 0, count =3D urls.length; at < count; ++at ) { final URL url =3D urls[ at ]; getAllUrls( url, urlSet ); // recursively load all urls from jar manifests } // add it jar to the system state packages for ( Iterator i =3D urlSet.iterator(); i.hasNext(); ) { URL url =3D (URL)i.next(); pm.addJarToPackages( url, false ); } Now, everything works great. My question is, why do I have to do this?=20 |
From: Oti <oh...@ya...> - 2003-10-20 08:05:01
|
[ Robert DiFalco ] > So, I have jar (let's call it scripting.jar) whose manifest includes > jython.jar and one of my jars, let's say it is called foo.jar. The > manifest of foo.jar includes bar.jar. > > Now, I load classes from this jar using an URLClassLoader. Mainly, it > is > a wrapper around the PythonInterpreter. So, I do something like this: > > URL[] urls = new URL[]{ new URL( scriptingJarURL ) }; > URLClassLoader loader = new URLClassLoader( urls, > getClass().getClassLoader() ); > > Class class = loader.loadClass( "my.com.InterpreterWrapperImp" ); > > Interpreter interp = (Interpreter)class.newInstance(); > > > Now I can "interp" and if my scripts change, create a new instance of > the class with a new class loader. Everything is great EXCEPT that in > the constructor of my wrapper, when creating the PythonInterpreter > instance I am wrapper, I have to connect to the scripting.jar file, > read > it's manifest, connect to those jars, read their manifests and > called: > > CachedJarsPackageManager#addJarToPackages > > ..for each one. If I don't, I get import errors in my scripts. Any > thoughts? Is this normal? > > Basically, I do this: > > CachedJarsPackageManager pm = (CachedJarsPackageManager) > Py.getSystemState().packageManager; > > // get the urls for this class loader > URL[] urls = > ((URLClassLoader)getClass().getClassLoader()).getURLs(); > > // collect all urls from the manifests > Set urlSet = new HashSet(); > for ( int at = 0, count = urls.length; at < count; ++at ) > { > final URL url = urls[ at ]; > getAllUrls( url, urlSet ); // recursively load all urls > from > jar manifests > } > > // add it jar to the system state packages > for ( Iterator i = urlSet.iterator(); i.hasNext(); ) > { > URL url = (URL)i.next(); > pm.addJarToPackages( url, false ); > } > > Now, everything works great. My question is, why do I have to do > this? Hello Robert, the PackageManager currently cannot handle jars indicated in a manifest of another jar. Good workaround of yours, IMHO ! Best wishes, Oti. |