Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • 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 or Configuration

Using project Configurations

That's a question. The "Continuous run" is essentially a flavour, or variant of "Run" actions. With Gradle, "dev mode" can be applied to variety of actions:

  • Run (application)
  • Run single (specific class)
  • Test
  • Test single

to run and test. RunSingle

With Micronaut Maven plugin, however, only Run actions are supported. NetBeans Maven plugin support Configurations 

  • can redefine any project action 
  • can enable a profile

The downside is that project action definitions are completely independent: a change in main class, VM parameters or parameters must be copied over to all configuration(s) manually where the action is redefined: but that's not indicated at all to the user. Gradle does not support configurations at all. While Gradle plugin supports action mapping, similar to our Maven module, it does not contain the 2nd axis (configurations, profiles). If added, would be unique to the IDE (but profile-based action mapping in Maven is as well), without connection to the gradle build.

Continuous run acts as like a modifier on (certain) actions; it's a question how we handle a situation when there are more such modifiers that could be combined, i.e.

  • continuous run
  • logging
  • database connections

as each single is (now) represented by a Configuration - which do not combine or merge.

Separate Project Action(s)

A new project action Continuous Run can 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

...

Code Block
languagexml
    <action>
        <actionName>run.continuous</actionName>
        <packagings>
            <packaging>jar</packaging>
        </packagings>
<!--
		Maybe not necessary to add, if the MavenActionsProvider itself are registered specifically per-plugin

        <activation>
            <plugin>io.micronaut.build:micronaut-maven-plugin</plugin>
        </activation>
-->
        <goals>
            <goal>process-classes</goal>
            <goal>io.micronaut.build:micronaut-maven-plugin:2.0.0:run</goal>
        </goals>
        <properties>
            <mn.jvmArgs>${exec.vmArgs} -classpath %classpath</mn.jvmArgs>
            <mn.appArgs>${exec.appArgs</mn.appArgs>
            <exec.mainClass>${packageClassName}</exec.mainClass>
            <exec.executable>java</exec.executable>
        </properties>
    </action>

...


Display Action in the IDE

...

(plus) 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).

Access to "action" in LSP clients

Run-style actions should be handled by Debugger Adapter Protocol, and its Launch Request: this ensures the client is aware of the running process and can control (somwhat) the process' execution. From the client's point of view, the execution terminates only if the application fails, not until the process exits, which is consistent with how mn:run or gradle -t works. The Continuous Run feature will be specified by argument continuousExecution=true. The Launch handler should then modify the invoked project action from COMMAND_RUN to COMMAND_RUN_CONTINUOUS. 

Integration with VSCode

Launching run configurations

The java8+ launch type should be enhanced with either

  • continuousExecution : boolean | null, or
  • configuration : string | null, that would select the desired configuration known by LSP server
  • action: string | null, to select the (abstract) action
  • configurationParams: generic Map to support possible future launch extensions

The user may edit / change the Run configuration or create an additional one that executes the application in the "Continuous run" mode. Blank action would enable the same logic, as it is done now. Unhandled actions would get the FileObject of the active file in its actionLookup - that would eventually enable us to allow more flexibility through DAP protocol.

Access to run configurations

Run configurations extracted from the project would be served over LSP to DebugConfigurationProvider that should report them from provideDebugConfigurations. 

Project Actions - implementation

...

Action contributions

Action has to be contributed to the project based on plugin, This is supported with Gradle (but gradle has the action centralized in the core), but must be added to Maven.

RunJar support

Current "Run" operation relies on RunJar prerequisity checker and late-bound checker to step in, and supply necessary values for ${} variables referenced in the action config. The prerequisity checker checks for specific action IDs when activating. If Micronaut support defines Continuous Run as a different action ID, these checkers will not  be used, and the action may become broken: for example application args, VM args etc as seen in the Project Properties dialog will not be processed, StartupExtenders will not be collected etc. Two (or more ?) options here:

...

The simplest solution is to enhance the mn:run goal to support some 'exec.executable'-like (i.e. mn.executable) property with a similar semantics.

Gradle implementation

The current parameter-passing implementation could work, mostly, except that it also specifically checks for action IDs. Since Gradle supports Continuous run natively, the JavaExecTokenProvider could also check for the new action ID. But if action categorization (as outlined for Maven) is invented, it would benefit from that - more actions (even user custom ones) could be categorized as "run-like". Other than that, gradle support should work acceptably.

Currently gradle support in NetBeans lacks run configuration UI - the user cannot specify application arguments, JVM arguments, env variables or main class.

Configurations - implementation

Maven

Configurations are already there. We need to make ProjectConfigurationsProvider instances plugin-aware, similar to the ActionProvider scenario. With micronaut-maven-plugin a "Development mode" configuration would be magically pre-defined with suitable defaults. Users can override. The idea is:

  • make a configuration form each profile defined in effective POM

Gradle

Gradle itself does not support profiles, or any configurations. Maven profiles can be transposed into gradle using conditional inclusion of buildscript fragments.