Groups/Actions un/registration and resources cleanup

I have developed Git Churn plugin (repo: GitHub - j-plugins/git-churn-plugin: Intellij IDEA Plugin provides Git Churn statistics), which registers a few actions in a group to the Project View settings menu:

It works well, but users complain that it doesn’t appear when they install the plugin.

I confirm that the group doesn’t appear there after the plugin installed, but after the ide restarted.

Moreover, I tried to unload the plugin and open that settings menu afterwards and caught an exception:

Looks my actions aren’t unregistered from the menu and I should do it manually, but if I register the group in the top menu element Git (with VcsGroups group id) everything works well and no errors are found:

Later I found several lines in the sandbox logs:

2025-11-11 12:05:40,971 [  70250]   INFO - #c.i.AbstractBundle - Cannot load resource bundle from *.properties file, falling back to slow class loading: messages.GitChurnBundle

Is it ok for gradle based projects?

The original error stacktrace and a few log lines before it:

2025-11-11 12:05:10,552 [  39831]   INFO - #c.i.AbstractBundle - Cannot load resource bundle from *.properties file, falling back to slow class loading: messages.GitChurnBundle
2025-11-11 12:05:10,560 [  39839] SEVERE - #c.i.i.p.PluginManager - Can't find bundle for base name messages.GitChurnBundle, locale en_US
java.util.MissingResourceException: Can't find bundle for base name messages.GitChurnBundle, locale en_US
	at java.base/java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:2059)
	at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1697)
	at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1600)
	at java.base/java.util.ResourceBundle.getBundle(ResourceBundle.java:1283)
	at com.intellij.AbstractBundle$Companion.resolveResourceBundleWithFallback(AbstractBundle.kt:86)
	at com.intellij.DynamicBundle.resolveResourceBundle(DynamicBundle.java:303)
	at com.intellij.DynamicBundle.lambda$getResourceBundle$4(DynamicBundle.java:272)
	at java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:330)
	at com.intellij.DynamicBundle.getResourceBundle(DynamicBundle.java:272)
	at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.registerPluginActions$lambda$7(ActionManagerImpl.kt:365)
	at com.intellij.openapi.actionSystem.impl.ActionManagerImplKt.computeActionText(ActionManagerImpl.kt:1576)
	at com.intellij.openapi.actionSystem.impl.ActionManagerImplKt.configureGroupDescriptionAndIcon$lambda$17(ActionManagerImpl.kt:1725)
	at com.intellij.openapi.actionSystem.Presentation.lambda$getTextWithMnemonic$6(Presentation.java:183)
	at com.intellij.openapi.actionSystem.Presentation.lambda$setFallbackPresentationText$9(Presentation.java:246)
	at com.intellij.openapi.actionSystem.Presentation.getText(Presentation.java:145)
	at com.intellij.openapi.actionSystem.Presentation.getText(Presentation.java:141)
	at com.intellij.openapi.actionSystem.impl.Utils.filterInvisible(Utils.kt:633)
	at com.intellij.openapi.actionSystem.impl.Utils.fillMenuInner(Utils.kt:543)
	at com.intellij.openapi.actionSystem.impl.Utils.fillMenu$intellij_platform_ide_impl(Utils.kt:476)
	at com.intellij.openapi.actionSystem.impl.Utils.fillPopupMenu(Utils.kt:435)
	at com.intellij.openapi.actionSystem.impl.ActionPopupMenuImpl$MyMenu.updateChildren(ActionPopupMenuImpl.java:170)
	at com.intellij.openapi.actionSystem.impl.ActionPopupMenuImpl$MyMenu.show(ActionPopupMenuImpl.java:126)
	at com.intellij.toolWindow.ToolWindowHeader$ShowOptionsAction.actionPerformed(ToolWindowHeader.kt:347)
	at com.intellij.openapi.actionSystem.impl.ActionButton.actionPerformed(ActionButton.java:239)
	at com.intellij.openapi.actionSystem.impl.ActionButton.lambda$performAction$2(ActionButton.java:219)
	at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.performWithActionCallbacks(ActionManagerImpl.kt:1167)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareWithCallbacks(ActionUtil.kt:405)
	at com.intellij.openapi.actionSystem.impl.ActionButton.performAction(ActionButton.java:219)
	at com.intellij.openapi.actionSystem.impl.ActionButton.processMouseEvent(ActionButton.java:535)
	at java.desktop/java.awt.Component.processEvent(Component.java:6438)
	at java.desktop/java.awt.Container.processEvent(Container.java:2266)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5043)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4871)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4963)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4577)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4518)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2810)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4871)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:783)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:728)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:98)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:755)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:753)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:752)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:585)
	at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.kt:530)
	at com.intellij.ide.IdeEventQueue._dispatchEvent$lambda$16(IdeEventQueue.kt:473)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteIntentReadAction$lambda$6(AnyThreadWriteThreadingSupport.kt:274)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWithTemporaryThreadLocal(AnyThreadWriteThreadingSupport.kt:204)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteIntentReadAction(AnyThreadWriteThreadingSupport.kt:274)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runPreventiveWriteIntentReadAction(AnyThreadWriteThreadingSupport.kt:218)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:473)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12$lambda$11$lambda$10$lambda$9(IdeEventQueue.kt:307)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:864)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12$lambda$11$lambda$10(IdeEventQueue.kt:306)
	at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$3(IdeEventQueue.kt:958)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:117)
	at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:958)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12(IdeEventQueue.kt:301)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:341)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

I also tried to use Disposer and Disposable | IntelliJ Platform Plugin SDK instruction, but cannot find the place where I can find that stacktrace.

Any thoughts what goes wrong?

Hi,

I can reproduce the plugin behaviour: the main menu is shown, but the secondary action is not available until restart.

As a remedy, declare that your plugin requires a restart by addingrequire-restart="true" for <idea-plugin> root tag in plugin.xml.

Thanks for reply @robert.novotny

Can I expect this to be fixed in a future update?

Is there a way to force a component re-render instead of restarting the IDE?

I have created an issue IJPL-218830 along with a minimum reproducible example. It looks like a Platform issue - thanks for observing that!

For now, I do not have enough knowledge to advise on the component-rerender.

1 Like