| ~~ Licensed to the Apache Software Foundation (ASF) under one |
| ~~ or more contributor license agreements. See the NOTICE file |
| ~~ distributed with this work for additional information |
| ~~ regarding copyright ownership. The ASF licenses this file |
| ~~ to you under the Apache License, Version 2.0 (the |
| ~~ "License"); you may not use this file except in compliance |
| ~~ with the License. You may obtain a copy of the License at |
| ~~ |
| ~~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~~ |
| ~~ Unless required by applicable law or agreed to in writing, |
| ~~ software distributed under the License is distributed on an |
| ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| ~~ KIND, either express or implied. See the License for the |
| ~~ specific language governing permissions and limitations |
| ~~ under the License. |
| |
| --- |
| Getting to Plexus-configured Mojos |
| --- |
| John Casey |
| --- |
| 29-April-2005 |
| |
| Abstract |
| |
| We're moving toward integrating mojos as first-class plexus components, while |
| at the same time avoiding introducing required plexus dependencies into the |
| mojo development model. |
| |
| In order to really achieve this, we need mojo configurations (which are |
| provided both in terms of static expressions that are just looked up, and |
| in terms of user-provided configuration from system properties or the POM). |
| If these mojos are to be first-class components, the configuration from these |
| various sources must be consolidated and injected using the container. |
| |
| Currently, mojo configuration is done externally to the container, in the |
| DefaultPluginManager in the maven-core API. In order to get from here to |
| there, we need to do several things to add capability to the default |
| configuration of plexus. This document will detail those changes. |
| |
| Container Enhancements |
| |
| * ExpressionEvaluator |
| |
| Currently, the expression evaluator used to resolve configuration values |
| is the DefaultExpressionEvaluator, which is a local variable within the |
| implementation of the BasicComponentConfigurator. This ExpressionEvaluator |
| simply returns the expression itself as the resolved value, which adds |
| very little value to the container. Things like ${project.build.resources} |
| are not resolved, and result in a type mismatch for the member injection. |
| |
| We need a replacement for DefaultExpressionEvaluator that is capable of |
| traversing an object graph and extracting Object values, not just Strings. |
| |
| * ComponentConfigurator |
| |
| Currently, the container uses BasicComponentConfigurator, to configure |
| components. This wouldn't be a problem, except for the local instance of |
| DefaultExpressionEvaluator used within. See the above discussion for more |
| on why this evaluator is bad. We need to provide either an alternative |
| implementation under a different roleHint, or else replace the |
| BasicComponentConfigurator. |
| |
| * Other |
| |
| We may need to define a new lifecycle/phase to contextualize a mojo right |
| before it's used, and reset it's state afterward. Up to now, the approach |
| of most plexus components has been to avoid instance state like the plague. |
| With the current parameter passing model of mojos, this will not be possible, |
| particularly when we move mojos to a singleton instantiation model, and then |
| run a reactorized project...the successive calls may leave behind configuration |
| artifacts from invocation to invocation. |
| |
| Maven Modifications |
| |
| * DefaultPluginManager |
| |
| s/getMojoConfiguration()/getConfiguration()/g |
| |
| That should re-enable usage of mojo configuration. Ideally, we won't need any |
| of the code that references this method, since the container should provide |
| some way of recontextualizing the mojo, and all we would need to do is inject |
| POM configuration via the lookup method or something. |
| |
| * PluginDescriptorBuilder |
| |
| s/getMojoConfiguration()/getConfiguration()/g |
| |
| That should be all there is to it. |
| |
| * MojoDescriptor |
| |
| Remove set/getMojoConfiguration(..), as it will become obsolete. |
| |
| * MavenSession |
| |
| We may need to enable the context injection here, since this will be |
| instantiated per-project. If we always inject the same context parameters, |
| and are careful to inject nulls where things are missing, we should be |
| able to minimize reconfiguration artifacts injected from basic parameters. |
| |