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?


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>

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

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>

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

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


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>


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


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.