2009-08-09 6 views
1

J'ai récemment créé une application et l'ai mise en garde contre c: /my/folder/app.jar. Il fonctionne comme un charme dans le cas suivant [Démarrage # 1]:Pourquoi est-ce que je ne peux pas accéder à un fichier dans mon pot sauf si je suis dans le dossier avec le pot quand je l'exécute?

  • Ouvrir cmd
  • cd c:/mon/dossier
  • java jar app.jar

Mais quand je fais ça, ça ne fonctionne pas [# Startup 2]:

  • Ouvrir cmd
  • cd c:/ma/
  • java jar dossier/app.jar

Parce que app.jar contient un fichier .exe que je tente d'exécuter dans mon application:

final Process p = Runtime.getRuntime().exec("rybka.exe");

Il ne fonctionnera pas exemple 2 car il ne trouve pas le fichier rybka.exe.

Des suggestions?

Répondre

1

Si le fichier jar sera toujours dans ce répertoire, vous pouvez utiliser un chemin complet /my/folder/rybka.exe. Si ce n'est pas le cas, vous pouvez utiliser getClass().getProtectionDomain().getCodeSource().getLocation() pour trouver l'emplacement du pot et préfixer cela sur rybka.exe.

+0

Est-ce que cela fonctionne si le fichier .ex? –

+0

ça ne marchera pas si l'exe est dans le bocal Brian – Survivor

1

Essayez l'extraction de l'exe à

System.getProperty("java.io.tmpdir")); 

puis exécutez-le à partir de cet endroit aussi devrait fonctionner chaque fois.

Paul

4

Quelque chose comme ceci est un meilleur moyen d'avancer. Copiez l'exe hors du pot à un emplacement temporaire et exécutez-le à partir de là. Votre jar sera alors également exécutable via webstart et ainsi de suite:

InputStream src = MyClass.class.getResource("rybka.exe").openStream(); 
File exeTempFile = File.createTempFile("rybka", ".exe"); 
FileOutputStream out = new FileOutputStream(exeTempFile); 
byte[] temp = new byte[32768]; 
int rc; 
while((rc = src.read(temp)) > 0) 
    out.write(temp, 0, rc); 
src.close(); 
out.close(); 
exeTempFile.deleteOnExit(); 
Runtime.getRuntime().exec(exeTempFile.toString()); 
Questions connexes