I come from a .NET background and am completely new to Java and am trying to get my head around the Java project structure.
My typical .NET solution structure contains projects that denote logically distinct components, usually named using the format:
MyCompany.SomeApplication.ProjectName
The project name usually equals the root namespace for the project. I might break the namespace down further if it’s a large project, but more often than not I see no need to namespace any further.
Now in Java, you have applications consisting of projects, and then you have a new logical level – the package. What is a package? What should it contain? How do you namespace within this App.Project.Package structure? Where do JARs fit into all this? Basically, can someone provide a newbies intro to Java application structure?
Thanks!
Edit: Some really cracking answers thanks guys. A couple of followup questions then:
- Do .JAR files contain compiled code? Or just compressed source code files?
- Is there a good reason why package names are all lower case?
- Can Packages have ‘circular dependencies’? In other words, can Package.A use Package.B and vice versa?
- Can anyone just show the typical syntax for declaring a class as being in a package and declaring that you wish to reference another package in a class (a using statement maybe?)
“Simple” J2SE projects
As cletus explained, source directory structure is directly equivalent to package structure, and that’s essentially built into Java. Everything else is a bit less clear-cut.
A lot of simple projects are organized by hand, so people get to pick a structure they feel OK with. What’s often done (and this is also reflected by the structure of projects in Eclipse, a very dominant Java tool) is to have your source tree begin in a directory called
src. Your package-less source files would sit directly in src, and your package hierarchy, typically starting with acomdirectory, would likewise be contained insrc. If youCDto thesrcdirectory before firing up thejavaccompiler, your compiled.classfiles will end up in the same directory structure, with each .class file sitting in the same directory and next to its.javafile.If you have a lot of source and class files, you’ll want to separate them out from each other to reduce clutter. Manual and Eclipse organization often place a
binorclassesdirectory parallel tosrcso the .class files end up in a hierarchy that mirrors that ofsrc.If your project has a set of
.jarfiles to deliver capability from third-party libraries, then a third directory, typicallylib, is placed parallel tosrcandbin. Everything inlibneeds to be put on the classpath for compilation and execution.Finally, there’s a bunch of this and that which is more or less optional:
docresourcesdataconf…You get the idea. The compiler doesn’t care about these directories, they’re just ways for you to organize (or confuse) yourself.
J2EE projects
J2EE is roughly equivalent to ASP.NET, it’s a massive (standard) framework for organizing Web applications. While you can develop your code for J2EE projects any way you like, there is a firm standard for the structure that a Web container will expect your application delivered in. And that structure tends to reflect back a bit to the source layout as well.
Here is a page that details project structures for Java projects in general (they don’t agree very much with what I wrote above) and for J2EE projects in particular:
http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
Maven projects
Mavenis a very versatile project build tool. Personally, my build needs are nicely met byant, which roughly compares withnmake. Maven, on the other hand, is complete-lifecyle build management with dependency management bolted on. The libs and source for most of the code in the Java world is freely available in the ‘net, and maven, if asked nicely, will go crawling it for you and bring home everything your project needs without you needing to even tell it to. It manages a little repository for you, too.The downside to this highly industrious critter is the fact that it’s highly fascist about project structure. You do it the Maven way or not at all. By forcing its standard down your throat, Maven manages to make projects worldwide a bit more similar in structure, easier to manage and easier to build automatically with a minimum of input.
Should you ever opt for Maven, you can stop worrying about project structure, because there can only be one. This is it: http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html