2016-08-18 25 views
5

जब मैं मेवेन के साथ स्प्रिंगबूट 1.3.5 का उपयोग कर रहा हूं तो RestController हमेशा मैप नहीं किया जाता है।स्प्रिंगबूट - DevTools - पुन: निर्माण परियोजना

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.3.5.RELEASE</version> 
</parent> 

और DevTools

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-devtools</artifactId> 
</dependency> 

मैं IntelliJ विचार 2016.2, पहले से ही समस्या के साथ 2014 का उपयोग कर रहा हूँ।

मैं इंटेलिज आइडिया से अपना स्प्रिंगबूट ऐप चला रहा हूं, पहले लॉन्च सबकुछ अच्छी तरह से लोड हो गया है और काम करता है, मैं अपने स्थिर पृष्ठों और मेरे 2 रेस्ट कंट्रोलर का उपयोग कर सकता हूं।

2016-08-18 15:27:58.771 INFO 26626 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot[email protected]469d0c02: startup date [Thu Aug 18 15:27:57 CEST 2016]; root of context hierarchy 
2016-08-18 15:27:58.789 INFO 26626 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/authentication/introspect],methods=[GET]}" onto public com.myapp.models.TokenIntrospection com.myapp.resources.AuthenticationResources.introspectToken(java.lang.String) 
2016-08-18 15:27:58.790 INFO 26626 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/configuration],methods=[GET]}" onto public com.myapp.models.AppConfiguration com.myapp.resources.ConfigurationResources.getConfiguration() 
2016-08-18 15:27:58.792 INFO 26626 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 
2016-08-18 15:27:58.793 INFO 26626 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 

क्योंकि बस "बनाओ परियोजना" स्थिर पुनः लोड के लिए अच्छी तरह से काम नहीं करता, मैं का उपयोग करें "के पुनर्निर्माण परियोजना" और कभी कभी, जब अनुप्रयोग पुनः आरंभ, मैं अपने नियंत्रकों मैप किया गया है नहीं है, कभी कभी एक याद आ रही है, कभी कभी दोनों गायब हैं।

