Comment dire à Spring Boot quelle classe principale utiliser pour le fichier jar exécutable?

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

Mon projet a plus d'une classe avec une mainméthode. Comment dire au plugin Spring Boot Maven laquelle des classes il doit utiliser comme classe principale?

Thilo
la source
1
java -cp myjar.jar MyClass
Evgeni Dimitrov
4
@Evgeni: C'est un indicateur d'exécution. Ça ne va pas aussi loin. Il ne se construit pas.
Thilo

Réponses:

268

Ajoutez votre classe de départ dans votre 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>
ludo_rj
la source
Pas besoin de rien désactiver. Ou est-ce que je manque quelque chose?
Dave Syer
29
Notez que cette réponse est correcte si vous utilisez le pom spring-boot-starter-parent. Dans ce cas, la propriété "start-class" est appliquée au paramètre de configuration "mainClass" du spring-boot-maven-plugin (ce que vous pouvez faire directement si vous n'utilisez pas le starter).
Dave Syer
18
Merci @ludo_rj, et j'ai trouvé que cela fonctionne également:, mvn clean package -Dstart-class=com.foo.Applicationsi vous voulez spécifier dynamiquement en utilisant quelle classe principale
zhuguowei
2
Une autre chose à ajouter, le paramètre mentionné par @zhuguowei est également valable pour le Maven Spring Boot Plugin: mvn spring-boot:run -Dstart-class=com.foo.Application. Ceci n'est valable que si vous n'avez pas spécifié la mainClass dans le plugin du pom
Gerardo Roza
Les deux n'ont pas fonctionné pour moi. J'ai aussi pensé que c'était un "ET" et non un ou? Je vois la classe de démarrage: correctement dans le MANIFEST.MF, mais le printemps démarre une classe principale @SpringBootApplication annotée différente. J'ai en fait besoin de cette classe pour amorcer certaines choses, donc je n'aime pas vraiment changer l'annotation. Le simple fait de le supprimer ne fonctionnait pas de toute façon. Spring semble démarrer le premier main () qu'il trouve. J'utilise spring-boot-starter-parent 2.2.0.M3.
Angel O'Sphere
129

Pour ceux qui utilisent Gradle (au lieu de Maven):

springBoot {
    mainClass = "com.example.Main"
}
Marcelo C.
la source
2
Spring Boot 2.x donne une erreur Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension.
Thunderforge
La réponse est en bas de cette page: stackoverflow.com/a/49716696/75672
Vitalik
70

Si vous n'utilisez PAS le pom spring-boot-starter-parent, puis à partir de la documentation 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
la source
la configuration de la classe principale peut être omise
zhaozhi
@zhaozhi pourrais-tu expliquer pourquoi / comment?
Renaud
19

Pour ceux qui utilisent Gradle (au lieu de Maven), référençant ici :

La classe principale peut également être configurée explicitement à l'aide de la propriété mainClassName de la tâche:

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

Sinon, le nom de la classe principale peut être configuré à l'échelle du projet à l'aide de la propriété mainClassName du DSL Spring Boot:

springBoot {
    mainClassName = 'com.example.ExampleApplication'
}
Shane Lu
la source
15

Si vous utilisez spring-boot-starter-parent dans votre pom, vous ajoutez simplement ce qui suit à votre pom:

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

Ensuite, faites votre package mvn.

Consultez cette page de documentation Spring .

Un aspect très important ici est de mentionner que la structure du répertoire doit être src / main / java / nameofyourpackage

mojave
la source
J'ai trouvé que cette solution fonctionnait sans modifier le pom.xml une fois que j'ai répliqué les exigences du package pour les classes .java.
6

J'ai essayé le code suivant dans pom.xml et cela a fonctionné pour moi

<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
la source
J'ai essayé d'utiliser la configuration spring-boot-maven-plugin que vous avez mentionnée dans mon projet multimodules maven, composé de plusieurs projets Spring Boot et incluant Spring Boot comme dépendance de BOM, et cela a fonctionné comme un charme. Concernant le plugin maven-compiler, je n'ai rien spécifié car je ne veux pas que ma plate-forme POM dépende. Maven a automatiquement fait un fork, donc je pense que vous pouvez simplement ignorer cette configuration.
Cheloute
4

Depuis Spring Boot 1.5, vous pouvez ignorer la chaîne littérale sujette aux erreurs dans pom ou build.gradle. L'outil de reconditionnement (via maven ou le plugin gradle) choisira celui annoté @SpringBootApplicationpour vous. (Reportez-vous à ce numéro pour plus de détails: https://github.com/spring-projects/spring-boot/issues/6496 )

bronzage9
la source
3

J'avais renommé mon projet et il recherchait toujours l'ancienne Applicationclasse sur le chemin de construction. Je l'ai supprimé dans le dossier «build» et tout allait bien.

Anthony De Smet
la source
1

J'ai vu ce problème avec Java 1.9 et SpringBoot 1.5.x, lorsque la classe principale n'est pas spécifiée explicitement.

Avec Java 1.8, il est capable de trouver la classe principale sans propriété explicite et 'mvn package' fonctionne très bien.

dy10
la source