2016-05-07 5 views
0

Kann mir jemand einen Weg dafür in Java geben?Wie kann ich meine visuelle Java-Anwendung in ein benutzerdefiniertes Verzeichnis kopieren?

Ich kenne die Schritte:

  1. die JAR-Datei Ausführungsverzeichnis Erhalten Sie für die .jar-Pfad zu erhalten.
  2. Kopieren Sie diese .jar (mit dem erhaltenen Pfad) in ein benutzerdefiniertes Verzeichnis.

Was ich will, ist Beispielcodes dafür. Andere Beiträge hier über den Schritt # 1 sind für mich in gewisser Weise verwirrend, weil sie sich auf ein Klassenverzeichnis beziehen, aber mein Ziel ist es, den vollständigen und spezifischen Pfad zur .jar-Datei zu erhalten, die zum Kopieren ausgeführt wird; und spricht auch über Sicherheitsbedenken, die ich nicht sehr gut verstehe. Auch die Metoth in Java zum Kopieren von Dateien sind mir nicht klar. Dazu fordere ich Codebeispiele an.

Auch gibt es eine Möglichkeit für all diesen Prozess, wenn die .jar-Datei in eine EXE-Datei verpackt ist? Einige Kommentare in anderen Post sagte "Fast unmöglich", aber aus welchem ​​Grund ist es unmöglich? Und, ist das wirklich unmöglich?

Antwort

1

Bitte beachten Sie, dass es wichtig ist, dass die Klasse (YourMainClass Referenz im Code), die den folgenden Code ausgeführt wurde aus der JAR-Datei geladen wird, die Sie kopieren möchten:

String jarFilePath = YourMainClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath(); 

Wie Sie bekommen jar-Datei-Pfad, können Sie in ein Verzeichnis copy it:

import static java.nio.file.StandardCopyOption.*; 

Files.copy(source, target, REPLACE_EXISTING); 

UPDATE

Um das Illegal char <:> at index 2: Problem, berichtet in den Kommentaren, statt FileSystems.getDefault().getPath() Aufruf Verwendung java.io.File Klasse zu erhalten Path Objekt über toPath() Verfahren zu vermeiden.

Ich habe den Code aktualisiert und den Zielordnerpfad vom Code zum Anwendungsargument verschoben.

Der vollständige Code ist unten:

import java.io.File; 
import java.io.IOException; 
import static java.nio.file.StandardCopyOption.*; 
import java.net.URISyntaxException; 
import java.nio.file.Files; 
import java.nio.file.Path; 

public class JarFileCopyTester { 

    public static void main(String[] args) throws URISyntaxException, IOException { 

     // checking for mandatory application argument 
     if (args.length != 1) { 
      System.out.println("Usage:\njava -jar JarFileCopyTester.jar <targetFolderPath>"); 
      System.exit(0); 
     } 

     // the destination folder path, without filename 
     String destinationFolderPath = args[0]; 
     if (!destinationFolderPath.endsWith(File.separator)) { 
      destinationFolderPath = destinationFolderPath + File.separator; 
     } 

     // getting the running jar file path  
     String jarFilePath = JarFileCopyTester.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath(); 

     // getting Path object related to the jarFilePath 
     Path sourcePath = (new File(jarFilePath)).toPath(); 

     System.out.println("sourcePath: " + sourcePath); 

     // getting jar file name only, to compose dest file path 
     Path jarFileNameOnly = sourcePath.getFileName(); 

     // adding filename to the destination folder path 
     String destinationFilePath = destinationFolderPath + jarFileNameOnly.toString(); 

     // composing the Path object for the destination file path 
     Path destPath =(new File(destinationFilePath)).toPath(); 

     System.out.println("destination path: " + destPath); 

     // copying the file 
     Files.copy(sourcePath, destPath, REPLACE_EXISTING); 
    } 
} 

die JAR-Datei ausführen, rufen Sie den Befehl:

Fenster:

java -jar JarFileCopyTester.jar c:\myFolder1\myFolder2 

Linux:

java -jar JarFileCopyTester.jar /home/username/ 
+0

Einige Beiträge Verweisen Sie, dass 'toURI()' Probleme verursachen kann, wenn es gibt nicht englische Zeichen, die in den Pfad involviert sind. Wie kann ich mit dieser Situation umgehen? – FiroKun

+0

@FiroKun nur mit einem Ordner mit russischen Namen überprüft, funktioniert der Code in Ordnung (Ubuntu Linux, Java 1.8.0_77). Hast du Probleme mit diesem Code? –

+0

@FiroKun überprüfen Sie dieses Bild: http://i.imgur.com/5EzFQNm.jpg Ich habe einen Ordner 'тестовая папка' (bedeutet' Testordner') erstellt und diesen Code in diesem Ordner ausgeführt. Alles hat gut funktioniert. –