jorsol commented on code in PR #172:
URL:
https://github.com/apache/maven-compiler-plugin/pull/172#discussion_r1096226503
##########
src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java:
##########
@@ -1733,30 +1740,46 @@ protected boolean isDependencyChanged()
fileExtensions = Collections.unmodifiableList( Arrays.asList(
"class", "jar" ) );
}
- Date buildStartTime = getBuildStartTime();
+ Instant buildStartTime = getBuildStartTime();
List<String> pathElements = new ArrayList<>();
pathElements.addAll( getClasspathElements() );
pathElements.addAll( getModulepathElements() );
for ( String pathElement : pathElements )
{
- File artifactPath = new File( pathElement );
- if ( artifactPath.isDirectory() || artifactPath.isFile() )
+ Path artifactPath = Paths.get( pathElement );
+
+ // Search files only on dependencies (other modules), not the
current project.
+ if ( Files.isDirectory( artifactPath ) && !artifactPath.equals(
getOutputDirectory().toPath() ) )
{
- if ( hasNewFile( artifactPath, buildStartTime ) )
+ try ( Stream<Path> walk = Files.walk( artifactPath ) )
Review Comment:
Now I understand your concern, but actually, right now that's exactly what
is happening, I'm NOT adding another source tree scanning, it was already
there, but it's written in a bit weird way with a recursive pattern:
https://github.com/apache/maven-compiler-plugin/blob/3f95d39f166809bc1a2bb0b2fa62c190e8d2a9f7/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java#L1784-L1792
I'm following a modern approach with the NIO2 Path API that should be more
efficient, so this refactor makes it obvious that it walks the generated
classes, now it should be clear and easier to understand (possibly fixing
[MCOMPILER-381](https://issues.apache.org/jira/browse/MCOMPILER-381) )
And regarding your concern, I make the refactoring in such a way that it no
longer needs to do the scanning for each step, previously the methods
`computeInputFileTreeChanges`, `isDependencyChanged`, `isSourceChanged`,
`hasInputFileTreeChanged` were executed eagerly every time, even if you detect
that there was a change in the previous step, now the evaluation of each method
is lazy, so if a dependency is changed it will not continue scanning for stale
sources or run the `hasInputFileTreeChanged` method.
I haven't really checked the `maven-shared-incremental` project, and it's
possible that all this logic should be moved and improved there, but as of
today I'm mostly refactoring the code that it's already here, yet I agree that
all of this incremental logic should be rewritten/refactored in such a way that
makes it easier to maintain than is right now.
Regarding the `large project` I have tested with the Quarkus project using
the following command changing only the `clean` goal and the
`version.compiler.plugin` version:
```bash
LANG=en_US.UTF-8 ./mvnw -q clean install
-Dversion.compiler.plugin=3.11.0-SNAPSHOT -DskipTests=true
-Dasciidoctor.skip=true -Dexec.skip=true -Dinvoker.skip=true
-Denforcer.skip=true -Dformatter.skip=true -Dimpsort.skip=true
-Dforbiddenapis.skip=true -Dprofile -DprofileFormat=HTML -DhideParameters=true
```
I'm not claiming that this change will be faster, but it should not have bad
performance either, this are some profiler reports:
[profile-report.zip](https://github.com/apache/maven-compiler-plugin/files/10582313/profile-report.zip)
yet this should be taken with a grain of salt, and in any case, you can do
some tests and check if you found any regression.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]