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().
Avez-vous vérifié le contenu du fichier jar créé? – Sanjeev
Y a-t-il une raison particulière pour laquelle vous n'utilisez pas la commande jar pour créer le fichier jar? – BetaRide
@ Sanjeev.J'ai vérifié le contenu du fichier jar.Le fichier de la classe existe au bon endroit. – user3153309