Как сообщить Spring Boot, какой основной класс использовать для исполняемого jar?

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

Добавьте свой стартовый класс в свой pom:

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

Ответ 2

Для тех, кто использует Gradle (вместо Maven):

springBoot {
    mainClass = "com.example.Main"
}

Ответ 3

Если вы НЕ используете spring -boot-starter-parent 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>

Ответ 4

Для тех, кто использует Gradle (вместо Maven), ссылка здесь:

Основной класс также может быть настроен явно с помощью свойства задач mainClassName:

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

В качестве альтернативы, имя основного класса можно настроить для всего проекта с помощью свойства mainClassName в Spring Boot DSL:

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

Ответ 5

Если вы используете spring -boot-starter-parent в своем pom, вы просто добавляете следующее к своему pom:

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

Затем сделайте свой пакет mvn.

См. эту страницу Spring docs.

Очень важным аспектом здесь является упомянуть, что структура каталогов должна быть src/main/java/nameofyourpackage

Ответ 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>

Ответ 7

Я переименовал свой проект, и он все еще находил старый класс Application в пути сборки. Я удалил его в папку "build", и все было в порядке.

Ответ 8

Так как Spring Boot 1.5, вы можете завершить игнорировать строковый литерал с ошибкой в ​​pom или build.gradle. Инструмент переупаковки (через плагин maven или gradle) выберет для вас аннотацию @SpringBootApplication. (Подробнее см. Эту проблему: https://github.com/spring-projects/spring-boot/issues/6496)

Ответ 9

Видела эту проблему с Java 1.9 и SpringBoot 1.5.x, когда основной класс не указан явно.

С Java 1.8 он может найти основной класс без явного свойства, и 'mvn package' работает отлично.

Ответ 10

Я использовал gradle wrapper gradlew вместо gradle и работал у меня.