¿Cómo le digo a Spring Boot qué clase principal usar para el jar ejecutable?


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

Mi proyecto tiene más de una clase con un mainmétodo. ¿Cómo le digo al plugin Spring Boot Maven cuál de las clases debería usar como clase principal?


1
java -cp myjar.jar MyClass
Evgeni Dimitrov

44
@Evgeni: Esa es una bandera de tiempo de ejecución. No llega tan lejos. No se puede construir.
Thilo

Respuestas:


268

Agregue su clase de inicio en su pom:

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

o

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

No es necesario deshabilitar nada. ¿O me estoy perdiendo algo?
Dave Syer

29
Tenga en cuenta que esta respuesta es correcta si utiliza el pom spring-boot-starter-parent. En ese caso, la propiedad "start-class" se aplica al parámetro de configuración "mainClass" del plugin spring-boot-maven-plugin (que puede hacer directamente si no está usando el iniciador).
Dave Syer

18
Gracias @ludo_rj, y encontré que esto también funciona: mvn clean package -Dstart-class=com.foo.Applicationsi quieres especificar dinámicamente usando qué clase principal
zhuguowei

2
Una cosa más que añadir, el parámetro mencionado por @zhuguowei también es válido para la primavera de arranque Maven Plugin: mvn spring-boot:run -Dstart-class=com.foo.Application. Esto es válido solo si no ha especificado mainClass en el complemento de pom
Gerardo Roza

Ambos no funcionaron para mí. También pensé que era un "Y" no un o? Veo Start-Class: correctamente en MANIFEST.MF, pero spring comienza una clase principal @SpringBootApplication anotada diferente. De hecho, necesito esa clase para arrancar algunas cosas, así que realmente no me gusta cambiar la anotación. Simplemente eliminarlo no funcionó de todos modos. Spring parece comenzar el primer main () que encuentra. Estoy usando spring-boot-starter-parent 2.2.0.M3.
Angel O'Sphere


70

Si NO usa el pom spring-boot-starter-parent, entonces de la documentación de 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>

se puede omitir la configuración de la clase principal
zhaozhi

@zhaozhi ¿podría explicar por qué / cómo?
Renaud

19

Para aquellos que usan Gradle (en lugar de Maven), haciendo referencia aquí :

La clase principal también se puede configurar explícitamente utilizando la propiedad mainClassName de la tarea:

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

Alternativamente, el nombre de la clase principal se puede configurar en todo el proyecto utilizando la propiedad mainClassName del Spring Boot DSL:

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

15

Si está utilizando spring-boot-starter-parent en su pom, simplemente agregue lo siguiente a su pom:

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

Entonces haz tu paquete mvn.

Vea esta página de documentos de Spring .

Un aspecto muy importante aquí es mencionar que la estructura del directorio debe ser src / main / java / nameofyourpackage


Encontré que esta solución funcionaba sin modificar pom.xml una vez que replicaba los requisitos del paquete para las clases .java.

6

Intenté el siguiente código en pom.xml y funcionó para mí

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


Intenté usar la configuración spring-boot-maven-plugin que mencionaste en mi proyecto maven multimódulos, compuesta por varios proyectos de arranque Spring e incluyendo Spring Boot como dependencia de BOM, y funcionó de maravilla. Con respecto al complemento-compilador-maven, no especifiqué nada ya que no quiero que mi plataforma POM dependa. Maven se bifurca automáticamente, así que creo que puedes ignorar esta configuración.
Cheloute


3

Cambié el nombre de mi proyecto y todavía estaba encontrando la vieja Applicationclase en la ruta de compilación. Lo eliminé en la carpeta 'build' y todo estuvo bien.


1

He visto este problema con Java 1.9 y SpringBoot 1.5.x, cuando main-class no se especifica explícitamente.

Con Java 1.8, puede encontrar la clase principal sin propiedad explícita y el 'paquete mvn' funciona bien.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.