2010-09-12 2 views
3

Un de mes programmes (écrit en Scala 2.8) fonctionne correctement lorsqu'il est lancé au moyen de l'EDI NetBeans. Mais quand j'essaie de l'exécuter de l'extérieur, avec "java- jar", il dit "Exception dans le fil" principal "java.lang.NoClassDefFoundError: scala/ScalaObject ...". Mettre toutes les bibliothèques, incl. Le runtime Scala dans le même répertoire que le jar à lancer n'aide pas. Si j'essaye d'exécuter le pot avec scala lui-même, il se plaint qu'il ne peut pas le décoder comme utf-8 (il attend une source de scala plutôt qu'un pot, je suppose). Alors, comment puis-je exécuter une application Scala? MISE À JOUR: Pour ceux qui viennent ici plus tard ayant la même question, je vous recommande de lire les commentaires sous la réponse de Barjak (y compris ceux les plus récents cachés), la réponse est là. VonC donne également des liens intéressants sur le sujet.Comment exécuter un fichier d'application Scala construit par NetBeans à partir d'une ligne de commande en dehors d'IDE?

+0

Voir http://stackoverflow.com/questions/809138/creating-a-jar-file-from-a-scala-file –

+0

@ alexey-romanov, j'ai commencé à partir de là, ça n'a pas aidé. Je ne connais rien aux manifestes, j'utilise NetBeans IDE (qui utilise lui-même Ant) et je m'en sers pour construire. – Ivan

Répondre

4

Le -jar et -classpath de la commande java sont mutuellement exclusifs: vous ne pouvez pas faire java -jar YourScalaProg.jar -classpath scala-library.jar

Si vous voulez exécuter votre application avec java -jar, le chemin de classe complet doit être spécifié dans la section Class-Path de ce pot manifeste.

Vous pouvez exécuter votre application en utilisant seulement -classpath, comme cela: java -classpath YourScalaProg.jar:scala-library.jar your.package.MainClass.

+0

Dit "... Java.lang.ClassNotFoundException: Main ...". Ma classe principale (objet) est Main. – Ivan

+0

Avez-vous utilisé le nom canonique de la classe? Le nom canonique est le nom de la classe précédée du nom du paquet: 'org.blah.Main'. En outre, en fonction de votre système d'exploitation, vous devez utiliser ':' ou ';' comme séparateur de chemin de classe. – barjak

+0

Il semble que mon i686 Arch Linux utilise ':' (en utilisant ';', cela conduit à l'aide de java à être imprimée). en utilisant le nom de la classe principale canonique n'a pas aidé. – Ivan

3

Utilisez-vous scala-library.jar comme décrit dans Adventures with Scala blog?

java -classpath scala-library.jar:. YourClass 

ou:

java -classpath scala-library.jar:yourApp.jar YourClass 

Où est YourClass était votre scalac code compilé Scala.

Vous trouverez le même scala-library.jar utilisé dans la question SO "Creating a jar file from a Scala file" (ou dans le blog "the not so elegant way of creating an executable jar from scala code").

+0

La classe principale (objet) de l'application est "Main" avec la fonction "principale". Le projet est "Foobar". Les lignes que vous avez données ne fonctionnent ni avec "Main", ni "main", ni "Foobar" ni "foobar" pour "YourClass". – Ivan

+0

J'ai réussi. La solution consistait à lister toutes les librairies utilisées dans classpath. Mais ne puis-je pas simplement pointer vers un répertoire (contenant plus de bocaux que nécessaire, y compris les bocaux source et doc)? – Ivan

Questions connexes