FBIagent
Erfahrenes Mitglied
Halli hallo,
ich habe ein Problem. Ich möchte in einem Projekt Erweiterungen implementieren die sich selbst über eine
statische Methode registrieren. Als statische Methode setze ich
vorraus. Zum laden der .class Datei verwende ich den URLClassLoader.
Mein Problem besteht darin, dass ich nicht weis wie ich an den genauen namen komme. Ich ging davon aus,
dass ich das Package aus der zu ladenen .class Datei + Klassenname nehmen muss. Allerdings scheint das nicht
der Fall zu sein. Leider konnte ich das Problem bis jetzt mit Hilfe des Internet nicht lösen.
Die Verzeichnissstruktur sieht folgendermaßen aus(namen mit * = verzeichnisse):
Server.CUR_DIR beinhaltet den absoluten Pfad des hauptverzeichnisses der Anwendung
Game.CUR_DIR beinhaltet den absoluten Pfad des "game" verzeichnisses
Könnt ihr mir da weiterhelfen?
Besten Dank im vorraus,
FBIagent
ich habe ein Problem. Ich möchte in einem Projekt Erweiterungen implementieren die sich selbst über eine
statische Methode registrieren. Als statische Methode setze ich
Java:
public static void initialize();
Mein Problem besteht darin, dass ich nicht weis wie ich an den genauen namen komme. Ich ging davon aus,
dass ich das Package aus der zu ladenen .class Datei + Klassenname nehmen muss. Allerdings scheint das nicht
der Fall zu sein. Leider konnte ich das Problem bis jetzt mit Hilfe des Internet nicht lösen.
Die Verzeichnissstruktur sieht folgendermaßen aus(namen mit * = verzeichnisse):
Code:
*game
*extensions
*tests
TestBuilderCmd.class
TestBuilderCmd.java
*lib
L2DestinyCore.jar
Server.bat - "C:\Program Files (x86)\Java\jdk1.6.0_21\jre\bin\java.exe" -cp "lib/*" de.l2destiny.Server
Server.CUR_DIR beinhaltet den absoluten Pfad des hauptverzeichnisses der Anwendung
Game.CUR_DIR beinhaltet den absoluten Pfad des "game" verzeichnisses
Java:
package de.l2destiny.game;
import java.io.File;
import java.io.FileFilter;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import de.l2destiny.Server;
import de.l2destiny.game.Game;
import de.l2destiny.util.StringUtils;
final class Extensions
{
private static final String EXTENSIONS_PATH = StringUtils.makePath(Game.CUR_DIR, "extensions");
public static void load()
throws Exception
{
compile();
initialize();
}
private static void compile()
throws Exception
{
Queue<File> dirs = new LinkedList<File>();
dirs.add(new File(EXTENSIONS_PATH));
FileFilter filter = new FileFilter()
{
@Override
public boolean accept(File pathname)
{
return pathname.isDirectory() || pathname.getName().endsWith(".java");
}
};
List<File> files = new ArrayList<File>();
while (!dirs.isEmpty())
{
File[] dirEntries = dirs.poll().listFiles(filter);
for (File dirEntry : dirEntries)
{
if (dirEntry.isDirectory())
{
dirs.add(dirEntry);
continue;
}
files.add(dirEntry);
}
}
List<String> options = new ArrayList<String>();
options.add("-classpath");
options.add(System.getProperty("java.class.path"));
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(files);
compiler.getTask(null, fileManager, null, options, null, compilationUnits).call();
fileManager.close();
}
public static void initialize()
throws Exception
{
Queue<File> dirs = new LinkedList<File>();
dirs.add(new File(EXTENSIONS_PATH));
FileFilter filter = new FileFilter()
{
@Override
public boolean accept(File pathname)
{
return pathname.isDirectory() || pathname.getName().endsWith(".class");
}
};
List<File> files = new ArrayList<File>();
while (!dirs.isEmpty())
{
File[] dirEntries = dirs.poll().listFiles(filter);
for (File dirEntry : dirEntries)
{
if (dirEntry.isDirectory())
{
dirs.add(dirEntry);
continue;
}
files.add(dirEntry);
}
}
for (File file : files)
{
ClassLoader loader = new URLClassLoader(new URL[]{file.toURI().toURL()}, Thread.currentThread().getContextClassLoader());
String filePath = file.getAbsolutePath();
String classToLoad = filePath.substring(Server.CUR_DIR.length() + 1, filePath.length() - 6).replace(File.separatorChar, '.');
System.out.println(classToLoad);
loader.loadClass(classToLoad);
}
}
}
Java:
package game.extensions.tests;
public final class TestBuilderCmd
{
public static void initialize()
{
System.out.println("Hello from extensions static TestBuilderCmd.initialize");
}
}
Könnt ihr mir da weiterhelfen?
Besten Dank im vorraus,
FBIagent
Zuletzt bearbeitet: