docs: @Override
  	public void execute() throws BuildException {
  	
  	      
  		if (inputDirPath==null || outputDirPath==null) {
  			System.err.println("Usage: inputDir outputDir");
  			System.err.println("  inputDir is the source directory with existing ESA and JSON files.");
  			System.err.println("  outputDir is the target directory for the Maven repository to be generated.");
  			System.exit(1);
  		}
  
  		File inputDir = new File(inputDirPath);
  		File outputDir = new File(outputDirPath);
  		
  		System.out.println("Input dir: " + inputDir.getAbsolutePath());
  		System.out.println("Output dir: " + outputDir.getAbsolutePath());
  
  		File modifiedOpenLibertyJsonFile = null;
  		File modifiedWebsphereLibertyJsonFile = null;
  		try {
  			// initialize output dir
  			outputDir.mkdirs();
  			if (!outputDir.isDirectory()) {
  				throw new MavenRepoGeneratorException("Output dir " + outputDir + " could not be created or is not a directory.");
  			}
  			
  			// parse Open Liberty features JSON
  			Map<String, LibertyFeature> allFeatures = new HashMap<String, LibertyFeature>();
  			if (openLibertyJson != null) {
  				File openLibertyJsonFile = new File(openLibertyJson);
  				try {
  					modifiedOpenLibertyJsonFile = File.createTempFile(openLibertyJsonFile.getName(), Constants.ArtifactType.JSON.getLibertyFileExtension());
  				} catch (IOException e) {
  				 	throw new MavenRepoGeneratorException("Could not create temporary file", e);
  				}
  				allFeatures.putAll(parseFeaturesAndCreateModifiedJson(openLibertyJsonFile, modifiedOpenLibertyJsonFile, false));
  				  		
  			}
  			// parse WebSphere Liberty features JSON
  			if (websphereLibertyJson != null) {
  				File websphereLibertyJsonFile = new File(websphereLibertyJson);
  				try {
  					modifiedWebsphereLibertyJsonFile = File.createTempFile(websphereLibertyJsonFile.getName(), Constants.ArtifactType.JSON.getLibertyFileExtension());
  				} catch (IOException e) {
  					throw new MavenRepoGeneratorException("Could not create temporary file", e);
  				}
  				
  				allFeatures.putAll(parseFeaturesAndCreateModifiedJson(websphereLibertyJsonFile, modifiedWebsphereLibertyJsonFile, true));
  				  			
  			}
  			
  			// for each LibertyFeature
  			for (LibertyFeature feature : allFeatures.values()) {
  				if (websphereLibertyJson != null && !feature.isWebsphereLiberty()) {
  					// if WebSphere Liberty build, only output WebSphere Liberty artifacts
  					continue;
  				}
  				
  				// copy ESA to target dirs
  				copyArtifact(inputDir, outputDir, feature, Constants.ArtifactType.ESA);
  
  				List<MavenCoordinates> featureCompileDependencies = getFeatureCompileDependencies(inputDir, feature);
  
  				// generate POM in target dir with list of dependencies
  				generatePom(feature, featureCompileDependencies, allFeatures, outputDir, Constants.ArtifactType.ESA);
  			}
  			
  			String version;
  			if (releaseVersion == null) {
  				// Use the first found feature version to determine product version
  				LibertyFeature firstFeature = allFeatures.values().iterator().next();
  				version = firstFeature.getProductVersion();
  
  				// Sanity check: ensure all of the feature versions are the same
  				for (LibertyFeature feature : allFeatures.values()) {
  					if (!version.equals(feature.getProductVersion())) {
  						log("Product versions do not match for features " + firstFeature.getSymbolicName() + ":" + version + " and " + feature.getSymbolicName() + ":" + feature.getProductVersion(), LogLevel.WARN.getLevel());
  					}
  				}
  			} else {
  				version = releaseVersion;
  				
  				// Sanity check: ensure all of the feature versions are the same
  				for (LibertyFeature feature : allFeatures.values()) {
  					if (!version.equals(feature.getProductVersion())) {
  						log("Product versions do not match. Expected release version " + version + ", actual feature and version " + feature.getSymbolicName() + ":" + feature.getProductVersion(), LogLevel.WARN.getLevel());
  					}
  				}
  			}
  			
  		
  			// Copy JSON artifacts and generate POMs for either Open or WebSphere Liberty	
  			//generate Bill of Materials for either Open or WebSphere Liberty
  			if (websphereLibertyJson == null) {
  				copyJsonArtifact(modifiedOpenLibertyJsonFile, outputDir, version, false);
  				generateJsonPom(outputDir, version, false);
  				generateBOM(false,version,outputDir,allFeatures,Constants.ArtifactType.ESA);
  
  			} else {
  				copyJsonArtifact(modifiedWebsphereLibertyJsonFile, outputDir, version, true);
  				generateJsonPom(outputDir, version, true);
  				generateBOM(true,version,outputDir,allFeatures,Constants.ArtifactType.ESA);
  
  			}
  						
  
  			System.out.println("Successfully generated Maven artifacts from Liberty features.");
  		} catch (MavenRepoGeneratorException e) {
  			System.out.println("Failed to generate Maven artifacts from Liberty features. Exception: " + e.getMessage());
  			e.printStackTrace();
  			System.exit(1);
  		} catch (IOException e) {
  			System.out.println("Failed to generate BOM from Liberty features. Exception: " + e.getMessage());
  			e.printStackTrace();
  			System.exit(1);
  		}
  
  	}