ClassLoader.... Again

0 respostas
porfirio

Oi malta!

Estou usando este codigo que achei no forum para carregar todos os classes de uma pasta

package launcher;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;

public class Launch implements Runnable {

    private static String[] arguments;

    public static void main(String args[]) {
        arguments = args;

        try {
            new Thread((Runnable)Class.forName("launcher.Launch").newInstance()).start();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }



    public void run() {
        try {
            File temp = new File(".");
            File[] files = temp.listFiles();
            ArrayList aFiles = new ArrayList();
            for (int i = 0; i < files.length; i ++) {
                if (files[i].getName().endsWith(".jar") || files[i].getName().endsWith(".zip")) {
                    System.out.println("adicionando " + files[i].getCanonicalFile());
                    aFiles.add(new URL("jar", "", "file:" + files[i].getAbsolutePath() + "!/"));
                }
            }

            URL[] url = new URL[aFiles.size()];
            for (int i = 0; i < aFiles.size(); i ++) {
                url[i] = (URL)aFiles.get(i);
            }
            URLClassLoader l = new URLClassLoader(url);
            Thread.currentThread().setContextClassLoader(l);

            System.out.println("preparando carga do programa");
*            Class loadedClass = l.loadClass("sua.classe.que.contem.o.main");
            System.out.println("buscando método main");
            Method method = loadedClass.getMethod("main", new Class[] { String[].class });
            System.out.println("invocando método main");
            method.invoke(method, new Object[] { Launch.arguments });
            System.out.println("método main invocado!!!");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

O meu codigo ta um pouco modificado mas a base é essa

Agora tenho um problema, se eu chamar Toolkit.getDefaultToolkit().getImage(new File("splash.png").getAbsolutePath()); antes de carregar os jars, ele carrega o programa , mas eu estou a usar o ApplicationFramework e esse jar, como é obvio, é carregado pelo launcher.

Da me erro a carregar e salvar a sessão, pêlo que me parece eles serealizão objectos.

O erro é este:

11/Dez/2007 13:15:33 org.jdesktop.application.SingleFrameApplication initRootPaneContainer
WARNING: couldn't restore sesssion [mainFrame.session.xml]
org.jdesktop.application.LocalStorage$LSException: load failed "mainFrame.session.xml"
at org.jdesktop.application.LocalStorage.load(LocalStorage.java:150)
at org.jdesktop.application.SessionStorage.restore(SessionStorage.java:382)
at org.jdesktop.application.SingleFrameApplication.initRootPaneContainer(SingleFrameApplication.java:231)
at org.jdesktop.application.SingleFrameApplication.show(SingleFrameApplication.java:463)
at mike.instmess.InstantMess.startup(InstantMess.java:19)
at org.jdesktop.application.Application$1.run(Application.java:171)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.jdesktop.application.SessionStorage$WindowState
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.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.sun.beans.ObjectHandler.classForName(Unknown Source)
at com.sun.beans.ObjectHandler.classForName(Unknown Source)
at com.sun.beans.ObjectHandler.classForName2(Unknown Source)
at com.sun.beans.ObjectHandler.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at java.beans.XMLDecoder.getHandler(Unknown Source)
at java.beans.XMLDecoder.readObject(Unknown Source)
at org.jdesktop.application.LocalStorage.load(LocalStorage.java:148)
... 13 more

Criado 11 de dezembro de 2007
Respostas 0
Participantes 1