Jak powiedzieć Spring Boot, której głównej klasy użyć do słoika wykonywalnego?

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

Mój projekt ma więcej niż jedną klasę z mainmetodą. Jak powiedzieć wtyczce Spring Boot Maven, których klas powinien użyć jako klasy głównej?

Thilo
źródło
1
java -cp myjar.jar MyClass
Evgeni Dimitrov
4
@Evgeni: To flaga środowiska wykonawczego. Nie zaszło tak daleko. Nie można go zbudować.
Thilo

Odpowiedzi:

268

Dodaj swoją klasę początkową do swojej pom:

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

lub

<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
źródło
Nie musisz niczego wyłączać. A może coś mi brakuje?
Dave Syer
29
Zauważ, że ta odpowiedź jest poprawna, jeśli używasz pom-spring-boot-starter-parent-pom. W takim przypadku właściwość „klasa początkowa” jest stosowana do parametru konfiguracyjnego „mainClass” wtyczki Spring-boot-maven-plugin (co można zrobić bezpośrednio, jeśli nie używasz startera).
Dave Syer
18
Dzięki @ludo_rj, i stwierdziłem, że to też działa:, mvn clean package -Dstart-class=com.foo.Applicationjeśli chcesz dynamicznie określić za pomocą której klasy głównej
zhuguowei
2
I jeszcze jedno, aby dodać parametr wymienić @zhuguowei jest również ważne dla Wiosna Boot Maven Plugin: mvn spring-boot:run -Dstart-class=com.foo.Application. Jest to ważne tylko wtedy, gdy nie podałeś mainClass we wtyczce pom
Gerardo Roza
Oba nie działały dla mnie. Myślałem też, że to „ORAZ”, a nie „lub”? Widzę klasę początkową: poprawnie w pliku MANIFEST.MF, ale wiosna uruchamia inną klasę główną z adnotacją @SpringBootApplication. Właściwie potrzebuję tej klasy do ładowania niektórych rzeczy, więc tak naprawdę nie lubię zmieniać adnotacji. Po prostu usunięcie go i tak nie działało. Wydaje się, że wiosna zaczyna się od pierwszego znalezionego głównego (). Używam Spring-Boot-Starter-Parent 2.2.0.M3.
Angel O'Sphere
129

Dla osób używających Gradle (zamiast Maven):

springBoot {
    mainClass = "com.example.Main"
}
Marcelo C.
źródło
2
Spring Boot 2.x daje błąd Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension.
Thunderforge
Odpowiedź znajduje się na tej stronie: stackoverflow.com/a/49716696/75672
Vitalik
70

Jeśli NIE używasz pom-spring-boot-starter-parent-pom, to z dokumentacji 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>
Renaud
źródło
konfiguracji głównej klasy można pominąć
zhaozhi
@zhaozhi mógłbyś wyjaśnić dlaczego / jak?
Renaud
19

Dla osób używających Gradle (zamiast Maven), odwołując się tutaj :

Klasę główną można również jawnie skonfigurować za pomocą właściwości mainClassName zadania:

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

Alternatywnie nazwę głównej klasy można skonfigurować dla całego projektu za pomocą właściwości mainClassName Spring DSL:

springBoot {
    mainClassName = 'com.example.ExampleApplication'
}
Shane Lu
źródło
15

Jeśli korzystasz z pom-spring-boot-starter-parent, po prostu dodajesz do pom:

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

Następnie zrób swój pakiet mvn.

Zobacz tę stronę z dokumentami wiosennymi .

Bardzo ważnym aspektem jest tutaj wspomnienie, że struktura katalogów musi być src / main / java / nameofyourpackage

mojave
źródło
Przekonałem się, że to rozwiązanie działa bez modyfikowania pliku pom.xml po replikacji wymagań dotyczących pakietów dla klas .java.
6

Wypróbowałem następujący kod w pom.xml i zadziałał dla mnie

<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
źródło
Próbowałem użyć konfiguracji Spring-boot-maven-plugin, o której wspomniałeś w moim projekcie multimodules maven, złożonym z kilku projektów Spring Boot i włączając Spring Boot jako zależność od BOM, i działało to jak urok. Jeśli chodzi o wtyczkę kompilatora maven, nie określiłem niczego, ponieważ nie chcę, aby moja platforma POM była zależna. Maven automatycznie rozwidla, więc myślę, że możesz zignorować tę konfigurację.
Cheloute
4

Od wersji Spring Boot 1.5 możesz całkowicie zignorować podatny na błędy literał ciągów w pom lub build.gradle. Narzędzie do przepakowywania (za pośrednictwem wtyczki maven lub gradle) wybierze to, na którym jest napisane adnotacja @SpringBootApplication. (Szczegółowe informacje na ten temat: https://github.com/spring-projects/spring-boot/issues/6496 )

tan9
źródło
3

Zmieniłem nazwę projektu i nadal znajdowałem starą Applicationklasę na ścieżce kompilacji. Usunąłem go w folderze „build” i wszystko było w porządku.

Anthony De Smet
źródło
1

Widziałem ten problem z Javą 1.9 i SpringBoot 1.5.x, gdy klasa główna nie jest wyraźnie określona.

W Javie 1.8 jest w stanie znaleźć klasę główną bez jawnej właściwości, a „pakiet mvn” działa dobrze.

dy10
źródło