The point of explicitly specifying your dependencies versions is to ensure that your build is repeatable. It defends you against:
- Deprecated methods. Eventually a library just stops working unless you pay attention to your compiler warnings.
- Functionality may change over time. Unless your code has good functional tests in place, how can you be certain the code still works?
But.... it is inconvenient to keep versions up to date in the ivy file.
The compromise I find is to regularly release my code into a repository. The ivy deliver task can be used to resolve all dependencies and effective "freeze" my revisions at a point in time. So my build uses dynamic revisions like "latest.integration" and "latest.release", but my released code contains the exact revisions in it's metadata file (pom.xml or ivy.xml dependent on which repository management software you use)