2015-03-31 70 views
10

Sto utilizzando un programma Java Maven e non so cosa inserire come <mainClass>. Ho provato tutti i tipi di cose basate su numerousstackoverflow questions, ma non stanno risolvendo l'errore.Errore Maven: Impossibile trovare o caricare la classe principale

Ogni volta che dice:

Maven Error: Could not find or load main class ... 

ho scritto questo dentro la mia pom.xml (meno il ???)

<build> 
    ... 
    <plugins> 
    ... 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.5.3</version> 
     <configuration> 
      <descriptors> 
       <descriptor>src/main/assembly/jar-with-dependencies.xml</descriptor> 
      </descriptors> 
      <archive> 
       <manifest> 
        <mainClass> ??? </mainClass> 
       </manifest> 
      </archive> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 
    </plugin> 
    ... 
    </plugins> 
    ... 
    </build> 

Come posso risolvere questi errori?

+0

Si prega di mostrare il file pom completo. – khmarbaise

+0

Sembra che tu stia istruendo il tuo file pom.xml per impacchettare le tue dipendenze di terze parti nel tuo $ home/.m2/repository locale e poi crei il file jar nudo sotto la directory di destinazione, e poi esegui detto jar con 'java -jar yourfile.jar' e ottieni questo errore. L'errore ti sta dicendo esattamente cosa dovresti fare. O includi manualmente le dipendenze di terze parti nel classpath, o istruisci il file pom per includere tutte le tue dipendenze con il jar generato. In questo modo: http://stackoverflow.com/questions/1729054/including-dependencies-in-a-jar-with-maven –

risposta

1

La prima cosa che vorrei suggerire è utilizzare correct configuration for predefined descriptors.

<project> 
    [...] 
    <build> 
    [...] 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.5.3</version> 
     <configuration> 
      <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     [...] 
</project> 

Per configurare la classe principale è necessario conoscere il pacchetto e il nome della classe che si desidera utilizzare, che dovrebbe essere dato in <mainClass>...</mainClass> parametro.

Inoltre consiglio a stop using Maven 2 and move to Maven 3 instead.

5

A meno che non sia necessario il 'plug-assembly maven-assembly' per motivi diversi dall'impostazione della mainClass, è possibile utilizzare il plug-in "maven-jar-plugin".

 <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 
        <index>true</index> 
        <manifest> 
         <mainClass>your.package.yourprogram.YourMainClass</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
    </plugins> 

Si può vedere il plugin in pratica nel ATLauncher.

L'elemento 'mainClass' deve essere impostato alla classe che si ha il punto di ingresso al programma, ad esempio in:

package your.package.yourprogram; 

public class YourMainClass { 

    public static void main(String[] args) { 
     System.out.println("Hello World"); 
    } 
} 
5

ho ottenuto questo errore usando Maven, e ho scoperto la soluzione.

Error: Could not find or load main class com.mycompany.testapifactory.Main 

sto usando Java JDK versione 1.7 su Linux, il mio file pom.xml era il default generato da Netbeans e stavo usando questi comandi per compilare, che non funzionano bene con una normale applicazione Java ciao-mondo:

mvn clean compile 
java -jar target/TestAPIFactory-1.0-SNAPSHOT.jar com.mycompany.testapifactory.Main 

quello che è successo:

Si scopre il mio problema era che il mio metodo principale stava estendendo qualcosa di esotico come questo:

public class Main extends SomeExoticLibraryClass{ 
    public static void main(String[] args){ 
     //... 
    } 
} 

Era questa estensione della classe principale che ha causato l'errore di cui sopra.

soluzione TLDR:

Assicurarsi che la classe principale non sta estendendo tutte le classi 3rd party. Riforma quelli fuori e fuori nelle proprie classi. Quel messaggio di errore è terribile e richiede un processo di eliminazione per scoprire cosa fare.

+1

soluzione perfetta! –

1

Ho capito, la chiave era di cambiare la cartella di output da bin a target\classes.Sembra che in Eclipse, quando si converte un progetto in progetto Maven, questo passaggio non venga eseguito automaticamente, ma il progetto Maven non cercherà la classe principale basata su bin, ma su target\classes.

Problemi correlati