@@ -287,8 +287,6 @@ private async Task<IObservable<ProcessRequest>> RunMavenCliDetectionAsync(
287287
288288 var pomFile = processRequest . ComponentStream ;
289289 var pomDir = Path . GetDirectoryName ( pomFile . Location ) ;
290- var depsFileName = this . mavenCommandService . BcdeMvnDependencyFileName ;
291- var depsFilePath = Path . Combine ( pomDir , depsFileName ) ;
292290
293291 // Generate dependency file using Maven CLI.
294292 var result = await this . mavenCommandService . GenerateDependenciesFileAsync (
@@ -297,37 +295,7 @@ private async Task<IObservable<ProcessRequest>> RunMavenCliDetectionAsync(
297295
298296 if ( result . Success )
299297 {
300- // CLI succeeded - read the generated deps file
301- // We read the file here (rather than in MavenCommandService) to avoid
302- // unnecessary I/O for callers that scan for files later.
303- string depsFileContent = null ;
304- if ( this . fileUtilityService . Exists ( depsFilePath ) )
305- {
306- depsFileContent = this . fileUtilityService . ReadAllText ( depsFilePath ) ;
307- }
308-
309- if ( ! string . IsNullOrEmpty ( depsFileContent ) )
310- {
311- Interlocked . Increment ( ref cliSuccessCount ) ;
312- results . Add ( new ProcessRequest
313- {
314- ComponentStream = new ComponentStream
315- {
316- Stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( depsFileContent ) ) ,
317- Location = depsFilePath ,
318- Pattern = depsFileName ,
319- } ,
320- SingleFileComponentRecorder = this . ComponentRecorder . CreateSingleFileComponentRecorder (
321- Path . Combine ( pomDir , MavenManifest ) ) ,
322- } ) ;
323- }
324- else
325- {
326- // CLI reported success but deps file is missing or empty - treat as failure
327- Interlocked . Increment ( ref cliFailureCount ) ;
328- failedDirectories . Add ( pomDir ) ;
329- this . LogWarning ( $ "Maven CLI succeeded but deps file not found or empty: { depsFilePath } ") ;
330- }
298+ Interlocked . Increment ( ref cliSuccessCount ) ;
331299 }
332300 else
333301 {
@@ -376,9 +344,35 @@ await this.RemoveNestedPomXmls(processRequests, cancellationToken).ForEachAsync(
376344 // Determine detection method based on results
377345 this . DetermineDetectionMethod ( cliSuccessCount , cliFailureCount ) ;
378346
379- this . LogDebug ( $ "Maven CLI processing complete: { cliSuccessCount } succeeded, { cliFailureCount } failed out of { this . originalPomFiles . Count } root pom.xml files.") ;
347+ this . LogDebug ( $ "Maven CLI processing complete: { cliSuccessCount } succeeded, { cliFailureCount } failed out of { this . originalPomFiles . Count } root pom.xml files. Retrieving generated dependency graphs.") ;
348+
349+ // Use original MvnCliComponentDetector approach: scan entire source directory for ALL generated dependency files
350+ // This ensures we find dependency files from submodules even if Maven CLI was only run on parent pom.xml
351+ var allGeneratedDependencyFiles = this . ComponentStreamEnumerableFactory
352+ . GetComponentStreams (
353+ this . CurrentScanRequest . SourceDirectory ,
354+ [ this . mavenCommandService . BcdeMvnDependencyFileName ] ,
355+ this . CurrentScanRequest . DirectoryExclusionPredicate )
356+ . Select ( componentStream =>
357+ {
358+ // Read and store content to avoid stream disposal issues
359+ using var reader = new StreamReader ( componentStream . Stream ) ;
360+ var content = reader . ReadToEnd ( ) ;
361+ return new ProcessRequest
362+ {
363+ ComponentStream = new ComponentStream
364+ {
365+ Stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( content ) ) ,
366+ Location = componentStream . Location ,
367+ Pattern = componentStream . Pattern ,
368+ } ,
369+ SingleFileComponentRecorder = this . ComponentRecorder . CreateSingleFileComponentRecorder (
370+ Path . Combine ( Path . GetDirectoryName ( componentStream . Location ) , MavenManifest ) ) ,
371+ } ;
372+ } ) ;
380373
381- return results . ToObservable ( ) ;
374+ // Combine dependency files from CLI success with pom.xml files from CLI failures
375+ return results . Concat ( allGeneratedDependencyFiles ) . ToObservable ( ) ;
382376 }
383377
384378 protected override Task OnFileFoundAsync (
0 commit comments