[ https://issues.apache.org/jira/browse/MNG-7629?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17649075#comment-17649075 ]
ASF GitHub Bot commented on MNG-7629: ------------------------------------- mthmulders commented on code in PR #912: URL: https://github.com/apache/maven/pull/912#discussion_r1051655836 ########## maven-core/src/main/java/org/apache/maven/ReactorReader.java: ########## @@ -64,28 +63,21 @@ class ReactorReader implements MavenWorkspaceReader { public static final String HINT = "reactor"; - private static final Collection<String> COMPILE_PHASE_TYPES = - Arrays.asList("jar", "ejb-client", "war", "rar", "ejb3", "par", "sar", "wsr", "har", "app-client"); - private static final Logger LOGGER = LoggerFactory.getLogger(ReactorReader.class); private final MavenSession session; private final Map<String, MavenProject> projectsByGAV; private final Map<String, List<MavenProject>> projectsByGA; private final WorkspaceRepository repository; - private Function<MavenProject, String> projectIntoKey = - s -> ArtifactUtils.key(s.getGroupId(), s.getArtifactId(), s.getVersion()); - - private Function<MavenProject, String> projectIntoVersionlessKey = - s -> ArtifactUtils.versionlessKey(s.getGroupId(), s.getArtifactId()); - @Inject ReactorReader(MavenSession session) { this.session = session; - this.projectsByGAV = session.getAllProjects().stream().collect(toMap(projectIntoKey, identity())); + this.projectsByGAV = session.getAllProjects().stream() Review Comment: I don't see how this is necessary for this issue, but I think it is equivalent from a technical point of view. ########## maven-core/src/main/java/org/apache/maven/ReactorReader.java: ########## @@ -139,187 +132,75 @@ private File find(MavenProject project, Artifact artifact) { return project.getFile(); } - Artifact projectArtifact = findMatchingArtifact(project, artifact); - File packagedArtifactFile = determinePreviouslyPackagedArtifactFile(project, projectArtifact); - - if (hasArtifactFileFromPackagePhase(projectArtifact)) { - return projectArtifact.getFile(); - } - // Check whether an earlier Maven run might have produced an artifact that is still on disk. - else if (packagedArtifactFile != null - && packagedArtifactFile.exists() - && isPackagedArtifactUpToDate(project, packagedArtifactFile, artifact)) { - return packagedArtifactFile; - } else if (!hasBeenPackagedDuringThisSession(project)) { - // fallback to loose class files only if artifacts haven't been packaged yet - // and only for plain old jars. Not war files, not ear files, not anything else. - return determineBuildOutputDirectoryForArtifact(project, artifact); - } - - // The fall-through indicates that the artifact cannot be found; - // for instance if package produced nothing or classifier problems. - return null; + Path target = getArtifactPath(artifact); + return Files.isRegularFile(target) ? target.toFile() : null; } - private File determineBuildOutputDirectoryForArtifact(final MavenProject project, final Artifact artifact) { - if (isTestArtifact(artifact)) { - if (project.hasLifecyclePhase("test-compile")) { - return new File(project.getBuild().getTestOutputDirectory()); - } - } else { - String type = artifact.getProperty("type", ""); - File outputDirectory = new File(project.getBuild().getOutputDirectory()); + public void processProject(MavenProject project) { + List<Artifact> artifacts = new ArrayList<>(); - // Check if the project is being built during this session, and if we can expect any output. - // There is no need to check if the build has created any outputs, see MNG-2222. - boolean projectCompiledDuringThisSession = - project.hasLifecyclePhase("compile") && COMPILE_PHASE_TYPES.contains(type); - - // Check if the project is part of the session (not filtered by -pl, -rf, etc). If so, we check - // if a possible earlier Maven invocation produced some output for that project which we can use. - boolean projectHasOutputFromPreviousSession = - !session.getProjects().contains(project) && outputDirectory.exists(); - - if (projectHasOutputFromPreviousSession || projectCompiledDuringThisSession) { - return outputDirectory; - } + artifacts.add(RepositoryUtils.toArtifact(new ProjectArtifact(project))); + if (!"pom".equals(project.getPackaging())) { + org.apache.maven.artifact.Artifact mavenMainArtifact = project.getArtifact(); + artifacts.add(RepositoryUtils.toArtifact(mavenMainArtifact)); } - - // The fall-through indicates that the artifact cannot be found; - // for instance if package produced nothing or classifier problems. - return null; - } - - private File determinePreviouslyPackagedArtifactFile(MavenProject project, Artifact artifact) { - if (artifact == null) { - return null; + for (org.apache.maven.artifact.Artifact attached : project.getAttachedArtifacts()) { + artifacts.add(RepositoryUtils.toArtifact(attached)); } - String fileName = String.format("%s.%s", project.getBuild().getFinalName(), artifact.getExtension()); - return new File(project.getBuild().getDirectory(), fileName); - } - - private boolean hasArtifactFileFromPackagePhase(Artifact projectArtifact) { - return projectArtifact != null - && projectArtifact.getFile() != null - && projectArtifact.getFile().exists(); - } - - private boolean isPackagedArtifactUpToDate(MavenProject project, File packagedArtifactFile, Artifact artifact) { - Path outputDirectory = Paths.get(project.getBuild().getOutputDirectory()); - if (!outputDirectory.toFile().exists()) { - return true; - } - - try (Stream<Path> outputFiles = Files.walk(outputDirectory)) { - // Not using File#lastModified() to avoid a Linux JDK8 milliseconds precision bug: JDK-8177809. - long artifactLastModified = - Files.getLastModifiedTime(packagedArtifactFile.toPath()).toMillis(); - - if (session.getProjectBuildingRequest().getBuildStartTime() != null) { - long buildStartTime = - session.getProjectBuildingRequest().getBuildStartTime().getTime(); - if (artifactLastModified > buildStartTime) { - return true; - } - } - - Iterator<Path> iterator = outputFiles.iterator(); - while (iterator.hasNext()) { - Path outputFile = iterator.next(); - - if (Files.isDirectory(outputFile)) { - continue; - } - - long outputFileLastModified = - Files.getLastModifiedTime(outputFile).toMillis(); - if (outputFileLastModified > artifactLastModified) { - File alternative = determineBuildOutputDirectoryForArtifact(project, artifact); - if (alternative != null) { - LOGGER.warn( - "File '{}' is more recent than the packaged artifact for '{}'; using '{}' instead", - relativizeOutputFile(outputFile), - project.getArtifactId(), - relativizeOutputFile(alternative.toPath())); - } else { - LOGGER.warn( - "File '{}' is more recent than the packaged artifact for '{}'; " - + "cannot use the build output directory for this type of artifact", - relativizeOutputFile(outputFile), - project.getArtifactId()); - } - return false; + for (Artifact artifact : artifacts) { + if (artifact.getFile() != null && artifact.getFile().isFile()) { + Path target = getArtifactPath(artifact); + try { + Files.createDirectories(target.getParent()); + Files.copy(artifact.getFile().toPath(), target, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + LOGGER.warn("Error while copying artifact to project local repository", e); } } - - return true; - } catch (IOException e) { - LOGGER.warn( - "An I/O error occurred while checking if the packaged artifact is up-to-date " - + "against the build output directory. " - + "Continuing with the assumption that it is up-to-date.", - e); - return true; } } - private boolean hasBeenPackagedDuringThisSession(MavenProject project) { - return project.hasLifecyclePhase("package") - || project.hasLifecyclePhase("install") - || project.hasLifecyclePhase("deploy"); + private Path getArtifactPath(Artifact artifact) { + String groupId = artifact.getGroupId(); + String artifactId = artifact.getArtifactId(); + String classifier = artifact.getClassifier(); + String extension = artifact.getExtension(); + Path root = session.getRequest().getMultiModuleProjectDirectory().toPath(); + Path repo = root.resolve("target/project-local-repo"); Review Comment: Will this work as expected on operating systems that have the `\` as the file separator (e.g., Windows)? ########## maven-core/src/main/java/org/apache/maven/ReactorReader.java: ########## @@ -139,187 +132,75 @@ private File find(MavenProject project, Artifact artifact) { return project.getFile(); } - Artifact projectArtifact = findMatchingArtifact(project, artifact); - File packagedArtifactFile = determinePreviouslyPackagedArtifactFile(project, projectArtifact); - - if (hasArtifactFileFromPackagePhase(projectArtifact)) { - return projectArtifact.getFile(); - } - // Check whether an earlier Maven run might have produced an artifact that is still on disk. - else if (packagedArtifactFile != null - && packagedArtifactFile.exists() - && isPackagedArtifactUpToDate(project, packagedArtifactFile, artifact)) { - return packagedArtifactFile; - } else if (!hasBeenPackagedDuringThisSession(project)) { - // fallback to loose class files only if artifacts haven't been packaged yet - // and only for plain old jars. Not war files, not ear files, not anything else. - return determineBuildOutputDirectoryForArtifact(project, artifact); - } - - // The fall-through indicates that the artifact cannot be found; - // for instance if package produced nothing or classifier problems. - return null; + Path target = getArtifactPath(artifact); + return Files.isRegularFile(target) ? target.toFile() : null; } - private File determineBuildOutputDirectoryForArtifact(final MavenProject project, final Artifact artifact) { - if (isTestArtifact(artifact)) { - if (project.hasLifecyclePhase("test-compile")) { - return new File(project.getBuild().getTestOutputDirectory()); - } - } else { - String type = artifact.getProperty("type", ""); - File outputDirectory = new File(project.getBuild().getOutputDirectory()); + public void processProject(MavenProject project) { + List<Artifact> artifacts = new ArrayList<>(); - // Check if the project is being built during this session, and if we can expect any output. - // There is no need to check if the build has created any outputs, see MNG-2222. - boolean projectCompiledDuringThisSession = - project.hasLifecyclePhase("compile") && COMPILE_PHASE_TYPES.contains(type); - - // Check if the project is part of the session (not filtered by -pl, -rf, etc). If so, we check - // if a possible earlier Maven invocation produced some output for that project which we can use. - boolean projectHasOutputFromPreviousSession = - !session.getProjects().contains(project) && outputDirectory.exists(); - - if (projectHasOutputFromPreviousSession || projectCompiledDuringThisSession) { - return outputDirectory; - } + artifacts.add(RepositoryUtils.toArtifact(new ProjectArtifact(project))); + if (!"pom".equals(project.getPackaging())) { + org.apache.maven.artifact.Artifact mavenMainArtifact = project.getArtifact(); + artifacts.add(RepositoryUtils.toArtifact(mavenMainArtifact)); } - - // The fall-through indicates that the artifact cannot be found; - // for instance if package produced nothing or classifier problems. - return null; - } - - private File determinePreviouslyPackagedArtifactFile(MavenProject project, Artifact artifact) { - if (artifact == null) { - return null; + for (org.apache.maven.artifact.Artifact attached : project.getAttachedArtifacts()) { + artifacts.add(RepositoryUtils.toArtifact(attached)); } - String fileName = String.format("%s.%s", project.getBuild().getFinalName(), artifact.getExtension()); - return new File(project.getBuild().getDirectory(), fileName); - } - - private boolean hasArtifactFileFromPackagePhase(Artifact projectArtifact) { - return projectArtifact != null - && projectArtifact.getFile() != null - && projectArtifact.getFile().exists(); - } - - private boolean isPackagedArtifactUpToDate(MavenProject project, File packagedArtifactFile, Artifact artifact) { - Path outputDirectory = Paths.get(project.getBuild().getOutputDirectory()); - if (!outputDirectory.toFile().exists()) { - return true; - } - - try (Stream<Path> outputFiles = Files.walk(outputDirectory)) { - // Not using File#lastModified() to avoid a Linux JDK8 milliseconds precision bug: JDK-8177809. - long artifactLastModified = - Files.getLastModifiedTime(packagedArtifactFile.toPath()).toMillis(); - - if (session.getProjectBuildingRequest().getBuildStartTime() != null) { - long buildStartTime = - session.getProjectBuildingRequest().getBuildStartTime().getTime(); - if (artifactLastModified > buildStartTime) { - return true; - } - } - - Iterator<Path> iterator = outputFiles.iterator(); - while (iterator.hasNext()) { - Path outputFile = iterator.next(); - - if (Files.isDirectory(outputFile)) { - continue; - } - - long outputFileLastModified = - Files.getLastModifiedTime(outputFile).toMillis(); - if (outputFileLastModified > artifactLastModified) { - File alternative = determineBuildOutputDirectoryForArtifact(project, artifact); - if (alternative != null) { - LOGGER.warn( - "File '{}' is more recent than the packaged artifact for '{}'; using '{}' instead", - relativizeOutputFile(outputFile), - project.getArtifactId(), - relativizeOutputFile(alternative.toPath())); - } else { - LOGGER.warn( - "File '{}' is more recent than the packaged artifact for '{}'; " - + "cannot use the build output directory for this type of artifact", - relativizeOutputFile(outputFile), - project.getArtifactId()); - } - return false; + for (Artifact artifact : artifacts) { + if (artifact.getFile() != null && artifact.getFile().isFile()) { + Path target = getArtifactPath(artifact); + try { + Files.createDirectories(target.getParent()); + Files.copy(artifact.getFile().toPath(), target, StandardCopyOption.REPLACE_EXISTING); Review Comment: Would it be worth writing a log message to signal which file is copied to where? > Revert MNG-6118 and provide a better solution for it > ---------------------------------------------------- > > Key: MNG-7629 > URL: https://issues.apache.org/jira/browse/MNG-7629 > Project: Maven > Issue Type: Task > Reporter: Guillaume Nodet > Assignee: Guillaume Nodet > Priority: Major > Fix For: 4.0.0-alpha-4 > > -- This message was sent by Atlassian Jira (v8.20.10#820010)