DRAFT
Micronaut applications can be run in automatic restart mode. In this mode, a change to a project source will trigger
- compilation
- packaging
- application restart
This run mode is not suitable for debugging, as the developer routinely modifies the underlying source, and (seemingly random) restarts would break the debugging context. There still needs to be a "traditional" run mode for work scenarios, where (random) restarts implied by source changes could be harmful, e.g. when the worked-on app maintains some connections to other services, or keeps some context.
The actual implementation should be always delegated to the underlying build/launch system.
- gradle supports continous build mode with -t parameter to the gradle launcher
- maven is extended by micronaut plugin and goal mn:run to do the same
Project Action
A new project action Continuous Run will be defined to handle this special action. Both Maven and Gradle project support action configuration mapping, so implementation in both Gradle and Maven will just provide an action mapping for the new project action. The project action itself should be defined in
- Gradle Projects module: as -t is a Gradle feature, this will enable its use in other Gradle projects, not just Micronaut.
- Micronaut module (for Maven): Maven does not support it itself, but Micronaut's plugin does. Possibly, to reduce dependencies, micronaut.maven bridge module could be created.
This Project Action can be then invoked programmatically, apart from the project UI itself, by a LSP client, too.
Since the action can be seen as a replacement for traditional Run (depending on project characteristics and user's preferred workflow), it should be configurable as the default Run action, responding for
- ActionProvider.COMMAND_RUN,
- ActionProvider.COMMAND_RUN_SINGLE.
Need to define how an (abstract) "Run" action can be remapped to a different action ("run-continuous") defined in nbactions.xml.
Display Action in the UI
Neither Gradle or Maven support adding technology-specific actions in the project UI. Even if the action is defined in nbactions.xml, it will not appear anywhere in the popup menu, except for custom actions (having CUSTOM- prefix in their action name; maven only). In this case, I would like to display the Continuous Run action alongside the Run and Debug.
- Gradle supports the --continuous flag from version 4.0.x (7 / 2017), so it seems pretty safe to add that action unconditionally to the project menu. There are some limitations documented, the action could warn the user for the 1st time the action is used, if it encounters such an environment.
- The action should not be present for other than micronaut projects (those which contain MN plugin) in Maven.
Need to define a representation of such configuration in the UI. An alternative would be a menu item that
- executes on click,
- can display a submenu which contains
- Run once
- Run continuous
- the new state would be remembered
Adding technology-specific actions
Common actions for a project type are placed in Projects/<project-type-id>/Actions. These actions are displayed in the Project's context menu in the filesystem-defined order. I propose to define a layer API that would include also actions from Projects/<project-type-id>/plugin-id/Actions for all plugins participating on the project:
- plugins referenced in the build.gradle,
- plugins configured by active profiles of the maven project
Allowing to extend the main project menu may lead to its explosion with many added actions for each technology. A standard grouping action should be created in the OpenAPI and documented, so a technology may eventually add its action into a subgroup. This will not be part of the initial implementation, but could be added later. Note that by default, the Lookups.forPath() collects the whole .../Actions subtree (traversing into subfolders).