Come faccio a dire a Spring Boot quale classe principale usare per il vaso eseguibile?


182
Execution default of goal 
org.springframework.boot:spring-boot-maven-plugin:1.0.1.RELEASE:repackage 
failed: 
Unable to find a single main class from the following candidates

Il mio progetto ha più di una classe con un mainmetodo. Come faccio a dire al plugin Spring Boot Maven quale delle classi dovrebbe usare come classe principale?


1
java -cp myjar.jar MyClass
Evgeni Dimitrov

4
@Evgeni: è un flag di runtime. Non arriva così lontano. Non riesce a costruire.
Thilo,

Risposte:


268

Aggiungi la tua classe iniziale nel tuo pom:

<properties>
    <!-- The main class to start by executing java -jar -->
    <start-class>com.mycorp.starter.HelloWorldApplication</start-class>
</properties>

o

<build>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>             
        <configuration>    
            <mainClass>com.mycorp.starter.HelloWorldApplication</mainClass>
        </configuration>
    </plugin>
</plugins>
</build>

Non è necessario disabilitare nulla. Oppure mi sfugge qualcosa?
Dave Syer,

29
Nota che questa risposta è corretta se usi il pom spring-boot-starter-parent. In tal caso, la proprietà "start-class" viene applicata al parametro di configurazione "mainClass" del plug-in spring-boot-maven (che è possibile eseguire direttamente se non si utilizza lo starter).
Dave Syer,

18
Grazie @ludo_rj, e ho scoperto che funziona anche:, mvn clean package -Dstart-class=com.foo.Applicationse vuoi specificare in modo dinamico usando quale classe principale
zhuguowei,

2
Una cosa da aggiungere, il parametro di cui parla @zhuguowei è valida anche per il Maven Plugin Primavera Boot: mvn spring-boot:run -Dstart-class=com.foo.Application. Questo è valido solo se non hai specificato mainClass nel plugin del pom
Gerardo Roza

Entrambi non hanno funzionato per me. Ho anche pensato che fosse un "AND" non un o? Vedo la Start-Class: correttamente in MANIFEST.MF, ma la primavera inizia una diversa classe principale annotata @SpringBootApplication. In realtà ho bisogno di quella classe per l'avvio di alcune cose, quindi non mi piace molto cambiare l'annotazione. La semplice rimozione non ha funzionato comunque. La primavera sembra iniziare il primo main () che trova. Sto usando spring-boot-starter-parent 2.2.0.M3.
Angel O'Sphere,


70

Se NON usi il pom spring-boot-starter-parent, quindi dalla documentazione Spring :

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.1.3.RELEASE</version>
    <configuration>
        <mainClass>my.package.MyStartClass</mainClass>
        <layout>ZIP</layout>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

la configurazione della classe principale può essere omessa
zhaozhi

@zhaozhi potresti spiegare perché / come?
Renaud,

19

Per coloro che utilizzano Gradle (anziché Maven), facendo riferimento qui :

La classe principale può anche essere configurata esplicitamente usando la proprietà mainClassName dell'attività:

bootJar {
    mainClassName = 'com.example.ExampleApplication'
}

In alternativa, il nome della classe principale può essere configurato a livello di progetto usando la proprietà mainClassName del DSL Spring Boot:

springBoot {
    mainClassName = 'com.example.ExampleApplication'
}

15

Se stai usando spring-boot-starter-parent nel tuo pom, aggiungi semplicemente quanto segue al tuo pom:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Quindi fai il tuo pacchetto mvn.

Vedi questa pagina dei documenti di primavera .

Un aspetto molto importante qui è menzionare che la struttura delle directory deve essere src / main / java / nameofyourpackage


Ho trovato questa soluzione funzionante senza modificare pom.xml dopo aver replicato i requisiti del pacchetto per le classi .java.

6

Ho provato il seguente codice in pom.xml e ha funzionato per me

<build>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <mainClass>myPackage.HelloWorld</mainClass> 
        </configuration>
    </plugin>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <fork>true</fork>
            <executable>D:\jdk1.8\bin\javaw.exe</executable>
        </configuration>
    </plugin>
</plugins>


Ho cercato di utilizzare la configurazione del plug-in spring-boot-maven di cui hai parlato nel mio progetto maven multimodulo, composto da diversi progetti di avvio di Spring e incluso Spring Boot come dipendenza BOM, e ha funzionato come un fascino. Per quanto riguarda il plugin compilatore maven, non ho specificato nulla in quanto non voglio che la mia piattaforma POM dipenda. Maven si biforca automaticamente, quindi penso che tu possa semplicemente ignorare questa configurazione.
Cheloute,

4

Da Spring Boot 1.5, puoi completare ignorare la stringa soggetta a errori letterale in pom o build.gradle. Lo strumento di riconfezionamento (tramite maven o plugin gradle) sceglierà quello annotato @SpringBootApplicationper te. (Fare riferimento a questo numero per i dettagli: https://github.com/spring-projects/spring-boot/issues/6496 )


3

Avevo rinominato il mio progetto e stava ancora trovando la vecchia Applicationclasse nel percorso di compilazione. L'ho rimosso nella cartella 'build' e tutto andava bene.


1

Ho riscontrato questo problema con Java 1.9 e SpringBoot 1.5.x, quando la classe principale non è specificata in modo esplicito.

Con Java 1.8, è in grado di trovare la classe principale senza proprietà esplicite e il 'pacchetto mvn' funziona bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.