Làm cách nào để báo cho Spring Boot biết lớp chính nào sẽ sử dụng cho tệp thực thi?


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

Dự án của tôi có nhiều hơn một lớp với một mainphương thức. Làm cách nào để tôi biết plugin Spring Boot Maven mà lớp nào nên sử dụng làm lớp chính?


1
java -cp myjar.jar MyClass
Evgeni Dimitrov

4
@Evgeni: Đó là cờ thời gian chạy. Nó không đi xa đến thế. Nó không xây dựng được.
Thilo

Câu trả lời:


268

Thêm lớp bắt đầu của bạn trong pom của bạn:

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

hoặc là

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

Không cần phải vô hiệu hóa bất cứ điều gì. Hay tôi đang thiếu một cái gì đó?
Dave Syer

29
Lưu ý rằng câu trả lời này là chính xác nếu bạn sử dụng pom spring-boot-starter-Parent. Trong trường hợp đó, thuộc tính "lớp bắt đầu" được áp dụng cho tham số cấu hình "mainClass" của plugin spring-boot-maven-plugin (bạn có thể thực hiện trực tiếp nếu không sử dụng bộ khởi động).
Dave Syer

18
Cảm ơn @ludo_rj và tôi thấy điều này cũng hoạt động : mvn clean package -Dstart-class=com.foo.Application, nếu muốn tự động chỉ định sử dụng lớp chính nào
zhuguowei

2
Thêm một điều nữa, tham số được đề cập bởi @zhuguowei cũng hợp lệ cho Plugin Spring Boot Maven : mvn spring-boot:run -Dstart-class=com.foo.Application. Điều này chỉ hợp lệ nếu bạn chưa chỉ định mainClass trong plugin của pom
Gerardo Roza

Cả hai đều không làm việc cho tôi. Tôi cũng nghĩ đó là "VÀ" không phải là hay? Tôi thấy Start-Class: chính xác trong MANIFEST.MF, nhưng mùa xuân bắt đầu một lớp chính @SpringBootApplication có chú thích khác. Tôi thực sự cần lớp đó để bootstrapping một số thứ vì vậy tôi không thực sự muốn thay đổi chú thích. Đơn giản chỉ cần loại bỏ nó không hoạt động. Mùa xuân dường như bắt đầu chính () đầu tiên nó tìm thấy. Tôi đang sử dụng spring-boot-starter-Parent 2.2.0.M3.
Thiên thần O'Sphere

129

Đối với những người sử dụng Gradle (thay vì Maven):

springBoot {
    mainClass = "com.example.Main"
}

2
Spring Boot 2.x báo lỗi Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension.
Thunderforge

Câu trả lời nằm ở trang này: stackoverflow.com/a/49716696/75672
Vitalik

70

Nếu bạn KHÔNG sử dụng pom spring-boot-starter-Parent, thì từ tài liệu 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>

Cấu hình lớp chính có thể được bỏ qua
zhaozhi 21/03/19

@zhaozhi bạn có thể giải thích tại sao / làm thế nào?
Đổi mới

19

Đối với những người sử dụng Gradle (thay vì Maven), tham khảo tại đây :

Lớp chính cũng có thể được cấu hình rõ ràng bằng cách sử dụng thuộc tính mainClassName của tác vụ:

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

Ngoài ra, tên lớp chính có thể được cấu hình trên toàn dự án bằng cách sử dụng thuộc tính mainClassName của Spring Boot DSL:

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

15

Nếu bạn đang sử dụng spring-boot-starter-Parent trong pom của mình, bạn chỉ cần thêm phần sau vào pom của mình:

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

Sau đó làm gói mvn của bạn.

Xem trang tài liệu mùa xuân này .

Một khía cạnh rất quan trọng ở đây là đề cập đến cấu trúc thư mục phải là src / main / java / nameofyourpackage


Tôi đã tìm thấy giải pháp này để hoạt động mà không sửa đổi pom.xml khi tôi sao chép các yêu cầu gói cho các lớp .java.

6

Tôi đã thử đoạn mã sau trong pom.xml và nó hoạt động với tôi

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


Tôi đã thử sử dụng cấu hình spring-boot-maven-plugin mà bạn đã đề cập trong dự án maven multimodules của tôi, được sáng tác bởi một số dự án khởi động Spring và bao gồm cả Spring Boot như là phụ thuộc BOM, và nó hoạt động như một cơ duyên. Liên quan đến plugin maven-biên dịch-plugin, tôi không chỉ định bất cứ điều gì vì tôi không muốn phụ thuộc vào nền tảng POM của mình. Maven tự động rẽ nhánh, vì vậy tôi nghĩ rằng bạn có thể bỏ qua cấu hình này.
Cheloute

4

Kể từ Spring Boot 1.5, bạn có thể hoàn thành bỏ qua chuỗi ký tự dễ bị lỗi trong pom hoặc build.gradle. Công cụ đóng gói lại (thông qua plugin maven hoặc gradle) sẽ chọn một chú thích @SpringBootApplicationcho bạn. (Tham khảo vấn đề này để biết chi tiết: https://github.com/spring-projects/spring-boot/issues/6496 )


3

Tôi đã đổi tên dự án của mình và nó vẫn đang tìm Applicationlớp cũ trên đường xây dựng. Tôi đã xóa nó trong thư mục 'build' và tất cả đều ổn.


1

Đã thấy vấn đề này với Java 1.9 và SpringBoot 1.5.x, khi lớp chính không được chỉ định rõ ràng.

Với Java 1.8, nó có thể tìm thấy lớp chính mà không có thuộc tính rõ ràng và 'gói mvn' hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.