#java #classcastexception #urlclassloader
#java #classcastexception #urlclassloader
Вопрос:
В настоящее время я сталкиваюсь с другой странной проблемой с Java.
Моей целью было создать небольшую систему плагинов для предоставления API для одного из моих приложений. Мне удалось сделать такую вещь, и она довольно хорошо работает в Windows. Но когда я пытаюсь запустить то же приложение с тем же плагином в Linux (Debian 7), оно выдает ClassCastException.
Вот загрузчик:
public ArrayList<ServerPlugin> loadPlugins() throws ServerException
{
ArrayList<ServerPlugin> plugins = new ArrayList<ServerPlugin>();
File pluginDir = new File("plugins");
IMServer.getServer().getSystemLogger().log(Logger.INFO, "Plugin Folder: " pluginDir.getAbsolutePath());
File[] jars = pluginDir.listFiles(new FileFilter()
{
public boolean accept(File pathname)
{
return pathname.getName().endsWith(".jar");
}
});
try
{
for (File f : jars)
{
URLClassLoader loader = URLClassLoader.newInstance(new URL[] { f.toURI().toURL() });
ResourceBundle props = ResourceBundle.getBundle("plugin", Locale.getDefault(), loader);
final String pluginClassName = props.getString("MainClass");
final String pluginName = props.getString("PluginName");
IMServer.getServer().getSystemLogger().log(Logger.INFO, "Enabling " pluginName);
Object pluginObject = loader.loadClass(pluginClassName).newInstance();
if (pluginObject instanceof ServerPlugin)
{
ServerPlugin plugin = (ServerPlugin) pluginObject;
plugin.onLoad();
plugins.add(plugin);
}
}
}
catch (Exception ex)
{
IMServer.getServer().getSystemLogger().log(Logger.ERROR, "Unknown error in plugin system: n");
ex.printStackTrace();
}
return plugins;
}
Как вы можете видеть, я попытался предотвратить исключение, создав проверку instanceof. Теперь я не получаю исключение, но и плагин не загружается (вроде очевидно).
И вот код плагина:
public class Plugin implements ServerPlugin {
@Override
public CommandList getCommandList() {
CommandList commands = new CommandList();
commands.add("SEND");
return commands;
}
@Override
public void onCommand(String command, String[] args, User sender) throws ServerException {
if (args[1].equalsIgnoreCase("!test"))
{
String message = "Server:Testplugin";
message = ";" timestamp();
try
{
sender.getOutputStream().write(message "n");
sender.getOutputStream().flush();
}
catch (IOException ex)
{
throw new CommunicationException(ex.getMessage());
}
}
}
private String timestamp()
{
SimpleDateFormat format = new SimpleDateFormat("MM-dd/HH-mm-ss");
Date currentTime = new Date(System.currentTimeMillis());
return format.format(currentTime);
}
@Override
public void onLoad() {
System.out.println("Hello from test plugin!");
}
@Override
public void onUnload() {
System.out.println("Goodbye from test plugin :-(");
}
}
Конечно, у меня есть объявление пакета и импорт, я просто отключил их, чтобы сделать его более читаемым.
Теперь это файл plugin.properties, используемый для загрузки плагина:
MainClass=me.test.Plugin
PluginName=Testplugin
Строка, которая вызывала исключение до того, как я создал экземпляр thingy ServerPlugin plugin = (ServerPlugin) pluginObject;
, и трассировка стека выглядит следующим образом:
java.lang.ClassCastException: me.test.Plugin cannot be cast to net.dreamcode.im.server.plugins.ServerPlugin
at net.dreamcode.im.server.plugins.PluginManager.loadPlugins(PluginManager.java:68)
at net.dreamcode.im.server.IMServer.startServer(IMServer.java:165)
at net.dreamcode.im.server.IMServer.main(IMServer.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Мне интересно, почему происходит вызов части Eclipse. Может быть, это причина моей проблемы?
Заранее спасибо за помощь!
Комментарии:
1. Этот вызов, если JarRsrcLoader возникает, если вы работаете из jar, экспортируемого eclipse с упакованными библиотеками.
2. Спасибо за ваш быстрый ответ. Это вызывает мою проблему? Если это так, я бы попытался перепаковать без библиотек.