# Jar aus einem JarArchiev laden



## Zhoragh (19. Dezember 2005)

Ich habe ein Programm geschrieben welches als JarAchiev gepackt wird.
Die Resourcen dieses Programmes enthalten u.a auch eine Jar Datei die geladen werden soll.

Lade ich diese Jar entsteht ein Fehler das angeblich der ZipInputstream Null ist auf dem ich aber nicht direkt zugreife sondern nur über JarInputStream.

Ich lade das Jar Folgender maßen:

```
JarInputStream jarIn = new JarInputStream(MainFrame.class.getResourceAsStream("gameEngine\\gameEngine.jar")); //hier entsteht der NullPointer des ZipInputStreams
```

Kann mir jemand eine Alternative zum laden einer Jar aus einer Jar heraus zeigen


----------



## Thomas Darimont (19. Dezember 2005)

Hallo!

   Wenn du Klassen aus dem Jar im Jar laden willst kann ich dir gleich sagen, dass das nicht geht (bzw. nicht so ohne weiteres). 

   Aber schau mal hier:
 (Das mysql-connector-java-3.1.8-bin.jar ist im Jar drinnen und liegt sonst nirgendwo im ClassPath, um Klassen aus diesem Jar zu laden muss man es temporär an eine Stelle entpacken und dann dynamisch zum ClassPath hinzufügen.)

```
/**
    * 
    */
   package de.tutorials;
   
   import java.io.File;
   import java.io.FileOutputStream;
   import java.io.InputStream;
   import java.lang.reflect.Method;
   import java.net.URL;
   import java.net.URLClassLoader;
   import java.sql.Connection;
   
   import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
   
   /**
    * @author Tom
    * 
    */
   public class JarInJarLoaderExample {
   
   	/**
   	 * @param args
   	 */
   	public static void main(String[] args) throws Exception {
   		// System.getProperties().list(System.out);
   		String mysqlLibraryName = "mysql-connector-java-3.1.8-bin.jar";
   		File mysqlLibraryFile = new File(new File(System
 				.getProperty("java.io.tmpdir")), mysqlLibraryName);
   
   		InputStream inputSteam = JarInJarLoaderExample.class.getClassLoader()
 				.getResourceAsStream(mysqlLibraryName);
   
   		byte[] buffer = new byte[16384];
   		int len = 0;
   		FileOutputStream fileOutputStream = new FileOutputStream(
   				mysqlLibraryFile);
   		while ((len = inputSteam.read(buffer)) > 0) {
   			fileOutputStream.write(buffer, 0, len);
   			fileOutputStream.flush();
   		}
   		fileOutputStream.close();
   		inputSteam.close();
   
   		Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL",
   				new Class[]{URL.class});
   		addUrlMethod.setAccessible(true);
   		addUrlMethod.invoke(Thread.currentThread().getContextClassLoader(),
 				new Object[]{mysqlLibraryFile.toURL()});
   
   		MysqlDataSource mysqlDataSource = new MysqlDataSource();
   		System.out.println(MysqlDataSource.class + " loaded from: "
 		 	+ MysqlDataSource.class.getProtectionDomain().getCodeSource());
   		mysqlDataSource.setUser("root");
   		mysqlDataSource.setPassword("");
   		mysqlDataSource.setPort(3306);
   		mysqlDataSource.setServerName("localhost");
   		mysqlDataSource.setDatabaseName("test");
   
   		Connection connection = mysqlDataSource.getConnection();
   		System.out.println("connect successful!");
   		connection.close();
   
   		mysqlLibraryFile.deleteOnExit();
   
   	}
   }
```
 
  Ausgabe:

```
C:\>java -jar jarinjarloader.jar
 class com.mysql.jdbc.jdbc2.optional.MysqlDataSource loaded from: (file:/C:/DOKUME~1/Tom/LOKALE~1/Temp/mysql-connector-java-3.1.8-bin.jar <no signer certificates>)
  connect successful!
```
 
   Gruss Tom


----------



## Zhoragh (19. Dezember 2005)

Eigentlich möchte ich die Klassen nicht benutzen ich möchte nur den Inhalt dieser Jar zusammen mit ein paar anderen Daten in eine Neu Jar Packen.

Aber wärend der Laufzeit


----------



## elmato (20. Dezember 2005)

Durchsuch mal das Forum, das Thema gab es schon einigemale, du musst das alte Jar auslesen und komplett in ein neues schreiben..
mfg
elmato


----------

