Avatar billede margitbork Nybegynder
20. februar 2007 - 11:03 Der er 12 kommentarer og
1 løsning

genindlæsning af resourcer fra classpath

Hej
Er det muligt at genindlæse en .jar fil der var angivet på jvm'ens classpath. Hvordan gør man ?
Avatar billede arne_v Ekspert
20. februar 2007 - 18:01 #1
teknisk set er det ikke jar filen men klasserne fra den der skal
genindlaeses

men det kan kun goeres ved at loade klasserne med en dedikeret classloader
og smide den ud naar man vil opdatere klasserne
Avatar billede margitbork Nybegynder
21. februar 2007 - 08:30 #2
Vil det sige man skal kende navnene på alle de klasser der er i .jar filen ?
Hvordan loader man klasserne fra den ? - kan man læse .jar filen og se hvilke klasser der ligger i den?
Avatar billede margitbork Nybegynder
21. februar 2007 - 11:22 #3
Jeg er ved at forsøge mig frem med den der classloader. Men jeg kan ikke rigtigt få det til at virke.
Jeg har følgende kode (kommer i næste indlæg...)
Avatar billede margitbork Nybegynder
21. februar 2007 - 11:26 #4
package loader;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ResourceBundle;

import sun.security.util.Resources;

public class Loader
{
public void load(){
  try
  {
 
   
  String lib = "D:/Projekter/myProject/lib";

  File dir = new File(lib);
 
  File[] files = dir.listFiles();
 

    URL[] resourceURL = new URL[files.length];

// loader alle .jar filer der er placeret i lib   
    for(int i =0; i<files.length; i++){
      System.out.println(files[i].getName());
        resourceURL[i] = files[i].toURL();
    }

    ClassLoader systemclassloader = URLClassLoader.getSystemClassLoader();
   
   
   
    URLClassLoader urlloader =  URLClassLoader.newInstance(resourceURL,systemclassloader);

  System.out.println(urlloader.getURLs().length);
   
    String main ="mypackage.mysubpackage.MyClassMain";

    String mainclass=main+".class";

    String mainclassfile = main.replace('.', '/')+".class";
   
    String resource = mainclassfile;
   
    URL url = null;

    if (url == null)
    {
      url = urlloader.findResource(resource);
    }
    if (url == null)
    {
      System.out.println("Could not find resource " + resource);
    }

   
    System.out.println("resource = "+resource);
    System.out.println("url = "+url);

    // gives me the location of the MyClassMain file in the .jar file
   
    url = urlloader.getResource(mainclassfile);
   
    System.out.println(url);
   
   
    urlloader.loadClass(mainclass); // fejler med classnotfound...
   
    Class mainclassclass = Class.forName(mainclass);
   
    mainclassclass.newInstance();
   

  }
  catch (MalformedURLException e)
  {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  catch (ClassNotFoundException e)
 
  {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  catch (IllegalAccessException e)
  {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  catch (InstantiationException e)
  {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
 
 
}
 
 

public static void main(String[] args){
  Loader loader = new Loader();
  loader.load();
}

}
Avatar billede margitbork Nybegynder
21. februar 2007 - 11:26 #5
Hvorfor virker det ikke ?
Avatar billede arne_v Ekspert
22. februar 2007 - 04:17 #6
jeg forstår ikke hvorfor du laver det med ressource - det er ikke nødvendigt

        URLClassLoader cl = new URLClassLoader(url);
        SomeInterface o = (SomeInterface)Class.forName("somepackage.SomeClass", true, cl).newInstance();

for at loade - og o og cl ud af scope eller explicit =null når man vil af med dem igen
Avatar billede arne_v Ekspert
22. februar 2007 - 04:18 #7
og meget vigtigt: jar filerne må ikke være i classpath for parent classloader
(fordi så loades de af parent ikke af din classloader !)
Avatar billede margitbork Nybegynder
22. februar 2007 - 08:10 #8
Tak for eksemplet - det forsøger jeg når jeg kan få fri fra børnepasningen i disse snemasser ;o)
Avatar billede margitbork Nybegynder
23. februar 2007 - 08:19 #9
Jeg får stadig ClassNotFoundException
Er det et problem at det er pakket i .jar filer ?


  String lib = "D:/Projekter/myProject/lib";

  File dir = new File(lib);
 
  File[] files = dir.listFiles();
 

    URL[] resourceURL = new URL[files.length];
   
    // makint URL[] of all .jar files in the lib folder
    for(int i =0; i<files.length; i++){
      System.out.println(files[i].getName());
        resourceURL[i] = files[i].toURL();
    }

    URLClassLoader cl = new URLClassLoader(resourceURL);
   
    String main ="somepackage.subpackage.MyMain";

    String mainclass=main+".class";
    String mainclassfile = main.replace('.', '/')+".class";
   
   
   
    // just to confirm that the class has been loaded i find it in the classloader.
    URL  url = cl.findResource(mainclassfile);
    System.out.println("url from classloader= "+url);
    >>Here i get a nice print of the files location in a .jar archive.
   
    // trying to instantiate the class   
    Class mainclassclass = Class.forName(mainclass, true, cl); // here it fails.
    mainclassclass.newInstance();
Avatar billede margitbork Nybegynder
23. februar 2007 - 08:20 #10
HA - den skal ikke hedde .class....
Det løste første problem. Nu skal jeg bare have resten med i loaderen...
Avatar billede arne_v Ekspert
23. februar 2007 - 15:11 #11
resten ?
Avatar billede margitbork Nybegynder
23. februar 2007 - 16:12 #12
Det var noget med nogle properties og billeder - men jeg overvejer strategien - hovedformålet er at kunne opdatere en .jar fil uden at skulle genstarte applikationen ved at genindloade resourcen, så jeg tror at det kun skal være en enkelt .jar fil der skal loades explicit. Du må gerne få point for at have hjulpet mig på vej ;o)
Avatar billede arne_v Ekspert
24. februar 2007 - 02:59 #13
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester