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

Thilo
fuente
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>
ludo_rj
fuente
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
129

Para aquellos que usan Gradle (en lugar de Maven):

springBoot {
    mainClass = "com.example.Main"
}
Marcelo C.
fuente
2
Spring Boot 2.x da un error Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension.
Thunderforge
La respuesta está en esta página: stackoverflow.com/a/49716696/75672
Vitalik
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>
Renaud
fuente
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'
}
Shane Lu
fuente
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

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

TRIDIB BOSE
fuente
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
4

Desde Spring Boot 1.5, puede ignorar el literal de cadena propenso a errores en pom o build.gradle. La herramienta de reempaquetado (a través de Maven o Gradle Plugin) elegirá la anotada @SpringBootApplicationpara usted. (Consulte este tema para obtener detalles: https://github.com/spring-projects/spring-boot/issues/6496 )

tan9
fuente
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.

Anthony De Smet
fuente
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.

dy10
fuente