Avatar billede muingaza Nybegynder
16. juni 2009 - 21:50 Der er 10 kommentarer

Load class filer fra .jar fil?

Jeg forsøger at bruge denne kode til at loade .class filer fra en .jar fil:

http://snippets.dzone.com/posts/show/3574

Jeg har modificeret den til:



public class JarFileLoader extends URLClassLoader
{
    public JarFileLoader (URL[] urls)
    {
        super (urls);
    }

    public void addFile (String path) throws MalformedURLException
    {
        String urlPath = "jar:file://" + path + "!/";
        addURL (new URL (urlPath));
    }
   
    public static void main (String args [])
    {

        try
        {
            URL urls [] = {};
            JarFileLoader cl = new JarFileLoader (urls);
            String jarFile = "c:/test/mytest.jar";
            cl.addFile (jarFile);
           
            System.out.println ("Second attempt...");

            String className = "testpackage.MyTest";       
            cl.loadClass (className);
            System.out.println ("Success!");
        }
        catch (Exception ex)
        {
            System.out.println ("Failed.");
            ex.printStackTrace ();
        }
    }
}

Hvor c:\test\mytest.jar er en .jar fil som indeholder testpackage.MyTest som er filen MyTest.class. Men når jeg kører programmet får jeg:

Failed.
java.lang.ClassNotFoundException: testpackage.MyTest

Nogen ide til hvorfor jeg ikke kan loade denne .class fil?
Avatar billede arne_v Ekspert
16. juni 2009 - 22:17 #1
Ligger class filen rigtigt i jar filen?

testpackage/MyTest.class

?
Avatar billede arne_v Ekspert
16. juni 2009 - 22:19 #2
Ioevrigt kan jeg ikke se hvad du opnaar ved at bruge JarFileLoader fremfor at oprette en raa URLClassLoader naar du skal bruge den.
Avatar billede muingaza Nybegynder
16. juni 2009 - 22:24 #3
Når jeg åbner .jar filen med 7zip er stien til klasse filen:

C:\test\mytest.jar\testpackage\MyTest.class

Koden er taget fra den side jeg linker til, men du kan have ret i at det ikke giver meget mening at nedarve - dog burde det ikke betyde at det ikke fungere.

Jeg har netop prøvet med nogle andre .jar fil er med samme resultat - java.lang.ClassNotFoundException
Avatar billede muingaza Nybegynder
16. juni 2009 - 23:14 #4
her er et mindre eksempel som giver samme fejl:

    URLClassLoader loader;
    URL url[] = new URL[1];
    try {
      String jarFile = "c:/test/mytest.jar";
      File f = new File(jarFile);
      if(!f.exists()){
        throw new Exception("jar file not found!");
      }
      String urlPath = "jar:file://" + jarFile + "!/";
      System.out.println(urlPath);
      url[0] = new URL(urlPath);
      loader = new URLClassLoader(url);
      loader.loadClass("testpackage.Test");
      System.out.println("class loaded!");
     
    } catch (Exception e) {
      e.printStackTrace();
    };
Avatar billede muingaza Nybegynder
16. juni 2009 - 23:15 #5
Der skulle self. stå 'MyTest' - giver stadig en:

java.lang.ClassNotFoundException



    URLClassLoader loader;
    URL url[] = new URL[1];
    try {
      String jarFile = "c:/test/mytest.jar";
      File f = new File(jarFile);
      if(!f.exists()){
        throw new Exception("jar file not found!");
      }
      String urlPath = "jar:file://" + jarFile + "!/";
      System.out.println(urlPath);
      url[0] = new URL(urlPath);
      loader = new URLClassLoader(url);
      loader.loadClass("testpackage.MyTest");
      System.out.println("class loaded!");
     
    } catch (Exception e) {
      e.printStackTrace();
    };
Avatar billede muingaza Nybegynder
16. juni 2009 - 23:57 #6
Kan det være en bug i Java API'en?
Avatar billede arne_v Ekspert
17. juni 2009 - 08:33 #7
Hvis du laver:

jar tvf mytest.jar

saa skal class file ligge som:

testpackage/MyTest.class

ellers virker det ikke - da classloaderen leder efter den der.

Du boer altid bruge enten jar utilityen eller jar tasket i ant til at lave jar filer med.
Avatar billede muingaza Nybegynder
17. juni 2009 - 10:05 #8
Det har jeg tjekket:

C:\test>jar tvf mytest.jar
    65 Tue Jun 16 20:28:54 CEST 2009 META-INF/MANIFEST.MF
  4889 Tue Jun 16 20:08:32 CEST 2009 testpackage/ClassPreloader.class
  489 Tue Jun 16 20:05:26 CEST 2009 testpackage/MyTest.class
  487 Tue Jun 16 20:09:28 CEST 2009 testpackage/MyTest2.class

C:\test>
Avatar billede arne_v Ekspert
17. juni 2009 - 22:25 #9
proev lige med:

String urlPath = "file://" + jarFile;
Avatar billede arne_v Ekspert
04. august 2009 - 03:44 #10
?
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