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

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: Это флаг времени выполнения. Это не так далеко. Не удается построить.
Thilo

Ответы:

268

Добавьте свой стартовый класс в свой 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>
ludo_rj
источник
Не нужно ничего отключать. Или я что-то упустил?
Дейв Сайер,
29
Обратите внимание, что этот ответ правильный, если вы используете pom spring-boot-starter-parent. В этом случае свойство «start-class» применяется к параметру конфигурации «mainClass» модуля spring-boot-maven-plugin (что можно сделать напрямую, если вы не используете стартер).
Дейв Сайер
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, но Spring запускает другой аннотированный основной класс @SpringBootApplication. Мне действительно нужен этот класс для начальной загрузки некоторых вещей, поэтому мне не очень нравится менять аннотацию. Просто удалить это не сработало. Spring, кажется, запускает первый main (), который он находит. Я использую spring-boot-starter-parent 2.2.0.M3.
Ангел О'Сфера
129

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

springBoot {
    mainClass = "com.example.Main"
}
Марсело С.
источник
2
Spring Boot 2.x выдает ошибку Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension.
Громовая
Ответ вниз по этой странице: stackoverflow.com/a/49716696/75672
Виталик
70

Если вы НЕ используете pom spring-boot-starter-parent, то из документации 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
источник
Конфигурация основного класса может быть опущена
zhaozhi
@zhaozhi не могли бы вы объяснить, почему / как?
Рено
19

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

Основной класс также можно настроить явно, используя свойство задачи mainClassName:

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

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

springBoot {
    mainClassName = 'com.example.ExampleApplication'
}
Шейн Лу
источник
15

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

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

Тогда сделайте свой пакет mvn.

Смотрите эту весеннюю страницу документации .

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

Mojave
источник
Я обнаружил, что это решение работает без изменения файла 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>

TRIDIB BOSE
источник
Я попытался использовать конфигурацию spring-boot-maven-plugin, которую вы упомянули в моем проекте multimodules maven, состоящем из нескольких загрузочных проектов Spring и включающих Spring Boot в качестве зависимости от спецификации, и она работала как чудо. Что касается maven-compiler-plugin, я ничего не указал, так как не хочу, чтобы моя платформа POM зависела. Maven автоматически разветвляется, поэтому я думаю, что вы можете просто проигнорировать эту конфигурацию.
Cheloute
4

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

tan9
источник
3

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

Энтони Де Смет
источник
1

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

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

dy10
источник