ฉันจะบอก Spring Boot ได้อย่างไรว่าคลาสหลักใดที่จะใช้สำหรับ jar ที่ปฏิบัติการได้?


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

โครงการของฉันมีมากกว่าหนึ่งคลาสด้วยmainวิธีการ ฉันจะบอกปลั๊กอิน Spring Boot Maven ว่าควรใช้คลาสใดเป็นคลาสหลัก


1
java -cp myjar.jar MyClass
Evgeni Dimitrov

4
@Evgeni: นั่นเป็นธงรันไทม์ มันไม่ได้ไกลขนาดนั้น มันล้มเหลวในการสร้าง
Thilo

คำตอบ:


268

เพิ่มคลาสเริ่มต้นของคุณใน pom ของคุณ:

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

หรือ

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

ไม่จำเป็นต้องปิดการใช้งานอะไรเลย หรือว่าฉันขาดอะไรไป?
Dave Syer

29
โปรดทราบว่าคำตอบนี้ถูกต้องหากคุณใช้ pom spring-boot-starter-parent ในกรณีนั้นคุณสมบัติ "เริ่มต้นคลาส" จะถูกนำไปใช้กับพารามิเตอร์การกำหนดค่า "mainClass" ของ spring-boot-maven-plugin (ซึ่งคุณสามารถทำได้โดยตรงหากคุณไม่ได้ใช้ตัวเริ่มต้น)
Dave Syer

18
ขอบคุณ @ludo_rj และฉันก็พบว่ามันใช้งานได้เช่นกัน: mvn clean package -Dstart-class=com.foo.Applicationหากต้องการระบุการใช้คลาสหลักใดแบบไดนามิก
zhuguowei

2
อีกสิ่งหนึ่งที่จะเพิ่มพารามิเตอร์ดังกล่าวโดย @zhuguowei ยังเป็นที่ถูกต้องสำหรับฤดูใบไม้ผลิ Boot Maven mvn spring-boot:run -Dstart-class=com.foo.Applicationปลั๊กอิน: สิ่งนี้ใช้ได้เฉพาะเมื่อคุณไม่ได้ระบุ mainClass ในปลั๊กอินของ pom
Gerardo Roza

ทั้งสองไม่ได้ผลสำหรับฉัน ฉันก็คิดว่ามันเป็น "AND" ไม่ใช่หรือ? ฉันเห็น Start-Class: ถูกต้องใน MANIFEST.MF แต่ spring เริ่มคลาสหลัก @SpringBootApplication ที่มีคำอธิบายประกอบอื่น จริง ๆ แล้วฉันต้องการคลาสนั้นเพื่อทำการบูตบางสิ่งบางอย่างดังนั้นฉันไม่ชอบเปลี่ยนคำอธิบายประกอบ เพียงแค่ลบมันไม่ทำงาน ฤดูใบไม้ผลิดูเหมือนจะเริ่มหลักแรก () พบว่า ฉันใช้ spring-boot-starter-parent 2.2.0.M3
Angel O'Sphere


70

หากคุณไม่ใช้ pom spring-boot-starter-parent pom ดังนั้นจากเอกสาร 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>

การกำหนดค่าระดับหลักสามารถละเว้นได้
zhaozhi

@zhaozhi คุณสามารถอธิบายได้ว่าทำไม / อย่างไร?
Renaud

19

สำหรับผู้ที่ใช้ Gradle (แทน Maven) อ้างอิงที่นี่ :

คลาสหลักสามารถกำหนดค่าได้อย่างชัดเจนโดยใช้คุณสมบัติ mainClassName ของงาน:

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

อีกทางหนึ่งชื่อคลาสหลักสามารถกำหนดค่าทั้งโครงการโดยใช้คุณสมบัติ mainClassName ของ Spring Boot DSL:

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

15

หากคุณใช้ spring-boot-starter-parent ใน pom ของคุณคุณเพียงเพิ่มสิ่งต่อไปนี้ลงใน pom

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

จากนั้นทำแพ็คเกจ mvn ของคุณ

ดูนี้ฤดูใบไม้ผลิหน้าเอกสาร

สิ่งสำคัญมากที่นี่คือการพูดถึงว่าโครงสร้างไดเรกทอรีจะต้องมี src / main / java / nameofyourpackage


ฉันพบวิธีนี้ในการทำงานโดยไม่แก้ไข pom.xml เมื่อฉันทำซ้ำข้อกำหนดของแพ็กเกจสำหรับคลาส. java

6

ฉันลองใช้รหัสต่อไปนี้ใน pom.xml และใช้งานได้สำหรับฉัน

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


ฉันพยายามใช้การกำหนดค่า spring-boot-maven-plugin ที่คุณเอ่ยถึงในโปรเจค mim multimodules ซึ่งประกอบด้วยโปรเจ็กต์ Spring boot หลายอันและรวมถึง Spring Boot เป็นการพึ่งพา BOM และมันทำงานได้อย่างมีเสน่ห์ เกี่ยวกับ maven-compiler-plugin ฉันไม่ได้ระบุอะไรเลยเพราะฉันไม่ต้องการแพลตฟอร์ม POM ของฉัน Maven แยกโดยอัตโนมัติดังนั้นฉันคิดว่าคุณสามารถเพิกเฉยต่อการกำหนดค่านี้ได้
Cheloute

4

ตั้งแต่ Spring Boot 1.5 คุณสามารถเพิกเฉยต่อสตริงตัวอักษรผิดพลาดใน pom หรือ build.gradle ได้ เครื่องมือ repackaging (ผ่าน maven หรือปลั๊กอิน gradle) จะเลือกหนึ่งคำอธิบายประกอบ@SpringBootApplicationสำหรับคุณ (โปรดดูรายละเอียดปัญหานี้: https://github.com/spring-projects/spring-boot/issues/6496 )


3

ฉันได้เปลี่ยนชื่อโครงการของฉันและยังคงหาApplicationชั้นเรียนเก่าบนเส้นทางการสร้าง ฉันลบมันในโฟลเดอร์ 'build' และทั้งหมดก็ใช้ได้


1

เคยเห็นปัญหานี้กับ Java 1.9 และ SpringBoot 1.5.x เมื่อไม่ได้ระบุคลาสหลักอย่างชัดเจน

ด้วย Java 1.8 จะสามารถค้นหาคลาสหลักโดยไม่มีคุณสมบัติที่ชัดเจนและ 'แพ็คเกจ mvn' ทำงานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.