2011-04-20 4 views
3

내가 tmp 디렉토리에ear 파일에서 jar의 등록 정보 파일을 편집하려고합니다. 가장 좋은 방법은? 다음의 tmp에 항아리를 검색</li> <li>

  1. 추출물 귀에서 귀 파일을 조작하는 자바 truezip API를 사용하여 생각하고,
  2. 항아리에 발견 특성 경우,
  3. 다음
  4. 다음 항아리 바 팩,
  5. 가 그 재산
  6. 을 수정 다시 항아리에 그것을 포장, TMP에 압축을 풉니 다 귀에 ck.

또는 거기에 쉘 스크립트를 사용하는 더 좋은 방법이 있습니까?

알려 주시기 바랍니다.

감사합니다,이 같은 것을 사용할 수 TrueZIP 7을 사용하여

+0

쉘 스크립트는 위의 설명처럼, 단계의 표준 세트를 구현하는 아주 좋은 방법입니다. 문제는 일부 단계는 중간 수준의 숙련 된 기술을 구현해야한다는 것입니다. 행운을 빕니다. – shellter

+0

Java를 사용하여 이러한 작업을 수행하기위한 조언이 있습니까? – Tom

+0

자바를 질문에 태그로 추가 하시겠습니까? 행운을 빕니다! – shellter

답변

2

:

public static void main(String args[]) throws IOException { 
    // Remember to add the following dependencies to the class path: 
    // Compile time artifactId(s): truezip-file 
    // Run time artifactId(s): truezip-kernel, truezip-driver-file, truezip-driver-zip 
    TFile.setDefaultArchiveDetector(new TDefaultArchiveDetector("ear|jar|war")); 
    search(new TFile(args[0])); // e.g. "my.ear" 
    TFile.umount(); // commit changes 
} 

private void search(TFile entry) throws IOException { 
    if (entry.isDirectory()) { 
     for (TFile member : dir.listFiles()) 
      search(member); 
    } else if (entry.isFile()) { 
     if (entry.getName().endsWith(".properties"); 
      update(entry); 
    } // else is special file or non-existent 
} 

private void update(TFile file) throws IOException { 
    Properties properties = new Properties(); 
    InputStream in = new TFileInputStream(file); 
    try { 
     properties.load(in); 
    } finally { 
     in.close(); 
    } 
    // [your updates here] 
    OutputStream out = new TFileOutputStream(file); 
    try { 
     properties.store(out, "updated"); 
    } finally { 
     out.close(); 
    } 
} 
+0

멋진 팁, 내 도구 목록에 True Zip을 추가해야합니다. –

0

저는 제가 달성하려고했던 것에 시작하는 데 @Christian Schlichtherle에서 답을 사용,하지만 사용 True Zip은 꽤 많이 바뀌 었습니다. 나는 희망을 갖고 누군가를 돕기 위해 내가 여기서해야 할 것을 게시 할 것이라고 생각했다.

TApplication을 확장하는 클래스를 만들어야합니다. 필자의 경우 논리 클래스를 구현할 때 설정 코드를 재사용 할 수 있도록 추상화하고 있습니다.

Application.java :

import de.schlichtherle.truezip.file.TApplication; 
import de.schlichtherle.truezip.file.TArchiveDetector; 
import de.schlichtherle.truezip.file.TConfig; 
import de.schlichtherle.truezip.fs.archive.zip.JarDriver; 
import de.schlichtherle.truezip.fs.archive.zip.ZipDriver; 
import de.schlichtherle.truezip.socket.sl.IOPoolLocator; 

/** 
* An abstract class which configures the TrueZIP Path module. 
*/ 
abstract class Application<E extends Exception> extends TApplication<E> { 

    /** 
    * Runs the setup phase. 
    * <p> 
    * This method is {@link #run run} only once at the start of the life 
    * cycle. 
    */ 
    @Override 
    protected void setup() { 
     TConfig.get().setArchiveDetector(
       new TArchiveDetector(
        TArchiveDetector.NULL, 
        new Object[][] { 
         { "zip", new ZipDriver(IOPoolLocator.SINGLETON)}, 
         { "ear|jar|war", new JarDriver(IOPoolLocator.SINGLETON)}, 
        }));  
    } 

} 

그런 다음 당신은 단지 추상 클래스를 확장하고 같이 "작업"방법을 구현한다.

ChangeProperty.java :

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Properties; 
import java.util.ServiceConfigurationError; 

import de.schlichtherle.truezip.file.TFile; 
import de.schlichtherle.truezip.file.TFileInputStream; 
import de.schlichtherle.truezip.file.TFileOutputStream; 

public class ChangeProperty extends Application<IOException> { 

    public static void main(String args[]) throws IOException { 
     try { 
      System.exit(new ChangeProperty().run(args)); 
     } catch (ServiceConfigurationError e) { 
      // Ignore this error because what we wanted to accomplish has been done. 
     } 
    } 

    private void search(TFile entry) throws IOException { 
     System.out.println("Scanning: " + entry); 
     if (entry.isDirectory()) { 
      for (TFile member : entry.listFiles()) 
       search(member); 
     } else if (entry.isFile()) { 
      if (entry.getName().endsWith(".properties")) { 
       update(entry); 
      } 
     } 
    } 

    private void update(TFile file) throws IOException { 
     System.out.println("Updating: " + file); 
     Properties properties = new Properties(); 
     InputStream in = new TFileInputStream(file); 
     try { 
      properties.load(in); 
     } finally { 
      in.close(); 
     } 

     // [your updates here] 
     // For example: properties.setProperty(key, newValue); 

     OutputStream out = new TFileOutputStream(file); 
     try { 
      properties.store(out, "updated by loggerlevelchanger"); 
     } finally { 
      out.close(); 
     } 
    } 

    @Override 
    protected int work(String[] args) throws IOException { 
     search(new TFile(args[0])); 
     return 0; 
    } 
}