Bonjour,
Ayant parcouru le Net abondamment, je me suis inspiré d'un code pour coder mon ClassLoader afin de charger dynamiquement un .jar.
Voici le projet : rien de particulier
clLoader
src
pack(package)
Essai.java
JarClassLoader.java
Panneau2.jar
pourvoir(package)
Panneau2.class
Pas d 'erreur à la compilation mais à l'exécution.
Le .jar que je désire charger est un Panneau simple de type JPanel.
Je pense qu'il s'agit d'un problème de Thread
Voici le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package pack; import javax.swing.JFrame; public class Essai extends JFrame { public void name() throws ClassNotFoundException { JarClassLoader jcl2 = new JarClassLoader(); Class cl = jcl2.loadClass("pourvoir.Panneau2"); } public static void main(String[] args) throws ClassNotFoundException { try { Essai essai = new Essai(); essai.name(); } catch (Exception e) { System.out.println("TODO: handle exception"); } } }Et la trace avec l'erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 package pack; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class JarClassLoader extends ClassLoader { private String jarFile = "./Panneau2.jar"; // chemin vers le fichier jar public JarClassLoader() { super(JarClassLoader.class.getClassLoader()); // appel du constructeur parent } public Class loadClass(String className) throws ClassNotFoundException { className = className.replaceFirst("\\.", "/"); System.out.println("className dans loadClass : " + className); return findClass(className); } public Class findClass(String className) { byte classBytes[]; Class result = null; try { JarFile jar = new JarFile(jarFile); Enumeration<JarEntry> e = jar.entries(); // pour examiner le contenu while (e.hasMoreElements()) { JarEntry jarEntry = (JarEntry) e.nextElement(); System.out.println("jarEntry :" + jarEntry); } System.out.println(); JarEntry entry = jar.getJarEntry(className + ".class"); System.out.println("entry ici : " + entry); InputStream is = jar.getInputStream(entry); ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); int nextValue = is.read(); while (-1 != nextValue) { byteStream.write(nextValue); nextValue = is.read(); } classBytes = byteStream.toByteArray(); className = className.replace('/', '.'); className = className.replace(".class",""); System.out.println("className avant define : " + className); return defineClass(className, classBytes, 0, classBytes.length); } catch (Exception e) { System.out.println("Exception ...."); return null; } } }Quelqu'un saurait-il m'indiquer d'où peut venir le problème ?className dans loadClass : pourvoir/Panneau2
Exception in thread "main" jarEntry :META-INF/
jarEntry :META-INF/MANIFEST.MF
jarEntry :pourvoir/Panneau2.class
entry ici : pourvoir/Panneau2.class
className avant define : pourvoir.Panneau2
className dans loadClass : javax/swing.JPanel
jarEntry :META-INF/
jarEntry :META-INF/MANIFEST.MF
jarEntry :pourvoir/Panneau2.class
entry ici : null
Exception ....
java.lang.NoClassDefFoundError: javax/swing/JPanel
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.lang.ClassLoader.defineClass(ClassLoader.java:466)
at pack.JarClassLoader.findClass(JarClassLoader.java:58)
at pack.JarClassLoader.loadClass(JarClassLoader.java:24)
at pack.Essai.name(Essai.java:9)
at pack.Essai.main(Essai.java:14)
Merci d'avance pour votre aide.
Partager