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?


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>

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

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>

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

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


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>


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


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.