2016-12-05 34 views
1

自分自身のコピーを作成し、元のプロジェクトフォルダを削除するプログラムを作成しようとしています。自分自身を削除するJavaプログラム - 動作しない

(FYI:プロジェクトは、その中に、独自のJREを持っている) (FYI:このプログラムは、Windows上で動作)

ので:

が、私の主なmainメソッド以外に、それを行うことができるようにするにはこのクラスでは、SelfUpdaterという2番目のメインメソッドです。

私のメインスレッドの中で、プロジェクトを2番目のフォルダにコピーします。 次に、この2番目のプロジェクトフォルダ内でSelfUpdaterのメインメソッドを実行します。

これは、最初のjava.exeとはまったく関係ない新しいインスタンスを実行していることを意味します(system.exit )新しいインスタンスが始まるとすぐに)。

最初のフォルダを削除しようとすると、「古いclient.java.io.IOExceptionを削除しているエラー:ファイルを削除できません」というエラーが表示されます。 実際にはいくつかのファイルが削除されますが、Application.exeとlibフォルダは削除できません。

そのフォルダはWindowsでは開いていません。それは他の何かによって使用されていません。手動でファイルを削除することはできません(Windowsは使用中です)。 2番目のjava.exeが終了するとすぐに削除することができます。

私は総作業例を与えることはできませんが、しかし、私の私のメインスレッドで、私はこの次のメソッドを呼び出します。

public static void selfUpdate() { 

    try { 
     String separator = System.getProperty("file.separator"); 
     String classpath = System.getProperty("java.class.path"); 
     String rootPath = System.getProperty("user.dir"); 

     String path = null; 

     File parentFolder = null; 
     File originalClientFolder = new File(rootPath); 
     parentFolder = originalClientFolder.getParentFile(); 

     File secondClientFolder = new File(parentFolder.getAbsolutePath() + separator + "runLAST"); 
     FileUtils.copyDirectory(originalClientFolder, secondClientFolder); 

     path = secondClientFolder.getAbsolutePath() + separator + "jre8" + separator + "bin" + separator + "java"; 

     ProcessBuilder processBuilder = new ProcessBuilder(path, "-cp", classpath, SelfUpdater.class.getName(), downloadURL, rootPath);    
     processBuilder.directory(secondClientFolder); 
     processBuilder.start(); 

     System.exit(0); 

    } catch (Exception ex) { 

    } 
} 

そして、私のSelfUpdaterクラスのメインは、次のとおりです。

Appearently
public static void main(String[] args) { 
    try {     
     String originalClientFolderPath = args[1]; 
     // 
     File oldClientFolder = new File(originalClientFolderPath); 

     System.out.println("Deleting old client recursively. Folder: " + oldClientFolder.getAbsolutePath()); 
     try { 
      FileUtils.deleteDirectory(oldClientFolder); 
     } catch (Exception ex) {     
     } 
    } 
} 
+1

行動と許可されているオペレーティングシステムに依存します。関連するオペレーティングシステムにタグを追加するか(または多数ある場合は質問を更新してください)。 –

+2

Windowsでは、開いているファイルを削除できません。新しいインスタンスは古いexeが終了するまで古いフォルダを削除することができません。 Linux/Unixでは、このような制限はありません(しかし、他の考慮事項があるかもしれません)。 –

+0

@KlasLindbäckありがとうございました。プロジェクトはウィンドウのみです。私が記事で述べたように、私はSystem.exit(0)を呼び出すので、元のexeは終了します。しかし、新しいjava.exeは古いフォルダを削除することはできません。 (たとえ私がかなり長い間Thread.sleep()で待っていても)私は2番目のjavaが何とか元のものにまだ接続されていると思います。 –

答えて

1

クラスパスを変更するのを忘れてしまった。

私は質問を残すことを考えています。なぜなら、人々はそのようなコード部分を必要とするかもしれないからです。 は、しかし最後に、呼び出されています方法は、これに変更されます。ファイルの削除について

public static void selfUpdate() { 

    try { 
     String separator = System.getProperty("file.separator"); 
     String classpath = System.getProperty("java.class.path"); 
     String rootPath = System.getProperty("user.dir"); 

     String path = null; 

     File parentFolder = null; 
     File originalClientFolder = new File(rootPath); 
     parentFolder = originalClientFolder.getParentFile(); 

     File secondClientFolder = new File(parentFolder.getAbsolutePath() + separator + "runLAST"); 
     FileUtils.copyDirectory(originalClientFolder, secondClientFolder); 

     // ADDED: -------------------------------------------------------- 
     String origialClientFolderName = originalClientFolder.getName(); 
     classpath = classpath.replace(origialClientFolderName, "runLAST"); 
     // --------------------------------------------------------------- 

     path = secondClientFolder.getAbsolutePath() + separator + "jre8" + separator + "bin" + separator + "java"; 

     ProcessBuilder processBuilder = new ProcessBuilder(path, "-cp", classpath, SelfUpdater.class.getName(), downloadURL, rootPath);    
     processBuilder.directory(secondClientFolder); 
     processBuilder.start(); 

     System.exit(0); 

    } catch (Exception ex) { 

    } 
} 
関連する問題