Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > помогите изменить файл в jar архиве


Автор: FreakOnALeash 12.11.2009, 15:23
Добрый всем день, есть такая задача, есть jar архив, в нем содержится файл ключа, который для каждого пользователя разный, может кто то знает как изменять содержимое jar архива. 
нашел способ считывать информацию с файла, но изменять и записывать не получается
Код

JarFile j = new JarFile(filename);

            Enumeration<JarEntry>  enu= j.entries();
            JarEntry jar;
            FileOutputStream fos = new FileOutputStream("newFileMidlet.jar");
            while(enu.hasMoreElements()) {
                jar = enu.nextElement();
                JarInputStream in = new JarInputStream(j.getInputStream(jar));
                byte [] inarr = new byte[(int)jar.getSize()];
                if(jar.getName().equals("e.class")) { // вот тут бы классно было бы поменять :)    
                    in.read(inarr);
                   
                }
                in.read(inarr);
                fos.write(inarr,0,inarr.length);
            }
             fos.close();

Автор: FreakOnALeash 12.11.2009, 16:07
Или может быть кто то подскажет как вызвать такое из джава программы

jar uf Midlet.jar keyfile.key

Автор: LSD 12.11.2009, 16:30
http://base.vingrad.ru/view/117-Kak-zapustit-prilozhenie-iz-pod-Java

Из Java же, надо будет работать с ZipOutputStream.

Автор: FreakOnALeash 12.11.2009, 17:09
Сделал доработав первый вариант. Если вдруг понадобится кому то:

Код

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;

public class JarChanger {

    public List<File> getFromJar() {
        List<File> files = new ArrayList<File>();
        try {
            File filename = new File("SoftMidlet.jar");
            java.util.jar.JarFile jar = new java.util.jar.JarFile(filename);
            java.util.Enumeration eu  = jar.entries();
            while (eu.hasMoreElements()) {
                java.util.jar.JarEntry file = (java.util.jar.JarEntry) eu.nextElement();
                java.io.File f = new java.io.File("hp/" + java.io.File.separator + file.getName());
                if (file.isDirectory()) {
                    // if its a directory, create it
                    f.mkdir();
                    continue;
                }
                java.io.InputStream is = jar.getInputStream(file); // get the input stream
                java.io.FileOutputStream fos = new java.io.FileOutputStream(f);
                while (is.available() > 0) {
                    // write contents of 'is' to 'fos'
                    fos.write(is.read());
                }
                fos.close();
                is.close();

                if(file.getName().equals("keyfile.key")) 
                    files.add(new File("keyfile.key"));
                 else
                    files.add(f);
                

            }
        } catch (IOException ex) {
            System.out.println("Error: " + ex.getMessage());
        }
        return files;
    }
    protected void createJarArchive(List<File> tobeJared) {
    File archiveFile = new File("SoftMidletNew1.jar");
    try {
      byte buffer[] = new byte[10240];
      // Open archive file
      FileOutputStream stream = new FileOutputStream(archiveFile);
      JarOutputStream out = new JarOutputStream(stream, new Manifest());

      for (File toJar: tobeJared) {
        if (toJar == null || !toJar.exists()
            || toJar.isDirectory())
          continue; // Just in case...
        System.out.println("Adding " + toJar.getName());
        // Add archive entry
        JarEntry jarAdd = new JarEntry(toJar.getName());
        jarAdd.setTime(toJar.lastModified());
        out.putNextEntry(jarAdd);

        // Write file to archive
        FileInputStream in = new FileInputStream(toJar);
        while (true) {
          int nRead = in.read(buffer, 0, buffer.length);
          if (nRead <= 0)
            break;
          out.write(buffer, 0, nRead);
        }
        in.close();
      }
      out.close();
      stream.close();
      System.out.println("Adding completed OK");
    } catch (Exception ex) {
      ex.printStackTrace();
      System.out.println("Error: " + ex.getMessage());
    }
    }
    public static void main(String[] args) {
        JarChanger m = new JarChanger();
        m.createJarArchive(m.getFromJar());
    }
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)