Java Build Systems - a sad state of affairs
grok-code.com
grok-code.com
I mean that the glass is half full. I wouldn't call a full dependency resolution system like maven's "a sad state of affairs."
It is built on ruby and follows the Convention over Configuration route. Which keeps the build file quite small.
It has hooks into maven and can be run on jruby or ruby
- Groovy has Gant (http://gant.codehaus.org/)
- Clojure has Lancet (http://github.com/stuarthalloway/lancet)
Both of these avoid the "XML tag soup" problem.
Which is actually pretty interesting, even if you need to mess with the defaults.
1. It's actually pretty darned complicated to use 'correctly' for a non-trivial project. 2. It approaches impossible to integrate into an existing non-trivial project. Maven wants you to do thing it's way (that's the point).. but that makes moving to it on an existing project a challenge
That would be the reason why most expert JEE folks aren't getting Maven. It's not a short or easy learning curve. even on a good day with good folks to help you wade through it.
That said, Maven's dependency management engine alone is worth the price of admission. Bye-bye JAR hell. But the integrated build/release/tag/version features are the real treat once you get that far...
- I did not take my time to learn it
- Senior employees did stuff in a non-Maven way.
edit: The discussion on Reddit points out many details about Maven that the author has gotten wrong: http://www.reddit.com/r/programming/comments/dmu26/java_buil...
http://felix-lang.org/tags/fbuild
That has some basic support for Java. I'm using Python3 for my dsl. Here's a dummy example of how to use it (from http://github.com/erickt/fbuild/tree/master/examples/java):
import fbuild.builders.java
def build(ctx):
java = fbuild.builders.java.Builder(ctx)
lib = java.build_lib('lib.jar', ['World.java'])
exe = java.build_lib('exe.jar', ['HelloWorld.java'], classpaths=[lib])
ctx.logger.log(' * running %s:' % exe)
java.run_class('HelloWorld', classpaths=[lib, exe])
I haven't had much demand for Java support, but it probably wouldn't be that difficult to extend it to download from a maven repository.I do wonder if Maven 3's flexibility will hurt it or help it in the long run. Yes pom.xml is XML, but at least there is only one dialect. If team A likes XML and team B likes Groovy, development manager C will have a fun time getting them to work together on project D.
If you did start putting clever code into Ant files, they'd get so huge they'd be unmanageable. It's really really easy to just write your own Ant plugins in Java.
Then your build files are very straightforward and readable, and just look like a set of simple file operations and method calls.
Then Ant becomes really powerful - you can even write some plugins that take a web server out of service using telnet to Cisco LocalDirector, SCP a deployment build across and all sorts of other clever stuff.
Plugin example:
public class MyTask extends Task {
private String param1;
private String param2;
public void execute() throws BuildException {
// do something
}
}
Then in the XML: <myTask param1="..." param2="..." />I was in a meeting once where I was the lone "cowboy" Perl programmer amongst amongst a group of Java dudes. One Java dude told another off for doing logging wrong. He said "I have a book on this logging package if you want to borrow it."
None of them knew why I laughed, but to me, logging was just a fancy print statement. And somebody wrote a book about it.
When they build the next system, they will try to use these best practices to avoid their problems they've been through in the past. When this happened, they are already experiencing the second-system syndrome (but they don't realized it).
Of course each project differs right?
http://ebuild.origo.ethz.ch/wiki/ebuild
Although unfortunately the documentation is not ready yet, it is quite capable and is designed to solve what I perceive to be critical short comings of maven.
We were given some assignment to write a mail server in Java. At the time, I had never used Java, but had decades of experience with other dialects of C, so I taught myself Java over the weekend.
I put together the server, as well as several classes that could be shared by the client and presented it to the team on the following tuesday. When I showed them java code in emacs, with a Makefile to compile it all and jar it up, they were astonished. They didn't believe that:
1) I had learned the fundamentals of a language in a couple of days and was producing professional quality code in that language (actually professional quality design).
2) That I could do it outside of some java-specific IDE, using 20 year old tools.
I learned Java over a weekend; I wasn't about to tackle ANT at the same time.
After years of using ANT, I still think it is a pain in the ass.
It can be a bit difficult, but I have written readable Makefiles that ran both on windows and linux, building latex files.
Lets talk about the article : a) the so called XML tax : Agreed XML is not the best representation of information but it does seem to be particularly suited for build tasks. Ant's plug in tasks give you a lot of leeway -- a prudent programmer would know how not to hang herself or himself. I hope for the writer's sake that the example he chose is not from his actual project. If it is, then the writer should probably find a different line of work.
b) Netbeans now supports Maven 'natively'. And before that, I have been faithfully and successfully upgrading my Netbeans version while working on enterprise scale applications. The problems that the writer mentions are either exaggerations or a reflection of his ineptitude.
c) Maven : it took me a while to wrap my head around it and I hated learning how to write plugins -- in xml. But it was worth the effort. I implemented a Continuous Integration build system for my project that builds an EAR with over 1.2 million line of code.
Maven just works -- once you have put in the effort to learn the platform. The writer has not put in any effort towards that. In fact the maven problem he talks about is actually a quote from a third party. This guy really does not know what he is talking about.
Don't get me wrong -- ant and maven are far from perfect ; but this article only betrays the writer's ignorance and lack of skill.
And then he goes on to recommend Rake . Would you take recommendation from a guy who whines about stuff he knows nothing about ?