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?


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>

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


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>

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

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


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>


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 )


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.