简体   繁体   中英

Building effective model with DefaultModelBuilder . build()

I'm trying to get a effective model for a project and currently under the Maven Core API 3.0.3 (or 3.0.4) there's this method called build() which is neat BUT..

it requires too much like ModelNormalizer, ProfileInjector etc for it not to throw null pointer exception while building. There's so much things that need initialization before I can build the effective model and all the information I have is a filepath to the pom.xml

Anyone has work this out?

Here is sample code:

    DefaultModelBuilder modelBuilder = new DefaultModelBuilderFactory().newInstance();

    ModelBuildingRequest req = new DefaultModelBuildingRequest();
    req.setProcessPlugins(false);
    req.setPomFile(file);
    req.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
    req.setModelResolver(new MyLocalModelResolver());

    Model model = modelBuilder.build(req).getEffectiveModel();

Yes it works for me. I have to set all data with default values. Very annoying...

I have created a MavenModelBuilder builder class for that

/**
 * Default MavenModelBuilder.
 */
public class MavenModelBuilder  extends DefaultModelBuilder {

  /**
   * Constructor
   */
  public MavenModelBuilder() {
    super();
    ModelProcessor modelProcessor = new DefaultModelProcessor()
        .setModelLocator(new DefaultModelLocator())
        .setModelReader(new DefaultModelReader());

    ModelInterpolator modelInterpolator = new StringSearchModelInterpolator()
        .setPathTranslator(new DefaultPathTranslator())
        .setUrlNormalizer(new DefaultUrlNormalizer());

    setProfileSelector(new DefaultProfileSelector());
    setModelProcessor(modelProcessor);
    setModelValidator(new DefaultModelValidator());
    setSuperPomProvider(new DefaultSuperPomProvider().setModelProcessor(modelProcessor));
    setModelNormalizer(new DefaultModelNormalizer());
    setInheritanceAssembler(new DefaultInheritanceAssembler());
    setModelInterpolator(modelInterpolator);
    setModelUrlNormalizer(new DefaultModelUrlNormalizer().setUrlNormalizer(new DefaultUrlNormalizer()));
    setModelPathTranslator(new DefaultModelPathTranslator().setPathTranslator(new DefaultPathTranslator()));
    setPluginManagementInjector(new DefaultPluginManagementInjector());
    setLifecycleBindingsInjector(new DefaultLifecycleBindingsInjector());
    setDependencyManagementInjector(new DefaultDependencyManagementInjector());
    setReportConfigurationExpander(new DefaultReportConfigurationExpander());
    setReportingConverter(new DefaultReportingConverter());
    setPluginConfigurationExpander(new DefaultPluginConfigurationExpander());
    setDependencyManagementImporter(new DefaultDependencyManagementImporter());
    setProfileInjector(new DefaultProfileInjector());
  }

}

And i call it like this

  /**
   * Parse the xml file to get the model of the xml file.
   *
   * @param path of the project
   * @throws IllegalArgumentException : exception
   */
  public static Model parseFile(String path) throws IllegalArgumentException {
    DefaultModelBuilder builder = new MavenModelBuilder();

    ModelBuildingRequest req = new DefaultModelBuildingRequest();
    req.setProcessPlugins(false);
    req.setPomFile(new File(path));
    req.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);

    Model model = null;
    try {
      model = builder.build(req).getEffectiveModel();
    } catch (ModelBuildingException e) {
      e.printStackTrace();
    }

    return model;
  }

Maybe this library can help: https://github.com/jenkinsci/lib-jenkins-maven-embedder

Or at least as a sample.

hth

Olivier

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM