2016-04-29 276 views
8

我正在使用最新的IntelliJ IDEA(2016.1.1) - ,但我在以前的版本中也看到過這種行爲 - 在Scala中使用最新的Scala插件(3.0.3 )。IntelliJ無法連接到它自己的Scala編譯服務器

當我嘗試運行/調試測試或代碼時,IDEA將開始製作項目,但隨後「製作」進度欄根本沒有進展,但會停留在那裏幾秒鐘。

的這20-30秒後,下面的消息出現在郵件選項卡:

警告:斯卡拉:無法連接在本地主機 /127.0.0.1編譯服務器:59656嘗試沒有它編譯

有顯示,59656的端口,是我硬編碼自己在%USER_PROFILE%\.IntelliJIdea2016.1\config\options\scala.xml後,我第一次在默認端口上注意到了這個問題,所以在更改端口沒有幫助的端口...

此時,在實際運行代碼之前,條會讀取「Reading compilation settings ...」幾十秒。這是非常困擾,我似乎無法明確地修復它。這很容易花費3分鐘來運行單個測試。非常擾亂。我注意到這個問題在我的工作機器(Win7)上間歇性地發生。

任何人有任何想法如何調試/解決這個問題?

感謝

+1

也發生在Linux中。 –

+0

我在Windows 7上也遇到過這個問題。升級到Windows 8.1(現在是10)之後,它消失了(到目前爲止)。 –

+0

也發生在OSX上。 – richj

回答

2

我不完全理解這個呢,然而在首選項,語言&框架> Scalac服務器也有一些設置,可以幫助:

  • 關閉服務器,如果是閒置<號碼>分鐘。
  • 利用項目作爲家庭服務器編譯工作目錄
  • JVM SDK用於實例編譯服務器...(編譯服務器將在一個新的項目的每個編譯重新啓動)(當JVM SDK和模塊SDK匹配)。

IntelliJ窗口右下方有一個小圖標,指示編譯服務器是否正在運行並可用於停止和啓動它。

如果服務器空閒,服務器將關閉。通常應該在需要時啓動,但如果JVM SDK與模塊SDK不匹配,則可能不會發生這種情況。增加空閒超時應該有助於減少問題發生的頻率。將JVM SDK與Module SDK相匹配應該可以解決這個問題,但如果您有多個使用不同SDK的項目,則可能無法解決問題。

如果您經常在項目之間切換,將項目主頁用作編譯器服務器工作目錄可能會有所幫助。

編輯

我用的IntelliJ IDEA終極2016年3月2日,但乾淨關閉的常用方法,並重新啓動沒有工作再有這樣的問題。我編寫了關於編譯服務器如何工作的一些信息,在我看來,IntelliJ正在尋找編譯服務器的錯誤端口。如果我手動強制make,那麼我可以看到一個編譯服務器正在運行,但它不是IntelliJ正在尋找的那個。我仍然沒有解決方案,但這些信息可能會讓我們更接近一個。

查找文件

的第一步是制定出其中的IntelliJ存儲它的配置和日誌文件。此信息目前公佈在這裏:IntelliJ Directories

我的Mac上,這意味着:

  • 配置文件:〜/庫/首選項/ IntelliJIdea2016.3 /選項
  • 日誌文件:〜/圖書館/日誌/ IntelliJIdea2016.3

編譯服務器

編譯服務器是一個很長的命令行Java進程,像這樣結束:

org.jetbrains.jps.cmdline.BuildMain <host> <port> <compile-server-id> <compile-server-cache-directory> 

選項都存儲在配置〜/庫/首選項/ IntelliJIdea2016.3 /選項/ scala.xml

有些在首選項 - >語言&框架 - > Scala編譯器服務器對話框中配置,但可以通過編輯文件添加其他設置。目前礦看起來像這樣:

<application> 
    <component name="ScalaSettings"> 
    <option name="COMPILE_SERVER_PORT" value="59184" /> 
    <option name="COMPILE_SERVER_ID" value="93f4589e-4707-4e20-a05a-01869045e067" /> 
    <option name="COMPILE_SERVER_SDK" value="1.8" /> 
    <option name="COMPILE_SERVER_MAXIMUM_HEAP_SIZE" value="2048" /> 
    </component> 
</application> 

我手工添加的COMPILER_SERVER_PORT選項,但這個版本的IntelliJ的,它使用單彙編編譯服務器有不同的端口和ID。不幸的是,如果我更改COMPILER_SERVER_PORT並重新啓動IntelliJ,則此過程使用不同的端口,因此我認爲這些是兩個單獨的實例。

