2013-10-26 17 views
1

Maven插件由於更新到Mac OS X小牛隊,我體驗,同時與Maven插件啓動谷歌的AppEngine Devserver一些嚴重的延遲。下面是從日誌文件的一個片段:延遲當谷歌開始的AppEngine devserver兼容Mac OS X小牛

1: Okt 26, 2013 10:46:16 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml 
2: INFO: Successfully processed /Users/Me/workspace/example/target/example-0.1-SNAPSHOT/WEB-INF/appengine-web.xml 
3: [INFO] Running /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/bin/java -XstartOnFirstThread -javaagent:/Users/Me/.m2/repository/com/google/appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sdk-1.8.6/lib/agent/appengine-agent.jar -Xbootclasspath/p:/Users/Me/.m2/repository/com/google/appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sdk-1.8.6/lib/override/appengine-dev-jdk-overrides.jar -Dappengine.fullscan.seconds=5 -classpath /Users/Me/.m2/repository/com/google/appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sdk-1.8.6/lib/appengine-tools-api.jar com.google.appengine.tools.development.DevAppServerMain --allow_remote_shutdown -a 0.0.0.0 /Users/Me/workspace/example/target/example-0.1-SNAPSHOT 
4: [INFO] objc[897]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined. 
5: [INFO] Okt 26, 2013 10:47:34 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml 

比較在第1行和本實施例的5時間戳(實際日誌當然要長得多,)。差異是78秒!幾乎所有的這個時候在第3行

這裏被消耗,爲了更好的可讀性,我有一次3行:

[INFO]運行/Library/Java/JavaVirtualMachines/jdk1.7.0_45。 jdk/Contents/Home/jre/bin/java -XstartOnFirstThread -javaagent:/Users/Me/.m2/repository/com/google/appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine- java-sdk-1.8.6/lib/agent/appengine-agent.jar -Xbootclasspath/p:/Users/Me/.m2/repository/com/google/appengine/appengine-java-sdk/1.8.6/appengine- java-sdk/appengine-java-sdk-1.8.6/lib/override/appengine-dev-jdk-overrides.jar -Dappengine.fullscan.seconds = 5 -classpath /Users/Me/.m2/repository/com/google /appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sd k-1.8.6/lib/appengine-tools-api.jar com.google.appengine.tools.development.DevAppServerMain --allow_remote_shutdown -a 0.0.0.0 /Users/Me/workspace/example/target/example-0.1-SNAPSHOT

我猜想,第4行與這個問題無關,它是something different,應該固定在1.7.0u60。

有沒有人有線索,這裏可能是錯誤的?

我懷疑,認爲它有一些東西需要與WiFi的問題,但即使禁用無線網絡連接和網絡喚醒(這是一個「老」的MacBook Pro有一個以太網端口),我遇到了同樣的問題。

[編輯]當我在第3行直接在終端執行命令,沒有延遲。但是對於maven來說,這有一個延遲。我試過多次,一個和其他方式...

回答

0

OK,我找到了罪魁禍首。它在Appengine Maven插件類AbstractDevAppServerMojo中。

的原因是,這一點 - 這是新的我 - 插件首先嚐試停止正在運行的開發服務器。這是在這個方法來實現:只有

protected void stopDevAppServer() throws MojoExecutionException { 
    HttpURLConnection connection = null; 
    try { 
     Integer port = firstNonNull(this.port, 8080); 
     URL url = new URL("http", firstNonNull(address, "localhost"), port, "/_ah/admin/quit"); 
     connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setDoInput(true); 
     connection.setRequestMethod("POST"); 
     connection.getOutputStream().write(0); // <-- Problem is here! 
     ByteStreams.toByteArray(connection.getInputStream()); 
     connection.disconnect(); 
     getLog().warn("Shutting down devappserver on port " + port); 
     Thread.sleep(2000); 
    } catch (MalformedURLException e) { 
     throw new MojoExecutionException("URL malformed attempting to stop the devserver : " + e.getMessage()); 
    } catch (IOException e) { 
     getLog().debug("Was not able to contact the devappserver to shut it down. Most likely this is due to it simply not running anymore. ", e); 
    } catch (InterruptedException e) { 
     Throwables.propagate(e); 
    } 
    } 

的問題發生,如果開發服務器沒有運行。在這種情況下,URL不存在並且HttpUrlConnection等待超時。

解決方法是更改​​連接超時持續時間。例如,將其設置爲1秒:

 connection.setRequestMethod("POST"); 
     connection.setConnectTimeout(1000); 
     connection.getOutputStream().write(0); 

這個工作對我來說,它也應該爲別人打工,因爲開發服務器通常在同一臺機器上運行。 它也可以作爲配置參數來實現。

所以,它無關小牛(對不起,你懷疑,蘋果),但與Maven插件本身。或者,也許小牛隊的超時時間有所變化。

我對這個問題的解決方案?它只發生一次,否則開發服務器運行並被插件自動停止。現在對我來說已經夠好了。

[編輯]爲Maven插件創建了issue

+0

我知道這是1歲,但你能告訴我你正在運行哪個目標,導致插件自動停止正在運行的服務器嗎?當我使用已經運行的服務器運行'appengine:devserver'目標時,我得到'bind failed:Address already in use',並且它在啓動時仍然等待> 60s。 – tx802

+0

對於有此問題的其他人,我發現我可以通過評論'

0.0.0.0
'或禁用我的(OS X)防火牆來避免它。 – tx802