V
veovis
I use an extended URLClassLoader to load classes from directories not
included in classpath. Everything works well the following way:
package A: Included in claspath. To it belong: a starting class Start,
the classloader Loader, and some other classes.
package B: Not included in classpath. To it belong (for this
explanation purpose): classes Master, Slave, AbstractFoo, and Foo
which extends AbstractFoo.
packageA.Start instantiates packageA.Loader, loader instantiates
packageB.Master within a thread, master creates a new Slave wthich in
turn creates new Foo() as well other objects from inside other
packages (package A and others..) Everything's fine.
BUT: let's assume in package A exists class LocalFoo which extends
whichever packageB.Foo or packageB.AbstractFoo (packageB is not
included in classpath, remember?).
When slave instantiates packageA.LocalFoo, following exception is
generated:
java.lang.NoClassDefFoundError: packageB/AbstractFoo
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at PackageB.Slave.doSomething(Slave.java:31)
at PackageB.Master.doSomething(Master.java:19)
at PackageB.Master.run(Master.java:14)
Why? What am missing that is very obvious or silly?
(NOTE: hope explanation above is enough; but I will paste a bit of
code on demand.)
Thanks !
included in classpath. Everything works well the following way:
package A: Included in claspath. To it belong: a starting class Start,
the classloader Loader, and some other classes.
package B: Not included in classpath. To it belong (for this
explanation purpose): classes Master, Slave, AbstractFoo, and Foo
which extends AbstractFoo.
packageA.Start instantiates packageA.Loader, loader instantiates
packageB.Master within a thread, master creates a new Slave wthich in
turn creates new Foo() as well other objects from inside other
packages (package A and others..) Everything's fine.
BUT: let's assume in package A exists class LocalFoo which extends
whichever packageB.Foo or packageB.AbstractFoo (packageB is not
included in classpath, remember?).
When slave instantiates packageA.LocalFoo, following exception is
generated:
java.lang.NoClassDefFoundError: packageB/AbstractFoo
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at PackageB.Slave.doSomething(Slave.java:31)
at PackageB.Master.doSomething(Master.java:19)
at PackageB.Master.run(Master.java:14)
Why? What am missing that is very obvious or silly?
(NOTE: hope explanation above is enough; but I will paste a bit of
code on demand.)
Thanks !