J'ai eu du code qui a couru des commandes à travers Runtime.getRuntime.exec (String), et cela a fonctionné sur Windows. Quand j'ai déplacé le code vers Linux, il s'est cassé, et la seule façon de le réparer était de passer à la version exec (String []). Si je laisse les choses de cette façon, le code fonctionnera-t-il de la même manière sous Windows et Linux, ou devrais-je utiliser exec (String) sous Windows et exec (String []) sous Linux?Est-ce que java Runtime.exec (String []) est indépendant de la plateforme?
Répondre
Utilisez Chaîne [] sur les deux.
La réponse I gave you before était le résultat de plusieurs heures de débogage d'un logiciel de production fonctionnant sous Windows.
Après beaucoup d'efforts que nous (I) est venu à la solution affichée avant (utiliser String [])
Depuis les problèmes que vous avez été sur Linux, je suppose que l'aide du tableau sur les deux seront sois le meilleur.
BTW. J'ai essayé cette méthode avec Java 1.4, Depuis lors une nouvelle classe est disponible: ProcessBuilder ajouté sur Java1.5. Je ne suis pas sûr de savoir de quoi il s'agit, mais il devrait y avoir une bonne raison à cela.Jetez un coup d'oeil et lisez quelle est la différence entre un Runtime.exec. Probablement ce sera une meilleure option.
Enfin, certaines commandes ne fonctionnera pas sur deux plates-formes, car ils sont construits avec la coque (soit cmd Windows ou bash/sh/etc) tels que dir ou écho et certains de ceux-ci. Je recommande donc de faire un test supplémentaire/supplémentaire sur chaque plate-forme cible et d'ajouter des gestionnaires d'exceptions pour les commandes non supportées.
:)
du [api] [1]
Ce procédé vérifie que cmdarray est une commande de système d'exploitation valable . Les commandes qui sont valides sont dépendantes du système , mais au minimum , la commande doit être une liste non vide de chaînes non nulles .
Alors oui, cela dépend du système. BTW, pourriez-vous poster le code pertinent, afin que nous puissions voir ce que vous êtes (finalement) mal?
[1]: http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang.String[], java.lang.String [], java.io.File)
Nice, dans l'aperçu le lien n'est pas cassé! – akappa
D'accord, je donne: Quelle commande non-trivial vous pouvez passer à exec() et attendre à obtenir des résultats raisonnables sur Windows et Linux? Demander si exec() est indépendant de la plate-forme semble manquer tout le point de exec(), qui est d'invoquer un comportement spécifique à la plate-forme.
Pour répondre réellement à votre question, oui - la manière dont la chaîne de commande est interprétée sera différente sur différentes plateformes (et potentiellement, pour différents shells, sur Linux), et l'utilisation de la version String [] est plus susceptible de se terminer avec les paramètres se passant correctement.
J'essayais d'exécuter javac pour tous les fichiers .java dans un projet, et incluais aussi les dépendances jar. – Geo
Ahh, j'aurais dû deviner - exécuter des commandes JDK est une chose raisonnable à faire depuis une application Java. –
@Mark. Pas vraiment ça. Les arguments des deux côtés sont différents, comme chemin/et séparateur de chemin: vs; Drives etc .. donc les commandes ne seront pas vraiment wok de manière transparente d'une plate-forme à l'autre. – OscarRyz
Le Tokeniser par défaut pour diviser le paramètre exec (String) en String [] les sépare simplement par le caractère espace. Il n'interprète pas les guillemets comme une commande shell entrée manuellement, vous devriez donc appeler la version String []. Mais si vous utilisez Sun JDK sur les deux plates-formes, le comportement devrait être similaire. Cependant, comme Windows fournit différentes commandes shell comme les autres systèmes d'exploitation (par exemple, copie au lieu de cp), vos commandes peuvent ne pas fonctionner sur toutes les plates-formes. Exec() appelle des commandes natives sur le système d'exploitation sous-jacent
Les commandes conçues pour Windows ne fonctionneront pas sous Linux et devront être réécrites.
La différence entre la la méthode exec() qui prend une seule chaîne, et celui qui accepte un tableau est que la version de tableau vous permet de spécifier la façon dont doivent être la commande et ses arguments rompu (c'est-à-dire correctement). Lorsque vous utilisez la ou les méthodes qui n'acceptent qu'une chaîne, la méthode la divise en un tableau sur un espace. Le traitement à partir de ce moment est traité de la même manière pour les deux méthodes.
Il s'agit du code de la classe Runtime qui montre comment il casse une chaîne unique en un tableau puis appelle String [] version pour continuer le traitement. Donc la méthode qui accepte une chaîne ne fonctionnera pas si la rupture de la commande sur whitspace ne sépare pas correctement la commande et les arguments.
Si vous souhaitez exécuter différentes commandes sous Windows et Linux, vous pouvez savoir sur quel système d'exploitation est en cours d'exécution en utilisant quelque chose comme ce qui suit:
String os = System.getProperty("os.name").toLowerCase();
if (os.indexOf("win") >= 0) {
// Windows Commands
} else {
// Linux Commands
}
Une autre bonne chose serait de vous écrire êtes commandes dans un script (.bat pour Windows et .sh pour Linux) et appelez ces scripts à la place.
- 1. La plateforme WCF est-elle indépendante?
- 2. en utilisant Runtime.exec() en Java
- 3. La syntaxe correcte pour l'utilisation Runtime.exec avec « Program Files »
- 4. Est-ce que WeakReference fonctionne avec String?
- 5. Japonais String en Java
- 6. J'ai besoin d'une version indépendante de la plateforme de CharToOem. Est-ce que Boost en a?
- 7. Portage des applications Java sur la plateforme Android
- 8. Est-ce que Silverlight 2.0 est une plateforme de développement de jeu viable?
- 9. Null \ u0000 dans Java String?
- 10. Le travail d'Hudson se bloque à Runtime.exec
- 11. Runtime.exec() avec le répertoire absolu
- 12. Comment convertir une collection Groovy String en Java String Array?
- 13. HtmlTextWriter to String - Est-ce que je regarde quelque chose?
- 14. Est-ce que solr fait une facette sur String vide?
- 15. Java: Est-ce que SelectionKey.attach() est cassé?
- 16. Java Servlets: String null ou "null"
- 17. Java isEmpty() non défini pour String?
- 18. SQL Server Management Studio en tant que plateforme d'applications
- 19. Rendre le langage XSLT indépendant
- 20. Quelle est la définition «principale» de la plateforme multiplate-forme préférée? Utilisation de boost :: options_programme?
- 21. Configuration de l'application multi-plateforme
- 22. de Split String - la manière cartésienne
- 23. Consommation d'un service Web avec la plateforme NetBeans
- 24. Existe-t-il un moyen indépendant de la plate-forme (Java?) Pour lire la table des matières d'un CD audio?
- 25. exécutable multi-plateforme/méthode de livraison d'exécution
- 26. Contrôle RTF multi-plateforme?
- 27. Est-ce que Jython peut remplacer Java?
- 28. Que se passe-t-il avec la classe Java de Java? Est-ce un bug connu?
- 29. Vérifier que Java est présent avant l'installation
- 30. Est-ce que Java passe par référence?
Cela a fonctionné sur les deux systèmes d'exploitation. Merci. – Geo