Details
-
Type:
Bug
-
Status:
Closed
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: 2.0.9, 2.1.0
-
Fix Version/s: 2.2.1
-
Component/s: Artifacts and Repositories, General
-
Labels:None
-
Complexity:Intermediate
-
Number of attachments :4
Description
To reproduce this issue:
- Create a project (let's call this projectA) with a class named ClassA having a method named methodA(). Set the version as 1.0-SNAPSHOT and set uniqueVersion=true.
- Deploy this in a remote repository
- Create another project (let's call this projectB) which has a dependency on projectA. Set the dependency's version to the specific timestamped version when projectA was deployed in step 2. Create a class named ClassB and add a method which invokes ClassA's methodA().
- Add your remote repository either in the settings or in the pom.
- Build projectB. You will get a successful build.
- Now go back to projectA and remove methodA() from classA.
- Deploy projectA to the remote repository again.
- Update the dependency version of projectA in projectB's pom.xml. Set it to the latest timestamp version.
- Build projectB. Your build will fail because methodA() was removed.
- Revert the dependency version of projectA in projectB's pom.xml. Set it to the same value you've set in step 3.
- Build projectB. Your build will still fail even though you've set the correct version.
-
- MNG-4189-maven-2.1.x.patch
- 09/Jun/09 5:56 AM
- 7 kB
- Maria Odea Ching
-
- MNG-4189-core-integration-testing.patch
- 09/Jun/09 5:51 AM
- 21 kB
- Maria Odea Ching
-
Hide
- mng-4189.zip
- 08/Jun/09 5:57 AM
- 15 kB
- Maria Odea Ching
-
- mng-4189/.../MavenITmng4189UniqueVersionSnapshotTest.java 3 kB
- mng-4189/src/.../maven-metadata.xml.md5 0.0 kB
- mng-4189/.../dep-1.0-20090608.090416-1.jar.sha1 0.0 kB
- mng-4189/.../dep-1.0-20090608.090532-2.pom.sha1 0.0 kB
- mng-4189/.../dep-1.0-20090608.090532-2.jar.sha1 0.0 kB
- mng-4189/src/.../maven-metadata.xml.sha1 0.0 kB
- mng-4189/.../dep-1.0-20090608.090532-2.pom.md5 0.0 kB
- mng-4189/.../dep-1.0-20090608.090532-2.jar.md5 0.0 kB
- mng-4189/.../dep-1.0-20090608.090416-1.pom 0.4 kB
- mng-4189/.../dep-1.0-20090608.090416-1.jar 3 kB
- mng-4189/.../dep-1.0-20090608.090532-2.pom 0.4 kB
- mng-4189/.../dep-1.0-20090608.090416-1.pom.md5 0.0 kB
- mng-4189/src/.../maven-metadata.xml 0.4 kB
- mng-4189/.../dep-1.0-20090608.090416-1.jar.md5 0.0 kB
- mng-4189/.../dep-1.0-20090608.090532-2.jar 3 kB
- mng-4189/.../dep-1.0-20090608.090416-1.pom.sha1 0.0 kB
- mng-4189/src/.../dep/maven-metadata.xml.md5 0.0 kB
- mng-4189/src/.../dep/maven-metadata.xml.sha1 0.0 kB
- mng-4189/src/test/.../dep/maven-metadata.xml 0.3 kB
- mng-4189/src/test/.../its/mng4189/App.java 1 kB
- mng-4189/src/.../settings-template.xml 1 kB
- mng-4189/.../dependent-on-newer-timestamp-pom.xml 0.7 kB
- mng-4189/src/test/.../mng-4189/pom.xml 0.7 kB
- mng-4189/pom.xml 2 kB
-
- MNG-4189.patch
- 11/Jun/09 7:08 AM
- 2 kB
- Benjamin Bentmann
Activity
Attaching patch for core-integration-testing integrating the IT test for this issue..
Attaching MNG-4189-maven-2.1.x.patch to fix this issue. Unit tests included in the patch. Could someone please review this before I commit it to 2.1.x branch? Thanks in advance!
With your patch, we effectively have
boolean resolved = false; if ( !destination.exists() || force ) { ... resolved = true; } else if ( destination.exists() ) // Note that this is equivalent to just "else" { ... resolved = true; }
In other words, the flag resolved will always be true. This in turn will make if ( resolved || !copy.exists() ) equivalent to if (true), thereby always executing the FileUtils.copyFile(destination, copy). Hence, Maven will end up copying each and every snapshot dependency. For bigger projects, I can imagine this accumulates to significant IO, slowing down the build.
The attached patch proposes to compare the file's timestamp&size instead of using the resolved flag. This should also ensure that artifact-<baseVersion>.jar matches the last resolved timestamp version but still avoids unnecessary file copies in case nothing changed.
A comment about the IT: I suggest to remove the checksum files (*.md5, *.sha1) from the test repository and just setup the repo to ignore the checksums. Files that are not vital for a test otherwise simply cause IO and slow down resource copying/extraction during testing. This is not relevant for a single test but we approach 400 ITs so there's a certain scaling factor to consider.
Ok, thanks for reviewing them Benjamin. I'll update the patches. Should I merge this to 2.2.x branch as well after I commit it to 2.1.x branch?
Should I merge this to 2.2.x branch as well
Yes, please, I don't see a reason to not do so.
Fix committed in 2.1.x branch -r788583 and merged to 2.2.x branch -r788596.
Integration tests committed in core-integration-testing trunk -r788584.
I'm still creating an IT for this, will attach it to this jira issue once completed..