2013-09-22 4 views
1

SBT complètera, mais pas exécuter ce projet très simple. Pourquoi pas?Pourquoi SBT ne détecte-t-il pas la classe principale en Java? (Aucune classe principale détectée)

[email protected]:~/tmp/javahello$ sbt --version                  
sbt launcher version 0.12.1                        
[email protected]:~/tmp/javahello$ find .                    
.                              
./src                             
./src/main                            
./src/main/java                           
./src/main/java/learn                         
./src/main/java/learn/HelloWorld.java                     
[email protected]:~/tmp/javahello$ cat src/main/java/learn/HelloWorld.java            
package learn;                           

class HelloWorld {                          
    public static void main(String[] args) {                   
     System.out.println("Hello, world");                    
    }                             
}                              
[email protected]:~/tmp/learn/javahello$ sbt run                  
[info] Set current project to default-1004d5 (in build file:/home/mackler/tmp/javahello/)        
[info] Updating {file:/home/mackler/tmp/javahello/}default-1004d5...             
[info] Resolving org.scala-lang#scala-library;2.9.2 ...                 
[info] Done updating.                         
[info] Compiling 1 Java source to /home/mackler/tmp/javahello/target/scala-2.9.2/classes...        
java.lang.RuntimeException: No main class detected.                  
at scala.sys.package$.error(package.scala:27)                   
[trace] Stack trace suppressed: run last compile:run for the full output.            
[error] (compile:run) No main class detected.                   
[error] Total time: 4 s, completed Sep 22, 2013 4:14:21 PM                
[email protected]:~/tmp/javahello$         

Répondre

2

Votre déclaration de la classe doit être publique, sinon SBT (et java) ne peuvent pas le voir:

package learn;                           

public class HelloWorld {      // added public here 
    public static void main(String[] args) {                   
     System.out.println("Hello, world");                    
    }                             
}   

Cela fonctionne.

> run 
[info] Running learn.HelloWorld 
Hello, world 

EDIT: En fait, la classe n'a pas besoin d'être public pour Java fonctionne, ce bogue dans SBT, comme le souligne Délimiter.

+0

Fascinant; Je vous remercie. Je l'ai copié dès la première partie du livre de Gosling. Il fonctionne comme initialement posté en utilisant 'javac' et' java' mais je suppose qu'il devrait mettre à jour le livre pour refléter SBT. –

+0

Si 'java' l'accepte mais que' sbt' ne l'accepte pas, c'est un bug dans sbt. S'il vous plaît ouvrir un problème. –

+0

C'est bizarre. J'ai supposé que ça ne marcherait pas aussi bien en Java, mais c'est le cas. –

1

Je viens de rencontrer un problème similaire.

Il était en cours de compilation et aucune classe principale n'a été détectée lors de l'exécution.

Le problème était que je compilateur de Java 1.6 et Java 1.7 comme moteur d'exécution, vérifier les versions du compilateur et exécution: javac -version et java -version pointent maintenant à la même version et son ok.

Bonne chance!

+0

Similaires mais différents. Le problème que j'ai observé [aurait été corrigé] (https://github.com/sbt/sbt/issues/883), bien que je ne l'ai pas confirmé moi-même. –

Questions connexes