Як мені сказати Spring Boot, який основний клас використовувати для виконуваної банки?


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

Мій проект має більше одного класу з mainметодом. Як мені повідомити плагін Spring Boot Maven, який із класів він повинен використовувати як основний клас?


1
java -cp myjar.jar MyClass
Євгеній Димитров

4
@Evgeni: Це прапор часу виконання. Це не так далеко. Це не вдається побудувати.
Тіло

Відповіді:


268

Додайте свій початковий клас у пам’яті:

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

або

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

Не потрібно нічого відключати. Або я щось пропускаю?
Дейв Сайер

29
Зауважте, що ця відповідь правильна, якщо ви використовуєте pom-spring-starter-starter pom. У цьому випадку властивість "start-class" застосовується до параметра конфігурації "mainClass" модуля spring-boot-maven-плагіна (що можна зробити безпосередньо, якщо ви не використовуєте стартер).
Дейв Сайер

18
Дякую @ludo_rj, і я виявив, що це також працює:, mvn clean package -Dstart-class=com.foo.Applicationякщо хочеться динамічно вказати, використовуючи який основний клас
zhuguowei

2
Ще одна річ , щоб додати параметр згаданий @zhuguowei також дійсні для Spring завантаження Maven Plugin: mvn spring-boot:run -Dstart-class=com.foo.Application. Це дійсно лише в тому випадку, якщо ви не вказали mainClass у плагіні pom
Gerardo Roza

Обидва мені не працювали. Я також думав, що це "І" не є? Я бачу Start-Class: правильно в MANIFEST.MF, але весна починає інший анотований основний клас @SpringBootApplication. Мені справді потрібен цей клас для завантаження деяких речей, тому я не дуже люблю змінювати примітку. Просто видалити його все одно не вийшло. Весна, здається, розпочинає перше головне (), яке вона знаходить. Я використовую Spring-boot-starter-parent 2.2.0.M3.
Angel O'Sphere


70

Якщо ви НЕ використовуєте джерело pom-spring-boter-starter-pom, то з документації 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>

Конфігурацію основного класу можна опустити
джаожі

@zhaozhi ви могли б пояснити, чому / як?
Рено

19

Для тих, хто використовує Gradle (замість Maven), посилаючись тут :

Головний клас можна також конфігурувати явно за допомогою властивості mainClassName завдання:

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

В якості альтернативи, ім'я основного класу можна налаштувати по всьому проекту за допомогою властивості mainClassName Spring DSL:

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

15

Якщо ви використовуєте джерело початкового завантаження для початківців у своєму пом, просто додайте до пам’яті наступне:

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

Потім зробіть пакет mvn.

Дивіться цю сторінку весняних документів .

Тут дуже важливим аспектом є те, що структура каталогів повинна бути src / main / java / nameofyourpackage


Я знайшов, що це рішення працює без зміни pom.xml, коли я повторював вимоги до пакету для .java класів.

6

Я спробував наступний код у pom.xml, і він працював на мене

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


Я спробував використати конфігурацію Spring-boot-maven-plugin, яку ви згадували в моєму мультимодулі Maven Project, складеному кількома проектами Spring boot, включаючи Spring Boot як залежність від BOM, і це спрацьовувало як шарм. Щодо плагіну Maven-компілятор, я нічого не вказав, оскільки не хочу, щоб моя платформа POM була залежною. Maven автоматично розщедрився, тому я думаю, що ви можете просто проігнорувати цю конфігурацію.
Шолоуте

4

З Spring Boot 1.5 ви можете повністю проігнорувати схильний до помилок рядковий літерал у pom або build.gradle. Інструмент перепакування (через плагін Maven або Gradle) вибере той, який анотований @SpringBootApplicationдля вас. (Докладніше див. У цьому питанні: https://github.com/spring-projects/spring-boot/isissue/6496 )


3

Я перейменував свій проект, і він все ще знаходив старий Applicationклас на шляху збирання. Я видалив її в папці 'build' і все було добре.


1

Бачили цю проблему з Java 1.9 та SpringBoot 1.5.x, коли основний клас не вказано явно.

З Java 1.8 він може знайти основний клас без явного властивості, і 'mvn пакет' працює чудово.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.