2014-06-26 4 views
0

Je dois créer un jar et charger des classes dans jar en utilisant classLoader. J'utilise le code suivant pour créer une structure de dossier à l'intérieur de jar.Cela fonctionne bien mais quand j'essaie de charger la classe à partir de jar, il lance l'exception ClassNotFound.Création de jar et chargement de classes

public void createJar() throws IOException 
{ 
    //FileOutputStream stream = new FileOutputStream("D:\\MyFolder\\apache-tomcat-6.0.32\\webapps\\SpringTest\\WEB-INF\\lib\\serviceJar.jar"); 
    FileOutputStream stream = new FileOutputStream("D:/MyFolder/apache-tomcat-6.0.32/webapps/SpringTest/WEB-INF/lib/serviceJar.jar"); 
    JarOutputStream target = new JarOutputStream(stream, new Manifest()); 
    add(new File("D:/myJar"), target); 
    target.close(); 
    stream.close(); 
} 

private void add(File source, JarOutputStream target) throws IOException 
{ 

    byte buffer[] = new byte[10204]; 
    try 
    { 
    if (source.isDirectory()) 
    { 
     String name = source.getPath().replace("\\", "/"); 
     if (!name.isEmpty()) 
     { 
     if (!name.endsWith("/")) 
      name += "/"; 
     JarEntry entry = new JarEntry(name); 
     entry.setTime(source.lastModified()); 
     target.putNextEntry(entry); 
     target.closeEntry(); 
     } 
     for (File nestedFile: source.listFiles()) 
     add(nestedFile, target); 
     return; 
    } 

    JarEntry entry = new JarEntry(source.getPath().replace("\\", "/")); 
    // JarEntry entry = new JarEntry(source.getPath()); 
    entry.setTime(source.lastModified()); 
    target.putNextEntry(entry); 



    FileInputStream in = new FileInputStream(source); 
    while (true) { 
     int nRead = in.read(buffer, 0, buffer.length); 
     if (nRead <= 0) 
     break; 
     target.write(buffer, 0, nRead); 
    } 
    in.close(); 
    target.closeEntry(); 
    } 
    catch(Exception e){ 

    } 
    finally 
    { 

    } 
} 

classes à jared sont à l'emplacement "D: \ monjar \ contrôleur printemps \ \ MyController.class" et " D: \ monjar \ printemps \ Service \ MyService.class" .Donc pot est créé comme Je veux et aussi contient la structure des dossiers (Mycontroller.class est à l'intérieur pot à l'emplacement \ monjar \ ressort \ contrôleur) .Mais lorsque je tente de le charger avec le code suivant, je me exception

public void loadJar() { 
    //File root = new File("D:\\MyFolder\\apache-tomcat-6.0.32\\webapps\\SpringTest\\WEB-INF\\lib\\serviceJar.jar");// 
    File root = new File("D:/MyFolder/apache-tomcat-6.0.32/webapps/SpringTest/WEB-INF/lib/serviceJar.jar");// 
    URLClassLoader classLoader; 
    try { 

      classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() }); 

      Class<?> cls = Class.forName("myJar.spring.controller.MyController", true, classLoader); 
      Object instance = cls.newInstance(); // Should print constructor content 
      System.out.println(instance); 
      Method m =cls.getMethod("printThis", null); 
      m.invoke(instance, null);     
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

Mais si je crée pot sans structure d'emballage à l'intérieur. Cela fonctionne bien. J'ai vérifié tous mes chemins et ils sont corrects.Egalement, l'emplacement du fichier de classe à l'intérieur de Jar est correct. Veuillez expliquer pourquoi j'obtiens une exception ClassNotFound. Veuillez également indiquer si des modifications sont nécessaires dans le code createJar() ou add().

+0

Avez-vous vérifié le contenu du fichier jar créé? – Sanjeev

+0

Y a-t-il une raison particulière pour laquelle vous n'utilisez pas la commande jar pour créer le fichier jar? – BetaRide

+0

@ Sanjeev.J'ai vérifié le contenu du fichier jar.Le fichier de la classe existe au bon endroit. – user3153309

Répondre

0

Vous devrez peut-être ajouter un chemin de classe lors de vos déplacements, le lien suivant pourrait vous aider.

How do you change the CLASSPATH within Java?

+0

Err, juste une clarification mineure: fondamentalement, le CLASSPATH ne peut pas être modifié pendant l'exécution. Cependant, ce que vous pouvez faire, c'est de définir des chargeurs de classe personnalisés (par exemple, un chargeur de classe d'URL qui contient le fichier Jar donné - ne soyez pas effrayé, c'est beaucoup plus facile qu'il n'y parait :-). – rlegendi

+0

@ Rlegrndi.Please pouvez-vous expliquer en détail. – user3153309