Jar file packen, aus programm heraus!

h3xagon

Grünschnabel
Hallo Tutorials team :)

nach meinem letzten erfolgreich geloesten Problem muss ich euch wieder zur Last fallen ^^

Ich habe folgende Situation:

Ein executable jar file liegt als Datei vor und ich erzeuge in einem anderen Programm ein Objekt, welches dann serialisiert wird. Beide Dateien liegen also schon im selben Ordner, alles super soweit. (Das JarFile wird zu keinem (!!) Zeitpunkt ausgeführt!! )

Was ich jetzt aber gerne möchte ist:

Das Objekt (Also die datei davon) in das Jar-File hinzufügen, natürlich nicht von Hand ;)

Wie geht das? Ich koennte es auch erst enpacken und dann mit Objekt ganz neu verpacken, aber ich finde keine Möglichkeit mit JarFile...

Ich habe hier mal was gebastelt:

Code:
public class JarFileReadAndWrite {

	public static void main(String args[]) throws IOException
	{
		JarFile jarFile = new JarFile(new File("C:\\test.jar"));
		FileOutputStream out = new FileOutputStream(new File("C:\\testCopy.jar"));
		JarOutputStream jarOut = new JarOutputStream(out);
		Enumeration<JarEntry> jarFileEntrys = jarFile.entries();
		JarEntry akt = null;
		while(jarFileEntrys.hasMoreElements())
		{
			akt=jarFileEntrys.nextElement();
			System.out.println(akt.getName());
		}
		jarOut.putNextEntry(akt);
		out.close();
	}
}

Diese Klasse liest einen jarfile aus und schreibt bei mir jetzt nur den letzten Eintrag in ddas neu angelegte JarFile (testCopy.jar). Alles soweit, allerdings ist das fertige Archiv beschaedigt und ich kann nur die letzte Datei bei mir kopieren.
Füge ich die Zeile:

Code:
jarOut.putNextEntry(akt);

in die whileschleife ein, geht alles zubruch und er wirft mir eine ZipException in eben dieser zeile:

Exception in thread "main" java.util.zip.ZipException: invalid entry size (expected 58 but got 0 bytes)

Wass kann man da machen?

Vllt steh ich auch voll am schlauch aber man kann nicht einfach ne zip erstellen und die als .jar speichern oder?! ^^

Vielen Dank schonmal im Vorraus

Gruß

hexa
 
Zuletzt bearbeitet:
Nevermind, hab das passende hier im forum gefunden und angepasst, ich hoffe ich trete dem Autor nicht auf die Füße, in dem ich ihn als Autor habe stehen lassen, habe nämlich ein wenig modifiziert :)

Java:
/**
 *
 * @author OliverT
 * modified by AStein
 */

import java.io.*;
import java.util.*;
import java.util.jar.*;

public class Updater {

	File theFile;
	String jarLocation;
	String fileLocation;
	
	public Updater(String jarLocation, String fileLocation)
	{
		this.jarLocation = jarLocation;
		this.fileLocation = fileLocation;
		theFile = new File(fileLocation);
	}
	
    public void update() throws IOException {
    

      String jarName = jarLocation;
      String fileName = fileLocation;


      File jarFile = new File(jarName);
      File tempJarFile = new File(jarName + ".tmp");

      JarFile jar = new JarFile(jarFile);
      System.out.println(jarName + " geöffnet.");


      boolean jarUpdated = false;

      try {


         // Manifest jarManifest = jar.getManifest();
         JarOutputStream tempJar = new JarOutputStream(new FileOutputStream(tempJarFile));


         byte[] buffer = new byte[1024];
         int bytesRead;

         try {

            
            FileInputStream file = new FileInputStream(fileName);

            try {

               JarEntry entry = new JarEntry(theFile.getName());
               tempJar.putNextEntry(entry);

               while ((bytesRead = file.read(buffer)) != -1) {
                  tempJar.write(buffer, 0, bytesRead);
               }

               System.out.println(entry.getName() + " hinzugefügt.");
            }
            finally {
               file.close();
            }

            for (Enumeration<JarEntry> entries = jar.entries(); entries.hasMoreElements(); ) {
              
               JarEntry entry = (JarEntry) entries.nextElement();

               //Überspringe vorhandene Datei
               if(entry.getName().equals(theFile.getName())){
                   continue;
               }

                  InputStream entryStream = jar.getInputStream(entry);

                  // Schreibe in TempFile.
                  tempJar.putNextEntry(entry);

                  while ((bytesRead = entryStream.read(buffer)) != -1) {
                     tempJar.write(buffer, 0, bytesRead);
                  }
            }
            jarUpdated = true;
         }
         catch (Exception ex) {
            System.out.println(ex);
            
            // Füge Dummy Eintrag hinzu 
            tempJar.putNextEntry(new JarEntry("Dummy"));
         }
         finally {
            tempJar.close();
         }
      }
      finally {
         jar.close();
         System.out.println(jarName + " geschlossen.");


         if (! jarUpdated) {
            tempJarFile.delete();
         }
      }
      
      if (jarUpdated) {
         jarFile.delete();
         tempJarFile.renameTo(jarFile);       
      }
   }
    
   public static void main(String args[])
   {
		Updater updater = new Updater("C:\\test05.jar", "C:\\lol.txt");
		try 
		{
			updater.update();
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		}
   }
   
}

Ganz unten steht die Main, als übergabeparameter sind das JarFile und die datei, welche hinzugefuegt werden soll, anzugeben
 

Neue Beiträge

Zurück