2009-03-01 15 views
18

Ich führe eine Exe durch mein Java-Programm. Der Pfad ist in Java fest codiert.ausführen exe, die in Glas verpackt ist

Ich habe meine exe im Glas verpackt.

Aber ich bin fest, wie ich den Pfadnamen hardcoded in der Java-Datei haben. so kann ich mein Glas nicht als eigenständiges Programm ausführen.

Irgendwelche Hinweise für die Verpackung solcher Glas, d. H. Mit einer Exe innerhalb und in der Lage zu führen Sie es als ein eigenständiges Programm?

Danke, Krisp

Antwort

30

Seltsamer habe ich heute Morgen einen ähnlichen Code schreiben ... Danke für mich drängen :-) getan zu bekommen

Dies wird die .exe in einer lokalen Datei auf der lokalen Festplatte extrahieren. Die Datei wird gelöscht, wenn das Java-Programm existiert.

Edit: Whoops, tatsächlich vergessen, die Datei kopieren ...

import java.io.Closeable; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.net.URL; 
import java.security.CodeSource; 
import java.security.ProtectionDomain; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipException; 
import java.util.zip.ZipFile; 

public class Main 
{ 
    public static void main(final String[] args) 
     throws URISyntaxException, 
       ZipException, 
       IOException 
    { 
     final URI uri; 
     final URI exe; 

     uri = getJarURI(); 
     exe = getFile(uri, "Main.class"); 
     System.out.println(exe); 
    } 

    private static URI getJarURI() 
     throws URISyntaxException 
    { 
     final ProtectionDomain domain; 
     final CodeSource  source; 
     final URL    url; 
     final URI    uri; 

     domain = Main.class.getProtectionDomain(); 
     source = domain.getCodeSource(); 
     url = source.getLocation(); 
     uri = url.toURI(); 

     return (uri); 
    } 

    private static URI getFile(final URI where, 
           final String fileName) 
     throws ZipException, 
       IOException 
    { 
     final File location; 
     final URI fileURI; 

     location = new File(where); 

     // not in a JAR, just return the path on disk 
     if(location.isDirectory()) 
     { 
      fileURI = URI.create(where.toString() + fileName); 
     } 
     else 
     { 
      final ZipFile zipFile; 

      zipFile = new ZipFile(location); 

      try 
      { 
       fileURI = extract(zipFile, fileName); 
      } 
      finally 
      { 
       zipFile.close(); 
      } 
     } 

     return (fileURI); 
    } 

    private static URI extract(final ZipFile zipFile, 
           final String fileName) 
     throws IOException 
    { 
     final File   tempFile; 
     final ZipEntry  entry; 
     final InputStream zipStream; 
     OutputStream  fileStream; 

     tempFile = File.createTempFile(fileName, Long.toString(System.currentTimeMillis())); 
     tempFile.deleteOnExit(); 
     entry = zipFile.getEntry(fileName); 

     if(entry == null) 
     { 
      throw new FileNotFoundException("cannot find file: " + fileName + " in archive: " + zipFile.getName()); 
     } 

     zipStream = zipFile.getInputStream(entry); 
     fileStream = null; 

     try 
     { 
      final byte[] buf; 
      int   i; 

      fileStream = new FileOutputStream(tempFile); 
      buf  = new byte[1024]; 
      i   = 0; 

      while((i = zipStream.read(buf)) != -1) 
      { 
       fileStream.write(buf, 0, i); 
      } 
     } 
     finally 
     { 
      close(zipStream); 
      close(fileStream); 
     } 

     return (tempFile.toURI()); 
    } 

    private static void close(final Closeable stream) 
    { 
     if(stream != null) 
     { 
      try 
      { 
       stream.close(); 
      } 
      catch(final IOException ex) 
      { 
       ex.printStackTrace(); 
      } 
     } 
    } 
} 
+7

Vergessen Sie nicht, das ausführbare Flag zu setzen, sonst funktioniert Ihr Code nur unter Windows. – akuhn

+2

+1 zum Erstellen einer temporären Datei und zum Löschen beim Beenden markiert. – gencoreoperative

+0

Ich weiß, dass dies eine alte Frage ist, aber ich versuche Code mit Windows 7 zu verwenden, aber ich kann '.exe's nicht im Temp-Verzeichnis ausführen. Würde es zu schätzen wissen, wenn Sie meine Frage überprüfen könnten: http://stackoverflow.com/questions/18559835/access-denied-when-try-to-execute-a-exe-in-appdata – Andy

11

Das Betriebssystem über .jar-Datei nicht oder wissen schert, so dass Sie die .exe Datei an einem temporären Speicherort entpacken müssen, bevor Sie es ausführen.

+0

ich die Datei von Ressourcen in das Stammverzeichnis des Projekts kopiert mit der Methode D.Snap beschrieben und ich jetzt beziehe mich auf die Datei wie folgt: „File file = new File (“ your.exe“); ". So können Sie die Datei für das Schreiben in das Stammverzeichnis aus dem Ressourcenverzeichnis öffnen (wenn Sie ein Maven-Projekt verwenden): "InputStream is = getClass(). GetResource (" your.exe "). OpenStream();" – hipokito

-5

Sie könnten ein einfaches Java-Programm schreiben, um die exe mit Runtime.exec() zu starten. Sie könnten dann das "Main-Class" -Attribut des Jar als diese Launcher-Klasse festlegen. Benutzer könnten dann Ihr jar ausführen und es würde die exe laufen.

+0

In diesem Fall muss ich den exe-Pfad in Java-Code fest codieren. Ich möchte es tragbar machen. – krisp

+0

@ Krisp. Nicht wahr.Sie können Class/ClassLoader.getResource() verwenden, um einen relativen Pfad innerhalb des jar – Kevin

+0

zu finden, danke ..dies scheinen einige Hoffnungen..wird dies ausprobieren und Sie wissen lassen. – krisp

3

Während die anderen Benutzer die Frage richtig beantwortet haben, zu extrahieren und dann Bereinigung ausgeführt werden. Ein weiterer zu berücksichtigender Punkt ist, vollständig nativ zu sein.

Sie verwenden bereits eine native Binärdatei, um eine bestimmte Aufgabe zu erfüllen. Erstellen Sie auch ein natives Installationsprogramm, das Ihre Anwendung installiert, und installieren Sie die Binärdatei an dem für das Betriebssystem spezifischen Speicherort (Programme auf Win32) und erstellen Sie geeignete Verknüpfungen.

Auf diese Weise fühlt sich Ihre Anwendung nativer an und bedeutet, dass Sie keinen Code schreiben oder verwalten müssen, um diese Tatsache zu umgehen. Im Moment sieht das Jar wie ein plattformübergreifendes Stück Code aus (Jar läuft irgendwo richtig?), Aber packt eine native Binärdatei, die nicht überall läuft. Das fühlt sich wie ein Widerspruch an.

Für Installateure kann ich das Nullsoft Installation System (NSIS) empfehlen, da es viele hervorragende Tutorials und Codebeispiele zum Lernen gibt.

2

Verwenden

getClass().getResource(what).openStream() 

und in der Festplatte auf eine andere Datei kopieren.

3
//gets program.exe from inside the JAR file as an input stream 
InputStream is = getClass().getResource("program.exe").openStream(); 
//sets the output stream to a system folder 
OutputStream os = new FileOutputStream("program.exe"); 

//2048 here is just my preference 
byte[] b = new byte[2048]; 
int length; 

while ((length = is.read(b)) != -1) { 
    os.write(b, 0, length); 
} 

is.close(); 
os.close(); 
Verwandte Themen