मैं इस :(

संपादित

@Morfic समाधान काम नहीं किया के बारे में कोई सुराग नहीं है, इसलिए मैं Intellij स्थानीय सर्वर इस्तेमाल किया स्थिर सामग्री की सेवा और घूंट-livereload के बजाय करने के लिए । 8080 लेकिन मेरे stati: वसंत-देव-उपकरण

IJ local server

मैं सिर्फ बाकी जे एस में कॉल जब मैं देव मोड में हूं, क्योंकि बाकी संसाधनों पर स्थानीय होस्ट कर रहे हैं का प्रबंधन करने के लिए किया था स्थानीयहोस्ट पर सीएस: 63342, और मेरे springboot में CORS सक्षम करें (गुण फ़ाइल में ध्वज के साथ CORS सक्षम करने के लिए या नहीं)।

@Configuration 
public class CorsConfig extends WebMvcConfigurerAdapter { 

    @Value("${cors.enabled}") 
    private boolean corsEnabled; 

    @Override 
    public void addCorsMappings(CorsRegistry registry) { 
     super.addCorsMappings(registry); 
     if(corsEnabled) { 
      registry.addMapping("/**") 
        .allowedOrigins("*") 
        .allowedMethods("GET", "PUT", "POST", "DELETE", "OPTIONS") 
        .allowedHeaders("Origin", "X-Requested-With", "Content-Type", "Accept", "Authorization") 
        .allowCredentials(true) 
        .maxAge(3600L); 
     } 
    } 
} 

तो सवाल अभी भी एक समाधान समाधान के लिए लंबित है।

उत्तर

5

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

यह अनुमान के बाद पुन: लोड के रूप में , मैंने लॉग और क्लासेस टाइमस्टैम्प को देखा और समय के बीच लगभग 1s अंतर है, देव-टूल्स संदर्भ को फिर से लोड करना शुरू कर देता है और जब मेरी कक्षाएं डिस्क पर लिखी जाती हैं। जाहिर है कि मेरे @PostConstruct लॉग में से कोई भी दिखाई नहीं देता है और वसंत के ऑटोकॉन्फिग को मेरी कक्षाएं नहीं मिलती हैं ...

एक कामकाज के रूप में, आप trigger-file का उपयोग कर सकते हैं। या तो लिंक में सुझाए गए अनुसार, या अपने application.properties फ़ाइल में आपके घर-डीआईआर में एक वैश्विक कॉन्फ़िगरेशन के रूप में जोड़ें। इसके अतिरिक्त, चूंकि इस फ़ाइल में कोई भी परिवर्तन (सृजन, हटाना, संशोधन) पुनरारंभ करना ट्रिगर करेगा, और Rebuild project आउटपुट निर्देशिका को साफ़ करता है, तो आपको इस फ़ाइल को देखने के लिए एक अतिरिक्त पथ परिभाषित करना होगा। इस प्रकार, लगता है हम application.properties में निम्नलिखित 2 के साथ एक नियमित IJ वसंत बूट रन विन्यास है,:

# name of the file to trigger a restart 
spring.devtools.restart.trigger-file=restarttrigger 

# where else to look for it. Also . evaluates to the app's base dir 
spring.devtools.restart.additional-paths=. 

...एक बार जब आप निर्माण प्रक्रिया को पूरा करते हुए आईजे देखते हैं, तो ऐप रूट डीआईआर पर जाएं और अपनी ट्रिगर फ़ाइल को जोड़ें या हटाएं, इस पर निर्भर करता है कि यह पहले से मौजूद है या नहीं, जो पुनरारंभ करना चाहिए। मैंने अब तक कुछ बार परीक्षण करने का प्रयास नहीं किया है। मैनुअल पुनः आरंभ प्रक्रिया की एक छोटी ख़बरदार डेमो नीचे:

IJ - boot dev tools manual restart

तरीके इस प्रक्रिया को स्वचालित करने के एक जोड़े हैं। आईजे में एक आर्टेफैक्ट को परिभाषित करने और फ़ाइल उत्पन्न करने के लिए एक पोस्ट-प्रोसेस चींटी कार्य का उपयोग करने के अलावा, आप ऐसी फ़ाइल उत्पन्न करने के लिए मेवेन (जिसे आप पहले से उपयोग कर रहे हैं) का उपयोग कर सकते हैं, लेकिन नकारात्मकता यह है कि आपको के बजाय maven compile का उपयोग करना होगा क्योंकि पुनर्निर्माण करते समय आईजे मैवेन का आह्वान नहीं करेगा (या मुझे अभी तक यह नहीं पता है कि)। एक सरल विन्यास based on the fact that कृपया नीचे:

(नोट: Maven 2.0.5 और बाद के संस्करण में, अनेक लक्ष्यों की एक चरण के लिए बाध्य कर उसी क्रम में क्रियान्वित कर रहे हैं के रूप में वे पोम घोषित किये गए हैं, की लेकिन कई उदाहरण एक ही प्लगइन समर्थित नहीं है। एक ही प्लगइन के कई उदाहरण एक साथ निष्पादित करने के लिए समूहित किए जाते हैं और मेवेन 2.0.11 और ऊपर में आदेश दिया जाता है)।

जैसे, the compiler plugin is by default bound to the compile phase, तो हम application.properties फ़ाइल (या कुछ और)

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
     <plugin> 
      <!-- first, compile all we need --> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.3</version> 
     </plugin> 
     <plugin> 
      <!-- then, generate the trigger-file so dev-tools will restart --> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <version>1.8</version> 
      <executions> 
       <execution> 
        <phase>compile</phase> 
        <configuration> 
         <tasks> 
          <copy file="${project.basedir}/src/main/resources/application.properties" 
            toFile="${project.basedir}/restarttrigger" overwrite="true" /> 
         </tasks> 
        </configuration> 
        <goals> 
         <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

इसके अलावा अद्यतन का उपयोग कर trigger-file उत्पन्न करने के लिए एक छोटा सा कार्य जोड़ने:

खोज रहे हैं FileSystemWatcher.scan() के स्रोतों पर, do-while लूप है जिसका अर्थ इस प्रकार किया जा सकता है: जबकि वहाँ अभी भी पिछले जाँच के बाद से फाइल सिस्टम पर चल रहे बदलता है कर रहे हैं, एक (विन्यास) समय के लिए प्रतीक्षा करें और फिर यह सत्यापित

private void scan() throws InterruptedException { 
    Thread.sleep(this.pollInterval - this.quietPeriod); 
    Map<File, FolderSnapshot> previous; 
    Map<File, FolderSnapshot> current = this.folders; 
    do { 
     previous = current; 
     current = getCurrentSnapshots(); 
     Thread.sleep(this.quietPeriod); 
    } 
    while (isDifferent(previous, current)); 
    if (isDifferent(this.folders, current)) { 
     updateSnapshots(current.values()); 
    } 
} 

documentation के अनुसार, quietPeriodspring.devtools.restart.quiet-period संपत्ति के माध्यम से विन्यास योग्य है, लेकिन यह भी उपर्युक्त उल्लेख स्रोत के अनुसार, यह से spring.devtools.restart.poll-interval के माध्यम से कॉन्फ़िगर करने योग्य मान होना चाहिए। इस प्रकार, सेटिंग्स के साथ प्रयोग करना, मैं के साथ एक सभ्य परिणाम मिला:

# Amount of time (in milliseconds) to wait between polling for classpath changes. 
spring.devtools.restart.poll-interval=3000 

# Amount of quiet time (in milliseconds) required without any classpath changes before a restart is triggered. 
spring.devtools.restart.quiet-period=2999 

अंत में, आप क्या आप सबसे अच्छा सूट करने के लिए उन मूल्यों को समायोजित करने के लिए सक्षम होना चाहिए।

फिर भी, यदि आप जिन स्रोतों को संशोधित कर रहे हैं वे स्थिर संसाधन हैं जैसे कि एफई जीयूआई पेज और आपकी आवश्यकताओं के आधार पर, शायद यह एक उपकरण का उपयोग करना बेहतर है जो उन्हें उनके स्थान से सेवा देता है, जैसे नोड या एक समान सरल http सर्वर ...

+0

Wahou बहुत अच्छा विवरण है, धन्यवाद। जैसा कि आप शायद अनुमान लगाते हैं, मैं अपनी प्रोजेक्ट को फिर से लोड करना चाहता हूं, हर बार फ़ाइल निर्माण/संशोधन नहीं चला सकता :( और मैंने इसे समझाया नहीं है लेकिन मैं 2 बाकी नियंत्रकों के साथ springboot का उपयोग करता हूं और अक्सर स्थिर फ़ाइलों के लिए पुनर्निर्माण की आवश्यकता होती है – Titmael

+0

I कोशिश की लेकिन समस्या को नहीं बदला: http: // stackoverflow।कॉम/ए/36839483/1243048 – Titmael

+1

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

0

की @ Morfic का जवाब मेरे लिए महान काम किया यह हिस्सा:

# Amount of time (in milliseconds) to wait between polling for classpath changes. 
spring.devtools.restart.poll-interval=3000 

# Amount of quiet time (in milliseconds) required without any classpath changes before a restart is triggered. 
spring.devtools.restart.quiet-period=2999 
संबंधित मुद्दे