URLClassLoader bringt Fehler

KoMtuR

Erfahrenes Mitglied
Hallo,

ich hab nun schon stundenlang versucht raus zu bekommen, wieso ich keine Klasse dynamisch aus einer externen JAR-Datei laden kann, und hoffe jemand kann mir helfen. Jedes mal kommt eine ClassNotFoundException, obwohl der Pfad zur JAR-Datei richtig ist.

Fehlermeldung:
Code:
23.10.2007 22:00:13 urlclassloadertest.Main main INFO: ClassName: plugin.PluginTest
23.10.2007 22:00:13 urlclassloadertest.Main main INFO: URL: /C:/Java/test/plugin.PluginTest.jar
Exception in thread "main" java.lang.ClassNotFoundException: plugin.PluginTest
        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 urlclassloadertest.Main.main(Main.java:49)

Main:
Java:
package urlclassloadertest;

import de.server.plugins.IPlugin;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.logging.Logger;

/**
 *
 * @author KoMtuR
 */
public class Main {

    protected static Logger logger = Logger.getLogger(Main.class.getName());
    
    public static void main(String[] args) throws Exception {
	File pluginFolder = new File("plugins/");
	if(!pluginFolder.isDirectory())
	    throw new RuntimeException("Pfad plugins/ existiert nicht.");
	
	String[] fileList = pluginFolder.list();
	for(String file : fileList) {
	    File curFile = new File(file);
	    
	    if(curFile.getName().endsWith(".jar")) {
		String name = curFile.getName().substring(0, curFile.getName().lastIndexOf("."));
		
		logger.info("ClassName: "+name);
		logger.info("URL: "+ curFile.toURL().getPath());

		URLClassLoader cl = new URLClassLoader( new URL[] {curFile.toURI().toURL()});
		
		IPlugin plugin = (IPlugin)cl.loadClass(name).newInstance();
		
		plugin.testFunction();
	    }
	}
    }

}

So selbstverständlich hab ich in dem Ordner, wo die JAR mit dieser Main-Fkt. liegt auch einen Ordner "plugins", in dem sich eine weitere JAR-Datei namens "plugin.PluginTest.jar" befindet.
Diese ist auch richtig aufgebaut und die Klasse liegt auch im richtigen Package in dieser Datei. Aber irgendwie will er nicht die Datei laden.

Hier mal meine Daten als Zip (so liegt es bei mir auf der Festplatte und bringt immer den Fehler).

Danke schonmal im vorraus, KoMtuR
 

Anhänge

Hallo,

schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

import de.tutorials.plugins.IPlugin;

/**
 * @author Thomas.Darimont
 */
public class Main {

  /**
   * @param args
   */
  public static void main(String[] args) throws Exception {
    File file = new File("plugins");
    
    List<IPlugin> plugins = new ArrayList<IPlugin>();
    
    for (File pluginJar : file.listFiles()) {
      System.out.println(pluginJar);
      URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { pluginJar.toURI().toURL() });

      //use fix classname here or get plugin "Activator" class from jar-manifest
      IPlugin plugin = (IPlugin) urlClassLoader.loadClass("de.tutorials.plugins.Plugin").newInstance();
      plugins.add(plugin);
    }
    
    System.out.println("Starting plugins:");
    for(IPlugin plugin : plugins){
      plugin.start();
    }
    
    
    System.out.println("Stopping plugins:");
    for(IPlugin plugin : plugins){
      plugin.stop();
    }
  }
}

Ein Plugin:
Java:
/**
 * 
 */
package de.tutorials.plugins;

import de.tutorials.plugins.IPlugin;

/**
 * @author Thomas.Darimont
 *
 */
public class Plugin implements IPlugin{

  public void start() {
    System.out.println("Start " + this.getClass().getProtectionDomain().getCodeSource().getLocation());
  }

  public void stop() {
    System.out.println("Stop " + this.getClass().getProtectionDomain().getCodeSource().getLocation());
  }

}

Ausgabe:
Code:
plugins\plugin1.jar
plugins\plugin2.jar
Starting plugins:
Start file:/C:/Dokumente%20und%20Einstellungen/Thomas.Darimont/workspace-europa/de.tutorials.plugin.example/plugins/plugin1.jar
Start file:/C:/Dokumente%20und%20Einstellungen/Thomas.Darimont/workspace-europa/de.tutorials.plugin.example/plugins/plugin2.jar
Stopping plugins:
Stop file:/C:/Dokumente%20und%20Einstellungen/Thomas.Darimont/workspace-europa/de.tutorials.plugin.example/plugins/plugin1.jar
Stop file:/C:/Dokumente%20und%20Einstellungen/Thomas.Darimont/workspace-europa/de.tutorials.plugin.example/plugins/plugin2.jar

Gruß Tom
 

Anhänge

Komisch, dass es nun geht, wenn ich die Sache so umschreib, das nicht über die Liste der String iteriert wird, sondern gleich über die Dateien. Danke dir für den Code :)
 
Zurück