我用這個命令來查找編譯服務器過程中,經過手動啓動編譯:

ps -ef | grep nailgun 

此命令查找的IntelliJ使用的端口:

lsof -i | grep idea 

還有一個日誌文件這裏:

~/Library/Logs/IntelliJIdea2016.3/idea.log 

這表明某事不太對勁:

2016-12-28 10:19:46,745 [ 50710] INFO - j.compiler.server.BuildManager - BUILDER_PROCESS [stdout]: Build process started. Classpath: /Users/richard/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/163.10154.41/IntelliJ IDEA.app/Contents/lib/jps-launcher.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/lib/tools.jar:/Users/richard/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/163.10154.41/IntelliJ IDEA.app/Contents/lib/optimizedFileManager.jar 
2016-12-28 10:59:43,958 [2447923] INFO - ij.compiler.impl.CompileDriver - COMPILATION STARTED (BUILD PROCESS) 
2016-12-28 10:59:43,960 [2447925] INFO - j.compiler.server.BuildManager - Using preloaded build process to compile /Users/richard/workspace-scala 
2016-12-28 10:59:44,181 [2448146] ERROR - .impl.MessageBusConnectionImpl - java.lang.NullPointerException 
java.lang.RuntimeException: java.lang.NullPointerException 
    at com.intellij.openapi.application.impl.LaterInvocator.invokeAndWait(LaterInvocator.java:189) 
    at com.intellij.openapi.application.impl.ApplicationImpl.invokeAndWait(ApplicationImpl.java:662) 
    at com.intellij.openapi.application.impl.ApplicationImpl.invokeAndWait(ApplicationImpl.java:667) 
    at org.jetbrains.plugins.scala.extensions.package$$anonfun$invokeAndWait$1.apply$mcV$sp(package.scala:567) 
    at org.jetbrains.plugins.scala.extensions.package$.preservingControlFlow(package.scala:577) 
    at org.jetbrains.plugins.scala.extensions.package$.invokeAndWait(package.scala:566) 
    at org.jetbrains.plugins.scala.compiler.ServerMediator$$anon$1.buildStarted(ServerMediator.scala:42) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.util.messages.impl.MessageBusConnectionImpl.deliverMessage(MessageBusConnectionImpl.java:117) 
    at com.intellij.util.messages.impl.MessageBusImpl.doPumpMessages(MessageBusImpl.java:381) 
    at com.intellij.util.messages.impl.MessageBusImpl.pumpMessages(MessageBusImpl.java:368) 
    at com.intellij.util.messages.impl.MessageBusImpl.sendMessage(MessageBusImpl.java:347) 
    at com.intellij.util.messages.impl.MessageBusImpl.access$200(MessageBusImpl.java:42) 
    at com.intellij.util.messages.impl.MessageBusImpl$2.invoke(MessageBusImpl.java:230) 
    at com.sun.proxy.$Proxy117.buildStarted(Unknown Source) 
    at com.intellij.compiler.server.BuildManager$NotifyingMessageHandler.buildStarted(BuildManager.java:1435) 
    at com.intellij.compiler.server.DelegatingMessageHandler.buildStarted(DelegatingMessageHandler.java:18) 
    at com.intellij.compiler.server.DelegatingMessageHandler.buildStarted(DelegatingMessageHandler.java:18) 
    at com.intellij.compiler.server.BuildMessageDispatcher.sendBuildParameters(BuildMessageDispatcher.java:115) 
    at com.intellij.compiler.server.BuildManager.a(BuildManager.java:724) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at com.intellij.util.concurrency.BoundedTaskExecutor$2.run(BoundedTaskExecutor.java:210) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.NullPointerException 
    at org.jetbrains.plugins.scala.compiler.CompileServerLauncher$$anonfun$15.apply(CompileServerLauncher.scala:282) 
    at org.jetbrains.plugins.scala.compiler.CompileServerLauncher$$anonfun$15.apply(CompileServerLauncher.scala:282) 
    at scala.collection.TraversableLike$$anonfun$filterImpl$1.apply(TraversableLike.scala:259) 
    at scala.collection.immutable.Set$Set3.foreach(Set.scala:145) 
    at scala.collection.TraversableLike$class.filterImpl(TraversableLike.scala:258) 
    at scala.collection.TraversableLike$class.filter(TraversableLike.scala:270) 
    at scala.collection.AbstractTraversable.filter(Traversable.scala:104) 
    at org.jetbrains.plugins.scala.compiler.CompileServerLauncher$.org$jetbrains$plugins$scala$compiler$CompileServerLauncher$$jdkChangeRequired(CompileServerLauncher.scala:282) 
    at org.jetbrains.plugins.scala.compiler.CompileServerLauncher.start(CompileServerLauncher.scala:56) 
    at org.jetbrains.plugins.scala.compiler.CompileServerLauncher.tryToStart(CompileServerLauncher.scala:41) 
    at org.jetbrains.plugins.scala.compiler.ServerMediator$$anon$1$$anonfun$buildStarted$2.apply$mcV$sp(ServerMediator.scala:43) 
    at org.jetbrains.plugins.scala.extensions.package$$anonfun$invokeAndWait$1$$anon$16.run(package.scala:569) 
    at com.intellij.openapi.application.TransactionGuardImpl$6.run(TransactionGuardImpl.java:318) 
    at com.intellij.openapi.application.impl.LaterInvocator$1.run(LaterInvocator.java:166) 
    at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.a(LaterInvocator.java:417) 
    at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:401) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at com.intellij.ide.IdeEventQueue.b(IdeEventQueue.java:843) 
    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:679) 
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:391) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
2016-12-28 10:59:44,183 [2448148] ERROR - .impl.MessageBusConnectionImpl - IntelliJ IDEA 2016.3.2 Build #IU-163.10154.41 
2016-12-28 10:59:44,183 [2448148] ERROR - .impl.MessageBusConnectionImpl - JDK: 1.8.0_112-release 
2016-12-28 10:59:44,183 [2448148] ERROR - .impl.MessageBusConnectionImpl - VM: OpenJDK 64-Bit Server VM 
2016-12-28 10:59:44,183 [2448148] ERROR - .impl.MessageBusConnectionImpl - Vendor: JetBrains s.r.o 
2016-12-28 10:59:44,183 [2448148] ERROR - .impl.MessageBusConnectionImpl - OS: Mac OS X 
2016-12-28 10:59:44,183 [2448148] ERROR - .impl.MessageBusConnectionImpl - Last Action: CompileDirty 
2016-12-28 10:59:48,828 [2452793] INFO - lij.compiler.impl.CompilerUtil -  COMPILATION FINISHED (BUILD PROCESS); Errors: 0; warnings: 1 took 4878 ms: 0 min 4sec 

