Como digo ao Spring Boot qual classe principal usar para o jar executável?


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

Meu projeto tem mais de uma classe com um mainmétodo Como digo ao plug-in Spring Boot Maven qual das classes ele deve usar como classe principal?


1
java -cp myjar.jar MyClass
Evgeni Dimitrov

4
@ Evgeni: Essa é uma flag em tempo de execução. Não chega tão longe. Falha ao construir.
Thol

Respostas:


268

Adicione sua classe inicial no seu pom:

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

ou

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

Não há necessidade de desativar nada. Ou eu estou esquecendo de alguma coisa?
Dave Syer

29
Observe que esta resposta está correta se você usar o pom-spring-boot-starter-parent. Nesse caso, a propriedade "start-class" é aplicada ao parâmetro de configuração "mainClass" do plugin spring-boot-maven (que você pode fazer diretamente se não estiver usando o starter).
precisa saber é o seguinte

18
Graças @ludo_rj, e eu achei isso também funciona: mvn clean package -Dstart-class=com.foo.Applicationse quiser especificar dinamicamente usando cuja principal classe
zhuguowei

2
Só mais uma coisa a acrescentar, o parâmetro mencionado por @zhuguowei também é válido para a Primavera de inicialização Maven Plugin: mvn spring-boot:run -Dstart-class=com.foo.Application. Isso é válido somente se você não especificou a mainClass no plug-in do pom.
Gerardo Roza

Ambos não funcionaram para mim. Eu também pensei que era um "AND" não um ou? Eu vejo a classe Start: corretamente no MANIFEST.MF, mas a primavera inicia uma classe principal anotada @SpringBootApplication diferente. Na verdade, eu preciso dessa classe para inicializar algumas coisas, então não gosto muito de alterar a anotação. Simplesmente removê-lo não funcionou de qualquer maneira. A primavera parece começar o primeiro main () encontrado. Estou usando o spring-boot-starter-parent 2.2.0.M3.
Angel O'Sphere

129

Para aqueles que usam Gradle (em vez de Maven):

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

2
O Spring Boot 2.x apresenta um erro Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension.
Thunderforge

A resposta está abaixo nesta página: stackoverflow.com/a/49716696/75672
Vitalik

70

Se você NÃO usar o pom spring-boot-starter-parent, a partir da documentação do 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>

configuração classe principal pode ser omitido
zhaozhi

@zhaozhi você poderia explicar por que / como?
Renaud

19

Para aqueles que usam Gradle (em vez de Maven), consulte aqui :

A classe principal também pode ser configurada explicitamente usando a propriedade mainClassName da tarefa:

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

Como alternativa, o nome da classe principal pode ser configurado em todo o projeto usando a propriedade mainClassName da DSL Spring Boot:

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

15

Se você estiver usando spring-boot-starter-parent no seu pom, basta adicionar o seguinte ao seu pom:

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

Então faça seu pacote mvn.

Consulte esta página de documentos do Spring .

Um aspecto muito importante aqui é mencionar que a estrutura de diretório deve ser src / main / java / nameofyourpackage


Encontrei esta solução para trabalhar sem modificar o pom.xml depois de replicar os requisitos do pacote para as classes .java.

6

Eu tentei o seguinte código no pom.xml e funcionou para mim

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


Tentei usar a configuração spring-boot-maven-plugin que você mencionou no meu projeto de multimódulos maven, composto por vários projetos de inicialização Spring e incluindo Spring Boot como dependência de BOM, e funcionou como um encanto. Em relação ao maven-compiler-plugin, não especifiquei nada, pois não quero minha plataforma POM dependente. Maven bifurcou automaticamente, então acho que você pode simplesmente ignorar essa configuração.
Cheloute 25/10

4

Desde o Spring Boot 1.5, você pode ignorar a sequência literal de caracteres propensos a erros em pom ou build.gradle. A ferramenta de reembalagem (via plug-in maven ou gradle) selecionará a que você anotou @SpringBootApplication. (Consulte esta edição para obter detalhes: https://github.com/spring-projects/spring-boot/issues/6496 )


3

Eu havia renomeado o meu projeto e ele ainda estava encontrando a Applicationclasse antiga no caminho da compilação. Eu o removi na pasta 'build' e estava tudo bem.


1

Já vi esse problema com Java 1.9 e SpringBoot 1.5.x, quando a classe principal não é especificada explicitamente.

Com o Java 1.8, ele é capaz de encontrar a classe principal sem propriedade explícita e o 'mvn package' funciona bem.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.