Как мне сказать 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>

Не нужно ничего отключать. Или я что-то упустил?
Дейв Сайер,

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.
Ангел О'Сфера


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>

Конфигурация основного класса может быть опущена
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


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


3

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


1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.