I am using the following code to create an instance of OdbcIniTarget class which implements the Target interface. The OdbcIniTarget class already exists in the application but is located in a different package and now should be loaded from the target directory which is not in the class path.
...
// directory below is resolved to /D:/Workspace/<myproject>/targets/
private File targetsLocation = new File("targets");
...
private void loadTargets() {
URL url = null;
try {
url = targetsLocation.toURI().toURL();
} catch (MalformedURLException e) {
}
URL[] urls = new URL[]{ url };
URLClassLoader classLoader = new URLClassLoader(urls);
try {
Target target =
(Target)classLoader.
loadClass("ch.blah.targets.nope.OdbcIniTarget").
newInstance(); // <--- this fails hard
} catch (...) {
...
}
try {
classLoader.close();
} catch (IOException e) {
}
}
I am getting the following exception.
java.lang.ClassNotFoundException: ch.blah.targets.nope.OdbcIniTarget
at java.net.URLClassLoader$1.run(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 java.lang.ClassLoader.loadClass(Unknown Source)
at ch.blah.targets.TargetFactory.loadTargets(TargetFactory.java:74)
at ch.blah.targets.TargetFactory.<init>(TargetFactory.java:41)
at ch.blah.SomeOfMyClasses.<init>(SomeOfMyClasses.java:34)
at ch.blah.TheMainClass.main(TheMainClass.java:38)
Does someone have an idea why the class is not found?
The class which is loaded looks as follows.
package ch.blah.targets.nope;
import org.apache.log4j.Logger;
import ch.blah.utils.Utils;
public class OdbcIniTarget extends Target {
private static final Logger log = Logger.getLogger(OdbcIniTarget.class);
@Override
public boolean someMethod1() {
return false;
}
@Override
public boolean someMethod2() {
return false;
}
@Override
public boolean someMethod3() {
return false;
}
@Override
public void someMethod4() {
log.debug("Blah.");
Utils.getInstance().marshalClass(SomeClass.class);
log.debug("Finished.");
}
}
The directory structure for targets directory is as follows.
D:\Workspace\<myproject>\targets>dir
Volume in drive D is DATA
Volume Serial Number is 021C-EC9B
Directory of D:\Workspace\<myproject>\targets
10.07.2014 21:20 <DIR> .
10.07.2014 21:20 <DIR> ..
10.07.2014 21:31 1'278 OdbcIniTarget.java
10.07.2014 20:23 3'761 OdbcIniTargetConfiguration.java
2 File(s) 5'039 bytes
2 Dir(s) 7'328'571'392 bytes free
Problem:
It is failing to load because it doesn't contain classes at that URL, it has java source
Solution:
Compile those java classes to .class file and then pass the url to the directory which should look like
ch\blah\targets\nope\OdbcIniTarget.class
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With