CompileServerLauncher.scala表示這是事做不能夠找到一個JDK 8使用,但如果它不能找到一個看起來像它應該有一個錯誤信息,而不是一個NullPointerException異常失敗。

+0

感謝您研究這個問題,我遇到了同樣的問題(在日誌中出現同樣的錯誤),很難找到關於它的很多信息。你有沒有更多的運氣來弄清楚什麼是錯的? –

+0

我沒有解決,但我升級到IntelliJ 2016.3.5,重新啓動後,Scala編譯服務器再次運行。我也升級到了JDK 1.8.0_112和Scala 2.12.1。也許一個或多個升級有幫助。同樣值得檢查的是,您的每個項目都使用JDK 8和/或Scala 2.12。我有一個配置設置項目,我也使用Java和Scala SDK進行了配置。 – richj

+0

我的Scala編譯器服務器配置了1GB的堆內存和2GB的Java編譯器。我想知道編譯服務器是否在分配其內存塊時遇到困難。該機器有16GB,即使有幾個高級Java進程在運行,通常也有一些備用。我不認爲是這樣,但是由於機器在重啓之間需要很長時間,所以即使總共有足夠的可用空間,也許沒有足夠大的內存塊。 – richj

0

我有同樣的問題。 我正在使用IntelliJ 2017.3。玩框架2.6。 Stb 0.13.15。 解決了在斯卡拉編譯服務器JVM參數添加-server -Xss1m: enter image description here

0

我有同樣的問題,它是由相互衝突的設置存儲庫和本地之間的偏好設置文件導致的。您的編譯服務器設置存儲在IDEA首選項目錄中的名爲scala.xml的文件中。

如果您使用「設置同步」,即聯機存儲庫來同步IDEA設置,請確保您只有一個scala.xml配置文件。轉到Library/Preferences/<IDEA-Dir>/並從optionssettingsRepository目錄中刪除該文件。這會重置爲「出廠設置」。

重新啓動IntelliJ,再次設置編譯服務器。它現在應該只寫一個文件,到settingsRepository目錄,爲編譯服務器分配一個新的ID和端口。

這爲我修好了。