Bagaimana cara memberi tahu Spring Boot kelas utama mana yang akan digunakan untuk toples yang dapat dieksekusi?

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

Proyek saya memiliki lebih dari satu kelas dengan mainmetode. Bagaimana cara memberi tahu plugin Spring Boot Maven yang mana dari kelas yang harus digunakan sebagai kelas utama?

Thilo
sumber
1
java -cp myjar.jar MyClass
Evgeni Dimitrov
4
@ Evgeni: Itu bendera runtime. Tidak sampai sejauh itu. Gagal membangun.
Thilo

Jawaban:

268

Tambahkan kelas awal Anda di pom Anda:

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

atau

<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
sumber
Tidak perlu menonaktifkan apa pun. Atau apakah saya melewatkan sesuatu?
Dave Syer
29
Perhatikan bahwa jawaban ini benar jika Anda menggunakan pom spring-boot-starter-parent. Dalam hal itu properti "kelas-mulai" diterapkan pada parameter konfigurasi "mainClass" pada pegas-boot-maven-plugin (yang dapat Anda lakukan langsung jika Anda tidak menggunakan starter).
Dave Syer
18
Terima kasih @ludo_rj, dan saya menemukan ini juga berfungsi:, mvn clean package -Dstart-class=com.foo.Applicationjika ingin menentukan secara dinamis menggunakan kelas utama mana
zhuguowei
2
Satu hal lagi untuk menambahkan, parameter yang disebutkan oleh @zhuguowei juga berlaku untuk Spring Boot Maven Plugin: mvn spring-boot:run -Dstart-class=com.foo.Application. Ini hanya valid jika Anda belum menentukan mainClass di plugin pom
Gerardo Roza
Keduanya tidak bekerja untuk saya. Saya juga berpikir itu adalah "DAN" bukan atau? Saya melihat Start-Class: dengan benar di MANIFEST.MF, tetapi pegas memulai kelas utama @SpringBootApplication beranotasi yang berbeda. Saya sebenarnya membutuhkan kelas itu untuk bootstrap beberapa hal jadi saya tidak terlalu suka mengubah anotasi. Menghapusnya saja tidak berhasil. Musim semi tampaknya memulai main pertama () yang ditemukannya. Saya menggunakan spring-boot-starter-parent 2.2.0.M3.
Angel O'Sphere
129

Bagi mereka yang menggunakan Gradle (bukan Maven):

springBoot {
    mainClass = "com.example.Main"
}
Marcelo C.
sumber
2
Spring Boot 2.x memberikan kesalahan Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension.
Thunderforge
Jawabannya ada di bawah halaman ini: stackoverflow.com/a/49716696/75672
Vitalik
70

Jika Anda TIDAK menggunakan pom spring-boot-starter-parent, maka dari dokumentasi 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
sumber
konfigurasi kelas utama dapat dihilangkan
zhaozhi
@ zhaozhi dapatkah Anda menjelaskan mengapa / bagaimana?
Renaud
19

Bagi mereka yang menggunakan Gradle (bukan Maven), rujuk di sini :

Kelas utama juga dapat dikonfigurasi secara eksplisit menggunakan properti mainClassName tugas:

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

Atau, nama kelas utama dapat dikonfigurasi di seluruh proyek menggunakan properti mainClassName dari Spring Boot DSL:

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

Jika Anda menggunakan spring-boot-starter-parent di pom Anda, Anda cukup menambahkan yang berikut ke pom Anda:

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

Kemudian lakukan paket mvn Anda.

Lihat halaman dokumen Musim Semi ini .

Aspek yang sangat penting di sini adalah menyebutkan bahwa struktur direktori harus src / main / java / nameofyourpackage

mojave
sumber
Saya menemukan solusi ini berfungsi tanpa memodifikasi pom.xml setelah saya mereplikasi persyaratan paket untuk kelas .java.
6

Saya mencoba kode berikut di pom.xml dan berhasil bagi saya

<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
sumber
Saya mencoba menggunakan konfigurasi spring-boot-maven-plugin yang Anda sebutkan dalam proyek multimodules maven saya, yang disusun oleh beberapa proyek boot Spring dan termasuk Spring Boot sebagai ketergantungan BOM, dan itu bekerja seperti pesona. Mengenai maven-compiler-plugin, saya tidak menentukan apa-apa karena saya tidak ingin platform POM saya tergantung. Maven secara otomatis bercabang, jadi saya pikir Anda bisa mengabaikan konfigurasi ini.
Cheloute
4

Sejak Spring Boot 1.5, Anda dapat mengabaikan abaikan string literal rawan kesalahan di pom atau build.gradle. Alat pengemasan ulang (melalui maven atau gradle plugin) akan memilih yang dianotasi @SpringBootApplicationuntuk Anda. (Lihat masalah ini untuk detail: https://github.com/spring-projects/spring-boot/issues/6496 )

tan9
sumber
3

Saya telah mengubah nama proyek saya dan masih menemukan Applicationkelas lama di jalur build. Saya menghapusnya di folder 'build' dan semuanya baik-baik saja.

Anthony De Smet
sumber
1

Telah melihat masalah ini dengan Java 1.9 dan SpringBoot 1.5.x, ketika kelas utama tidak ditentukan secara eksplisit.

Dengan Java 1.8, ia dapat menemukan kelas utama tanpa properti eksplisit dan 'paket mvn' berfungsi dengan baik.

dy10
sumber