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?


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>

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

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>

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

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


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>


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 )


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.