मैं स्प्रिंग बूट को कैसे बताता हूं कि निष्पादन योग्य जार के लिए किस मुख्य वर्ग का उपयोग करना है?


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विधि के साथ एक से अधिक वर्ग हैं । मैं स्प्रिंग बूट मावेन प्लगइन को कैसे बताऊं कि इसे मुख्य वर्ग के रूप में किस वर्ग का उपयोग करना चाहिए?


1
java -cp myjar.jar MyClass
दिमित्रोव

4
@ ईवगेनी: यह एक रनटाइम फ्लैग है। यह अभी तक नहीं मिलता है। यह निर्माण करने में विफल रहता है।
थिलो

जवाबों:


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>

कुछ भी निष्क्रिय करने की आवश्यकता नहीं है। या क्या मैं कुछ न कुछ भूल रहा हूं?
डेव सीयर

29
ध्यान दें कि यदि आप स्प्रिंग-बूट-स्टार्टर-पैरेंट पोम का उपयोग करते हैं तो यह उत्तर सही है। उस स्थिति में "स्टार्ट-क्लास" संपत्ति वसंत-बूट-मावेन-प्लगइन के "मेनक्लास" कॉन्फ़िगरेशन पैरामीटर पर लागू होती है (जो आप स्टार्टर का उपयोग नहीं कर रहे हैं, तो आप सीधे कर सकते हैं)।
डेव सीयर

18
शुक्रिया @ludo_rj, और मैंने पाया कि यह भी काम करता है:, mvn clean package -Dstart-class=com.foo.Applicationयदि डायनामिक रूप से निर्दिष्ट करना चाहते हैं कि किस मुख्य वर्ग का उपयोग करना है
zhuguowei

2
जोड़ने के लिए एक और बात, @zhuguowei द्वारा उल्लिखित पैरामीटर स्प्रिंग बूट मावेन प्लगिन के लिए भी मान्य है mvn spring-boot:run -Dstart-class=com.foo.Application:। यह केवल तभी मान्य है जब आपने पोम के प्लगइन में मेनक्लास निर्दिष्ट नहीं किया है
गेरार्डो रोजा

दोनों ने मेरे लिए काम नहीं किया। मैंने भी सोचा कि यह एक "और" है या नहीं? मैं स्टार्ट-क्लास देखता हूं: सही ढंग से MANIFEST.MF में, लेकिन वसंत एक अलग एनोटेट @SpringBootApplication मुख्य वर्ग शुरू करता है। मुझे वास्तव में कुछ चीजों को बूटस्ट्रैप करने के लिए उस वर्ग की आवश्यकता है, इसलिए मुझे एनोटेशन को बदलना पसंद नहीं है। बस इसे हटाने से कोई फायदा नहीं हुआ। लगता है कि वसंत पहले मुख्य () को शुरू करता है। मैं स्प्रिंग-बूट-स्टार्टर-पैरेंट 2.2.0.M3 का उपयोग कर रहा हूं।
एंजेल ओ 'स्फीयर

129

ग्रेडेल (मावेन के बजाय) का उपयोग करने वालों के लिए:

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

2
स्प्रिंग बूट 2.x एक त्रुटि देता है Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension
थंडरफोर्स

जवाब नीचे इस पृष्ठ है: stackoverflow.com/a/49716696/75672
विटैलिक

70

यदि आप स्प्रिंग-बूट-स्टार्टर-पैरेंट पोम का उपयोग नहीं करते हैं, तो स्प्रिंग डॉक्यूमेंटेशन से :

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

मुख्य वर्ग विन्यास छोड़ा जा सकता है
झौझी

@ झाझी क्या तुम समझा सकते हो / क्यों?
रेनॉड

19

ग्रेडेल (मावेन के बजाय) का उपयोग करने वालों के लिए, यहां संदर्भित :

मुख्य वर्ग को कार्य के mainClassName गुण का उपयोग करके स्पष्ट रूप से कॉन्फ़िगर किया जा सकता है:

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

वैकल्पिक रूप से, मुख्य वर्ग नाम को स्प्रिंग बूट डीएसएल के mainClassName गुण का उपयोग करके प्रोजेक्ट-वाइड कॉन्फ़िगर किया जा सकता है:

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

15

यदि आप अपने पोम में स्प्रिंग-बूट-स्टार्टर-पैरेंट का उपयोग कर रहे हैं, तो आप बस अपने पोम में निम्नलिखित जोड़ सकते हैं:

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

फिर अपना mvan पैकेज करें।

यह स्प्रिंग डॉक्स पृष्ठ देखें ।

यहाँ एक बहुत महत्वपूर्ण पहलू यह है कि निर्देशिका संरचना को src / main / java / nameofyourpackage होना चाहिए


एक बार जब मैंने .java वर्गों के लिए पैकेज आवश्यकताओं को दोहराया, तो मैंने pom.xml को संशोधित किए बिना काम करने के लिए यह समाधान पाया।

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>


मैंने अपने मल्टीमॉडल्स मावेन प्रोजेक्ट में उल्लिखित स्प्रिंग-बूट-मावेन-प्लगइन कॉन्फ़िगरेशन का उपयोग करने की कोशिश की, जो कई स्प्रिंग बूट प्रोजेक्ट्स से बना और स्प्रिंग बूट जिसमें बीओएम निर्भरता के रूप में शामिल था, और यह एक आकर्षण की तरह काम करता था। मावेन-कंपाइलर-प्लगइन के बारे में, मैंने कुछ भी निर्दिष्ट नहीं किया क्योंकि मैं अपने पोम प्लेटफॉर्म पर निर्भर नहीं रहना चाहता। मावेन स्वचालित रूप से कांटा गया, इसलिए मुझे लगता है कि आप इस कॉन्फ़िगरेशन को अनदेखा कर सकते हैं।
चेलुउटे

4

स्प्रिंग बूट 1.5 के बाद से, आप pom या build.gradle में त्रुटि-प्रवण स्ट्रिंग शाब्दिक को अनदेखा कर सकते हैं। रीपैकेजिंग टूल (मावेन या ग्रेडल प्लगइन के माध्यम से) @SpringBootApplicationआपके लिए एक एनोटेट होगा । (विस्तार के लिए इस मुद्दे को देखें: https://github.com/spring-projects/spring-boot/issues/6496 )


3

मैंने अपने प्रोजेक्ट का नाम बदल दिया था और यह अभी भी पुराने Applicationरास्ते का निर्माण पथ पर पा रहा था । मैंने इसे 'बिल्ड' फ़ोल्डर में निकाल दिया और सब ठीक था।


1

जावा 1.9 और स्प्रिंगबूट 1.5.x के साथ इस मुद्दे को देखा है, जब मुख्य वर्ग स्पष्ट रूप से निर्दिष्ट नहीं किया गया है।

जावा 1.8 के साथ, यह स्पष्ट संपत्ति के बिना मुख्य-वर्ग को खोजने में सक्षम है और 'mvan पैकेज' ठीक काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.