Spring Boot'a yürütülebilir kavanoz için hangi ana sınıfı kullanacağımı nasıl söyleyebilirim?


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

Projemde bir mainyöntemle birden fazla sınıf var . Spring Boot Maven eklentisine hangi sınıfların ana sınıf olarak kullanılması gerektiğini nasıl anlarım?


1
java -cp myjar.jar MyClass
Evgeni Dimitrov

4
@Evgeni: Bu bir çalışma zamanı bayrağı. O kadar ileri gitmiyor. İnşa edemiyor.
Thilo

Yanıtlar:


268

Başlangıç ​​sınıfınızı pom'nıza ekleyin:

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

veya

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

Hiçbir şeyi devre dışı bırakmanıza gerek yok. Yoksa bir şey mi kaçırıyorum?
Dave Syer

29
Spring-boot-starter-parent pom kullandığınızda bu cevabın doğru olduğunu unutmayın. Bu durumda, "start-class" özelliği spring-boot-maven-eklentisinin "mainClass" yapılandırma parametresine uygulanır (bu, başlangıç ​​kullanmıyorsanız doğrudan yapabilirsiniz).
Dave Syer

18
Teşekkürler @ludo_rj ve ben de işe yaradığını buldum: mvn clean package -Dstart-class=com.foo.Applicationdinamik olarak hangi ana sınıfı kullanarak belirtmek istiyorsanız
zhuguowei

2
Eklemek Bir şey daha, @zhuguowei bahsettiği parametresi de Bahar Boot Maven Eklentisi için geçerlidir: mvn spring-boot:run -Dstart-class=com.foo.Application. Bu, yalnızca pom'ın eklentisinde mainClass'ı belirtmediyseniz geçerlidir
Gerardo Roza

İkisi de benim için çalışmadı. Ben de bir "VE" olduğunu düşündüm bir veya değil? Başlangıç ​​sınıfı MANIFEST.MF doğru görüyorum, ancak bahar farklı bir açıklamalı @SpringBootApplication ana sınıf başlar. Aslında ek açıklama değiştirmek istemiyorum bazı şeyler bootstrapping için o sınıfa ihtiyacım var. Basitçe kaldırmak zaten işe yaramadı. Bahar bulduğu ilk ana () başlıyor gibi görünüyor. Spring-boot-starter-parent 2.2.0.M3 kullanıyorum.
Angel O'Sphere


70

Yay önyükleme marş-ebeveyn pomunu KULLANMAYINIZ, o zaman Bahar belgelerinden :

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

ana sınıf yapılandırma atlanabilir
zhaozhi

@zhaozhi neden / nasıl açıklayabilir misiniz?
Renaud

19

Gradle (Maven yerine) kullananlar için buraya bakın :

Ana sınıf, görevin mainClassName özelliği kullanılarak açıkça yapılandırılabilir:

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

Alternatif olarak, ana sınıf adı, Spring Boot DSL'nin mainClassName özelliği kullanılarak proje genelinde yapılandırılabilir:

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

15

Pom'nızda spring-boot-starter-parent kullanıyorsanız, pom'a aşağıdakileri eklemeniz yeterlidir:

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

Sonra mvn paketinizi yapın.

Bkz bu bahar dokümanlar sayfasını .

Buradaki çok önemli bir nokta, dizin yapısının src / main / java / nameofyopackage olması gerektiğinden bahsetmektir.


Bu çözümü, .java sınıfları için paket gereksinimlerini kopyaladıktan sonra pom.xml dosyasını değiştirmeden çalışacak şekilde buldum.

6

Pom.xml'de şu kodu denedim ve benim için çalıştı

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


Birkaç Bahar önyükleme projesinden oluşan ve BOM bağımlılığı olarak Bahar Önyükleme de dahil olmak üzere multimodüller maven projemde bahsettiğiniz yay önyükleme-maven-eklenti yapılandırmasını kullanmaya çalıştım ve bir cazibe gibi çalıştı. Maven-compiler-plugin ile ilgili olarak, POM platformumun bağımlı olmasını istemediğim için hiçbir şey belirtmedim. Maven otomatik olarak çatallandı, bu yüzden bu yapılandırmayı göz ardı edebileceğinizi düşünüyorum.
Cheloute

4

Spring Boot 1.5'ten bu yana, pom veya build.gradle içinde hataya açık dize değişmezini yok sayabilirsiniz. Yeniden paketleme aracı (maven veya gradle eklentisi aracılığıyla) @SpringBootApplicationsizin için açıklamalı olanı seçecektir . (Ayrıntılar için bu konuya bakın: https://github.com/spring-projects/spring-boot/issues/6496 )


3

Projemi yeniden adlandırmıştım ve hala Applicationinşaat yolunda eski sınıfı buluyordu . 'Build' klasöründen kaldırdım ve her şey yolundaydı.


1

Ana sınıf açıkça belirtilmediğinde, Java 1.9 ve SpringBoot 1.5.x ile bu sorunu gördünüz.

Java 1.8 ile, açık özellik olmadan ana sınıfı bulabilir ve 'mvn paketi' iyi çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.