Tag: javaee
Must Haves/References For Modern Java EE Developers
by Chris Wash on Nov.28, 2008, under JBoss Seam, Java, Software Engineering
I’ve been doing a lot of reading lately and have been meaning to plug some of my favorite reads, and one of the things that I’ve been trying to read with an eye toward is for converting those that have been stuck on “behind-the-curve” projects to the new way of thinking and doing things. As such, and just in time for the weekend, I’ve compiled a list of my favorites with an eye to the “movers and shakers” that have driven innovation in the Enterprise Java world recently. Note that even though some of these links are specific to certain frameworks/technologies, there is a common thread throughout most of these that have a bigger focus on the best way to solve problems using Java 5/EE 5 constructs and concepts.
A book that should be on any Java developer’s shelf is Effective Java (2nd Edition). Make sure you get the second edition, for all of the Java 5 changes. This talk by Joshua should whet your appetite. (His talk on good API design is also very good.) You should also take a look at Bob Lee’s talk on Guice. Guice’s philosophy and focus on typesafety has spilled over into Web Beans (and newer versions of Seam) and its annotation based approach has heavily influenced newer Spring features. I especially like his points on type safety around the 11-minute mark. The walkthrough at the end of the talk from “old way” to “new way” is great for people who haven’t really gotten away from Factories, Delegates, and Service Locators yet.
The Guice video mentions that a common thread in modern Java frameworks is a focus on testability. Testing is a very important concept that nearly all new frameworks have embraced, but you still need know-how to be successful with testing. I’ve come across some great books recently in the automated (developer) testing arena. I’ve found the most thorough book on the topic out there is Lasse Koskela’s Test Driven. The ideas and topics discussed in the book are really language independent, and work equally well with other languages. To cut your teeth on TestNG, which the Seam documentation turned me onto, I recommend the TestNG developers’ book Next Generation Java Testing: TestNG and Advanced Concepts
. Cedric Beust, also the author of EJBGen, and Hani Suleiman, author of the Bile Blog, produced a book that was a suprisingly good read. It’s packed with a lot of knowledge and some interesting takes on EE concepts. Newer versions of JUnit also include many of these features and concepts, so you’ll get the underpinnings of these concepts in this book. This video gives you a basis to TestNG’s approach.
As one of the growing number of developers who have an application in the Seam In Production page, there are a few Seam resources I have to share. Even if you don’t get into Seam, it should be on your radar because a lot of the core concepts around conversations have evolved into Web Beans, and are found other frameworks like Apache Orchestra and Spring WebFlow. Pete Muir did a Webcast that’s a great introduction to Seam 2.
Author of one of my favorite Seam blogs, Jacob Orshalick, has created a DZone RefCard for Seam 2.1 Core. It’s right off the presses, being published this week, but is a great quick-capsule review of what Seam can do for you, and nice to have on your desk if you’re writing Seam. If you need more in-depth descriptions of what’s on the RefCard, Jacob also coauthored the latest edition of the great Seam reference Seam Framework: Experience the Evolution of Java EE.
Dan Allen’s Seam in Action is another excellent resource. Of course, the awesome Seam Docs and Forums always come in handy. You should also RSS in.relation.to – the Hibernate/Seam developers’ group blog.
I know I’m leaving some great things out. What resources do you think someone who is used to J2EE should take a look at to get them “up to speed” with the state of the art?
Pimp My Build
by Chris Wash on Jul.21, 2008, under Software Engineering
In terms of the sheer number of moving parts, extravagance, and complexity, the build-tool landscape is one of bells and whistles that can be a little tough to stay on top of. There are a few important pieces of a robust and valuable build, no matter what tools you use to achieve it, and by breaking the build into modules or categories, we can make a little bit of sense out of the chaos.
In our vast build-tool landscape, there tend to be some zealous cults out there, entrenched deeply in their own camps and unwilling to venture out to explore what the rest of the landscape has to offer. Thus, there have been some religious-like differences of opinion about which build tools are better and why. Sadly you run across these types of biases all too often, which only pollutes the landscape and makes it more difficult to wrap your head the most basic questions underlying all tools:
- What does it accomplish?
- When is it (or isn’t it) right for the job?
- How do I use it effectively and efficiently?
With a pragmatic view, we can try to cut through a lot of the BS and figure out if a tool is worth its weight in:
- dependencies/design complexity.
- ease of use/interface complexity.
- architectural decisions/compromises that it brings to the table.
Does the tool get us to the goal of a single button build/deploy? If the answer is yes, I’ll welcome it with open arms. Does it add me a form of feedback or some kind of statistic that could be a kind of gauge on a dashboard? Then I may be interested in it, but it’s not nearly as vital.
Here’s an outline of what I typically look to include in a project’s build before I am satisfied:
- Compile – Obviously your build script would be for naught if you didn’t include this piece. There’s also something to be said about some dynamic/interpreted languages (that run on the JVM) taking the hit on this step and producing compiled versions. The argument is akin to compiling your JSPs back in the day.
- Unit test suite – Another one of those no-brainers! You’ll obviously want to integrate your ability to run a single test or test suite from a build tool quickly and easily.
- Test reports – Test reports are an important way of visualizing the health of your project and are usually the first place you’ll go when you see something wrong. A must have.
- Transitive dependency management – This is one of those sticky subjects that people like to argue about religiously. Really the important thing to note here is that a crucial part of keeping your build clean and manageable is figuring out how to represent and resolve transitive dependencies, or second-level dependencies. If your code directly depends on a library, odds are that library has its own run-time dependencies that need to be satisified in order for it to work properly. Since managing the different versions of many different libraries can become tough when you start to look at different “stacks” of software, many people advocate having a tool help you resolve these dependencies so it’s not as daunting a task to get the entire stack to work again when you need to upgrade a single library. Maven and Ivy solve this problem by introducing repositories that will house and dynamically resolve these versioning issues, in much the same manner as yum or apt-get does in the Linux world. A lot of newbs will make the mistake of thinking this type of functionality will let them turn off their brain when it comes to think about their project’s dependencies. They will be sorely mistaken! The point of these to make resolving conflicts in transitive dependencies easier, they do not replace your brain, nor your obligation to know the dependencies in your project and how they fit together!
- Utility ant tasks – the daunting part of learning how to write good builds has a bit to do with how much you know about the ant task landscape. Nearly all libraries have tools that plug into ant, but which ones do you really need to know about? I’ve found a few are quite powerful, particularly replace, uptodate, cvstagdiff (and corresponding svn’s), xmltask and dbdeploy. I think these tools should be looked at when you are trying to figure out how to accomplish something specific, and for that reason, they’re a bit more like “bells and whistles” than anything else. The same goes for the next category, which arguably doesn’t even need to live in your build (but if you’re a team player, it’s a definite nice to have):
- Static analysis – There have been a barage of slick static-analysis tools that have entered the Java landscape recently. A few are FindBugs, PMD, CheckStyle. While most of these tools have plugins that integrate nicely into an IDE, it’s also helpful to have them plugged into your build, too. Just to make sure everyone is following the rules. A few others I’ve seen that focus on cyclomatic complexity, cohesion/coupling are Metrics and JDepend.
What build tools fit into your pimped out script?
