1

アプリケーションでTrueZipを使用して、ファイル/フォルダーをテンプレートzipに追加してから、ユーザーが指定した場所にzipを移動しています。Netbeansからアプリケーションを実行するか、コマンドプロンプトから.jarを実行すると、すべてが希望どおりに機能します。ユーザーがzipに「test」という名前を付けると、指示された場所に2つのファイルが作成されます。test.zipと「test.zip。{random-number} .tmp」という名前のtmpファイルです。アプリケーションを閉じると、tmpファイルは次のようになります。削除されました。

これで、Java Web Startを使用してアプリケーションをWebサーバーにデプロイして実行すると、2つのファイルが再度作成されますが、アプリケーションを閉じてもtmpファイルは削除されず、作成されたzipを開こうとすると「」というメッセージが表示されます。アーカイブの形式が不明であるか、破損しています。」

なぜnetbeansまたは.jarからは正常に機能するのか理解できませんが、WebStartでは機能しません。

zipを作成しているクラスを呼び出すコード:

JFileChooser chooser = new JFileChooser();
    chooser.setAcceptAllFileFilterUsed(false);
    chooser.addChoosableFileFilter(new FileFilter() { 
        @Override
        public boolean accept(File file) {
            if (file.isDirectory()) {
                return true;
            }
            if(file.getName().toLowerCase().endsWith(".zip")) {
                return true;
            }
            return false;
        }
        @Override
        public String getDescription() {
            return "*.zip";
        }
    });

    int rVal = chooser.showSaveDialog(this);

    if (rVal == JFileChooser.APPROVE_OPTION) {
        try {
            //Get savepath and ensure it ends with .zip extension
            String savePath = chooser.getSelectedFile().getCanonicalPath();
            if (!savePath.endsWith(".zip")) {
                savePath = savePath.concat(".zip");
            }

            PackageBuilder build = new PackageBuilder(groups, calibData);
            build.buildZip(savePath);
        } catch (IOException ex) {
            System.out.println(ex);
        }

    }

PackageBuilderクラス:

package apkinstallingaromacreator;

import de.schlichtherle.truezip.file.TFile;
import de.schlichtherle.truezip.file.TFileWriter;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;

public class PackageBuilder {

    private File workingArchive;
    private AromaConfigBuilder aromaBuilder;
    private UpdaterScriptBuilder updaterBuilder;
    private ApkGroup[] groups;

    public PackageBuilder(ApkGroup[] groups, String calibData) {
        workingArchive = new File(System.getProperty("java.io.tmpdir"), "aromabuild.zip");
        aromaBuilder = new AromaConfigBuilder(groups, calibData);
        updaterBuilder = new UpdaterScriptBuilder(groups);
        this.groups = groups;

        //Get template.zip from jar package and move it to system tmp directory
        URL templateUrl = getClass().getResource("resources/template.zip");
        try {
            FileUtils.copyURLToFile(templateUrl, workingArchive);
        } catch (IOException ex) {
            System.out.println("Failed to copy template zip from resources");
            Logger.getLogger(PackageBuilder.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void importApkFiles() {
        //For each Apk in each ApkGroup add Apk file to zip in system tmp directory
        //If Apk doesn't list a file, create an empty directory for adding manually
        for (int x = 0; x < groups.length; x++) {
            Apk[] apks = groups[x].getApkArray();
            for (int y = 0; y < apks.length; y++) {
                if (apks[y].getApkFileLocation().isEmpty()) {
                    TFile dir = new TFile(workingArchive, "data/" + apks[y].getApkName());
                    dir.mkdir();
                }
                else {
                    TFile src = new TFile(apks[y].getApkFileLocation());
                    TFile dst = new TFile(workingArchive, "data/" + apks[y].getApkName() + 
                            "/" + apks[y].getApkName() + ".apk");
                    try {
                        src.cp_rp(dst);
                    } catch (IOException ex) {
                        Logger.getLogger(PackageBuilder.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            } 
        }
    }

    public void buildZip(String savePath) {
        //populate aroma-config file within template.zip
        File aroma = new TFile(workingArchive, "META-INF/com/google/android/aroma-config");
        try {
            Writer aromaWriter = new TFileWriter(aroma);
            aromaWriter.write(aromaBuilder.buildConfig());
            aromaWriter.close();
        } catch (IOException ex) {
            Logger.getLogger(PackageBuilder.class.getName()).log(Level.SEVERE, null, ex);
        }

        //Populate updater-script file within template.zip
        File updater = new TFile(workingArchive, "META-INF/com/google/android/updater-script");
        try {
            Writer updaterWriter = new TFileWriter(updater);
            updaterWriter.write(updaterBuilder.buildConfig());
            updaterWriter.close();
        } catch (IOException ex) {
            Logger.getLogger(PackageBuilder.class.getName()).log(Level.SEVERE, null, ex);
        }

        importApkFiles();

        //Copy the zip from system tmp directory to user specified location
        TFile src = new TFile(workingArchive);
        TFile dst = new TFile(savePath);

        try {
           src.cp_rp(dst);
        } catch (IOException ex) {
            Logger.getLogger(PackageBuilder.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }
}
4

1 に答える 1

0

どうやら、アーカイブ ファイルへの変更をコミットするためにシャットダウン フックが実行されていないようです。適切な場所に呼び出しを追加するだけです。TVFS.umount()たとえば、finally ブロックのbuildZip. 2 次実行時間が発生するため、すべての変更に対してではなく、アーカイブ ファイルの処理が完了したときに 1 回だけ呼び出すようにしてください。

改善点:

  • パフォーマンスを向上させるために、単なるworkingArchiveaTFileではなく aを作成します。File
  • dir.mkdir()inへの呼び出しを削除しますimportApkFiles()。アーカイブ ファイル内では不要であり、余分なアーカイブ エントリが作成されます。
于 2012-08-23T05:42:19.140 に答える