@@ -438,6 +438,7 @@ private enum FileTrackMode {
438438 private boolean generateToSrc ;
439439 private Set <String > generatedFeaturesSet ; // set of features in generated-features.xml file
440440 private boolean generatedFeaturesModified ;
441+ private boolean generatedFeaturesCopied ;
441442 private Set <String > compileArtifactPaths ;
442443 private Set <String > testArtifactPaths ;
443444 protected File generateFeaturesFile ; // the file that is created from the generate-features goal/task
@@ -565,6 +566,7 @@ public DevUtil(File buildDirectory, File serverDirectory, File sourceDirectory,
565566 this .testArtifactPaths = testArtifactPaths ;
566567 this .monitoredWebResourceDirs = monitoredWebResourceDirs ;
567568 this .generatedFeaturesModified = false ;
569+ this .generatedFeaturesCopied = false ;
568570 if (this .generateFeatures ) {
569571 this .generatedFeaturesSet = getGeneratedFeatures ();
570572 } else {
@@ -580,6 +582,9 @@ private void initGenerationContext() {
580582
581583 public void copyGeneratedFeaturesFile (File destinationDir ) throws IOException {
582584 copyFile (generateFeaturesFile , generateFeaturesOutputDir , destinationDir , null );
585+ if (destinationDir .equals (serverDirectory )) {
586+ generatedFeaturesCopied = true ; // features copied into server dir and not some temp dir
587+ }
583588 }
584589 /**
585590 * Run unit and/or integration tests
@@ -4673,14 +4678,26 @@ private void processConfigFileChange(File fileChanged, ChangeType changeType, Th
46734678 System .setProperty (SKIP_BETA_INSTALL_WARNING , Boolean .TRUE .toString ());
46744679 installFeaturesToTempDir (fileChanged , fileChangedParentDir , targetFileName , generateFeaturesSuccess );
46754680 }
4676- copyFile (fileChanged , fileChangedParentDir , serverDirectory , targetFileName );
4677-
4678- // if the generated features file was modified as a result of another config
4679- // file modification, copy it over to target so the server picks up the changes
4680- // together
4681+ // Copy the config file which was changed to the server directory unless it is
4682+ // the generated features file. The generated features file may have been copied
4683+ // to the server directory already as a result of a change to the build file (pom.xml)
4684+ // or the server.xml.
4685+ if (!isGeneratedFeaturesFile ) { // all other config files
4686+ copyFile (fileChanged , fileChangedParentDir , serverDirectory , targetFileName );
4687+ } else {
4688+ if (!generatedFeaturesCopied ) {
4689+ copyGeneratedFeaturesFile (serverDirectory );
4690+ }
4691+ generatedFeaturesCopied = false ;
4692+ }
4693+ // If the generated features file was modified as a result of another config file modification
4694+ // (usually server.xml), copy it over to target so the server picks up the two changes together
46814695 if (generateFeaturesSuccess && generatedFeaturesModified && !isGeneratedFeaturesFile ) {
4682- // this logic is not entered if the fileChanged is the generated features file
4683- // copy generated features file to server dir
4696+ // This logic is not entered if the fileChanged is the generated features file.
4697+ // Copy generated features file to server dir and set generatedFeaturesCopied true
4698+ // (not referring to generatedFeaturesModified).
4699+ // Leave generatedFeaturesCopied true because the call to optimize/incrementalGenerateFeatures that was
4700+ // required to get into this IF block will also generate a file change event for generatedFeaturesFile
46844701 copyGeneratedFeaturesFile (serverDirectory );
46854702 generatedFeaturesModified = false ;
46864703 }
0 commit comments