"These abstractions apply to tools and frameworks as well, particularly tools that must scale in their power and sophistication along with projects, like build tools. By hard-won lesson, composable build tools scale (in time, complexity, and usefulness) better than contextual ones."<p>And then the person that wrote them leaves and we're fucked. If maven doesn't do what you need to do, then chances are you don't need to do it. You may think you need to do it, you probably don't. Maybe what you need is a more powerful deployment system, or something that takes over after your java/scala/whatever is built.<p>If you're building perl, C, C++, sure, maven isn't going to do it for you. If you're building java, you're sorted.<p>My favorite is when this sequence happens (I have seen it first hand):<p><pre><code> 1. Maven is this external system that we have no control over.
2. We will write our own system that will be awesome.
3. Wow, look, every project uses our Build System!
4. Oh, look, someone on project X changed B.S. and now Projects A-N don't work!
5. We will lock down B.S. so only the one person who wrote it can change it!
6. ...
7. B.S. is this internal system that we have no control over!
8. ...
9. Can we add support for merging war files?
10. No that'll take weeks, and Bob isn't available anyway.
</code></pre>
I'm sure you can fuck that up just as well using Ruby. Go for it.<p>I work in a java shop currently. There's got to be a hundred of us. Every single one uses an IDE.<p>When I use maven, my IDE just works. eclipse, intellij, netbeans all support maven. Want to put a bunch of files in a common war to share? maven has a merge-war plugin and intellij and eclipse know what it means: they both build projects that copy the files just like maven would do. Better yet, as you edit those files, no matter where they are, both eclipse and intellij update the files in the deploy target and they are available when you refresh your browser. There is a huge amount of investment in making this stuff work. This is convention over configuration.<p>No tool can do this with Ant (or Ruby) unless it <i>runs</i> the Ant and the Ruby, and then you've side stepped the IDE and reduced them to dumb text editors. With an Ant project, the IDE can't know that when I edit file A, it is transmogrified into file Z. (If it could, it could solve the halting problem). With Maven, the IDE implements <i>convention</i>, and so it know that File A is compiled to File B and then must be copied to location Z because its part of a merged war. Add JRebel to the equation and pretty much any change to the code is immediately runnable. Its dangerously easy to spike away instead of writing tests!