Wie kann ich Spring Boot mitteilen, welche Hauptklasse für das ausführbare JAR verwendet werden soll?

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

Mein Projekt hat mehr als eine Klasse mit einer mainMethode. Wie sage ich dem Spring Boot Maven-Plugin, welche der Klassen es als Hauptklasse verwenden soll?

Thilo
quelle
1
java -cp myjar.jar MyClass
Evgeni Dimitrov
4
@ Evgeni: Das ist eine Laufzeitflagge. So weit kommt es nicht. Es kann nicht erstellt werden.
Thilo

Antworten:

268

Fügen Sie Ihre Startklasse in Ihren Pom ein:

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

oder

<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>
ludo_rj
quelle
Sie müssen nichts deaktivieren. Oder fehlt mir etwas?
Dave Syer
29
Beachten Sie, dass diese Antwort korrekt ist, wenn Sie den Spring-Boot-Starter-Parent-Pom verwenden. In diesem Fall wird die Eigenschaft "start-class" auf den Konfigurationsparameter "mainClass" des Spring-Boot-Maven-Plugins angewendet (was Sie direkt tun können, wenn Sie den Starter nicht verwenden).
Dave Syer
18
Vielen Dank an @ludo_rj, und ich fand, dass dies auch funktioniert: mvn clean package -Dstart-class=com.foo.ApplicationWenn Sie dynamisch angeben möchten, mit welcher Hauptklasse
zhuguowei
2
Eine weitere Sache, die hinzugefügt werden muss: Der von @zhuguowei erwähnte Parameter gilt auch für das Spring Boot Maven Plugin : mvn spring-boot:run -Dstart-class=com.foo.Application. Dies ist nur gültig, wenn Sie die Hauptklasse nicht im Plugin des Poms angegeben haben
Gerardo Roza
Beides hat bei mir nicht funktioniert. Ich dachte auch, es sei ein "UND", kein oder? Ich sehe die Start-Klasse: korrekt in MANIFEST.MF, aber der Frühling startet eine andere mit Anmerkungen versehene @ SpringBootApplication-Hauptklasse. Ich brauche diese Klasse tatsächlich, um einige Dinge zu booten, damit ich die Annotation nicht wirklich gerne ändere. Das einfache Entfernen funktionierte sowieso nicht. Der Frühling scheint das erste main () zu starten, das er findet. Ich verwende Spring-Boot-Starter-Parent 2.2.0.M3.
Angel O'Sphere
129

Für diejenigen, die Gradle (anstelle von Maven) verwenden:

springBoot {
    mainClass = "com.example.Main"
}
Marcelo C.
quelle
2
Spring Boot 2.x gibt einen Fehler aus Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension.
Thunderforge
Die Antwort ist unten auf dieser Seite: stackoverflow.com/a/49716696/75672
Vitalik
70

Wenn Sie den Spring-Boot-Starter-Parent-Pom NICHT verwenden, lesen Sie die Spring-Dokumentation :

<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>
Renaud
quelle
Hauptklasse Konfiguration kann weggelassen werden
Zhaozhi
@zhaozhi kannst du erklären warum / wie?
Renaud
19

Für diejenigen, die Gradle (anstelle von Maven) verwenden, wird hier verwiesen :

Die Hauptklasse kann auch explizit mithilfe der mainClassName-Eigenschaft der Task konfiguriert werden:

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

Alternativ kann der Hauptklassenname projektweit mithilfe der Eigenschaft mainClassName des Spring Boot DSL konfiguriert werden:

springBoot {
    mainClassName = 'com.example.ExampleApplication'
}
Shane Lu
quelle
15

Wenn Sie Spring-Boot-Starter-Parent in Ihrem Pom verwenden, fügen Sie Ihrem Pom einfach Folgendes hinzu:

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

Dann machen Sie Ihr MVN-Paket.

Siehe diese Spring Docs-Seite .

Ein sehr wichtiger Aspekt hierbei ist zu erwähnen, dass die Verzeichnisstruktur src / main / java / nameofyourpackage sein muss

Mojave
quelle
Ich habe festgestellt, dass diese Lösung funktioniert, ohne die Datei pom.xml zu ändern, nachdem ich die Paketanforderungen für die Java-Klassen repliziert habe.
6

Ich habe den folgenden Code in pom.xml ausprobiert und es hat bei mir funktioniert

<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>

TRIDIB BOSE
quelle
Ich habe versucht, die Spring-Boot-Maven-Plugin-Konfiguration zu verwenden, die Sie in meinem Multimodule-Maven-Projekt erwähnt haben, das aus mehreren Spring-Boot-Projekten besteht und Spring Boot als Stücklistenabhängigkeit enthält, und es hat wie ein Zauber funktioniert. In Bezug auf das Maven-Compiler-Plugin habe ich nichts angegeben, da ich nicht möchte, dass meine POM-Plattform abhängig ist. Maven gabelte sich automatisch, daher kann man diese Konfiguration einfach ignorieren.
Cheloute
4

Seit Spring Boot 1.5 können Sie das fehleranfällige Zeichenfolgenliteral in pom oder build.gradle vollständig ignorieren. Das Repackaging-Tool (über das Maven- oder Gradle-Plugin) wählt das mit Anmerkungen versehene @SpringBootApplicationfür Sie aus. (Weitere Informationen finden Sie in diesem Problem: https://github.com/spring-projects/spring-boot/issues/6496 )

tan9
quelle
3

Ich hatte mein Projekt umbenannt und es fand immer noch die alte ApplicationKlasse auf dem Erstellungspfad. Ich habe es im 'Build'-Ordner entfernt und alles war in Ordnung.

Anthony De Smet
quelle
1

Habe dieses Problem mit Java 1.9 und SpringBoot 1.5.x gesehen, wenn die Hauptklasse nicht explizit angegeben ist.

Mit Java 1.8 kann es die Hauptklasse ohne explizite Eigenschaft finden und 'mvn package' funktioniert einwandfrei.

dy10
quelle