Sunday, May 27, 2012

Organizing Project into Multi Module Structure

The right approach of organizing an enterprise Project is to create a multi module Project.
  
Pom project (top level project that would define all of the modules)
  •   war project (project-web)
  •   jar project (project-services)
  •   jar project (project-common, contains common stuff eg. vo's)
  •   jar project (project-framework, Exception, Security, Logging, Error codes, Encryption)
  •   jar project (project-persistence)
  •   jar project (project-module)
  •   war project (project-web-services, depends upon 'project-services')
  •   jar project (project-report, reporting stuff)
  •   jar project(project-standalone for cron Jobs, depends upon 'project-service



Reasons for using Multi-Module projects :
  • Modulerising related source code: client/web, controller, services, UI,.
  • Deploy only the changes:With multi-module projects, we can regenerate your project and deploy only what changed.
  • Allowing Versioning of diffrenet modules
  • Relase ont module  which is modified
  • Spliting your project into multiple maven projects if your projects are deployed in different configurations.
  • Reuse of sertainn comon modules:Let's assume your project contains some well-written generic-enough code for mail sending. If you later have another project that need mail sending functionality, you can simply re-use your existing module or build upon it (in another module by adding it as a dependency).
  • Easier maintainability on the long run. Maybe now it seems like a small project.
  • Conceptual clarity 

Sample Example:
Pom.xml for Parent Project:

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>TechyHouse</artifactId>
        <groupId>org.techyhouse</groupId>
        <version>1.1.0-SNAPSHOT</version>
    </parent>
    <groupId>org.techyhouse</groupId>
    <artifactId>techyhouse-web</artifactId>
    <version>1.1.0-SNAPSHOT</version>
    <name>techyhouse-web</name>
    <packaging>war</packaging>
    <url>http://maven.apache.org</url>
    <properties>
        <java-version>1.6</java-version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>3.0.6.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.techyhouse</groupId>
            <artifactId>techyhouse-service</artifactId>
            <version>1.1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>techyhouse-web</finalName>
        <defaultGoal>install</defaultGoal>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <webResources>
                        <resource>
                            <!-- this is relative to the pom.xml directory -->
                            <directory>src/main/techyhouse</directory>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>


Pom.xml for child module

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>TechyHouse</artifactId>
        <groupId>org.techyhouse</groupId>
        <version>1.1.0-SNAPSHOT</version>
    </parent>
    <groupId>org.techyhouse</groupId>
    <artifactId>techyhouse-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>techyhouse-service</name>
    <url>http://maven.apache.org</url>
    <build>
        <finalName>techyhouse-service</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-orgpiler-plugin</artifactId>
                <version>2.3.2</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <reporting>
        <plugins>
            <plugin>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>2.8</version>
                <configuration>
                    <links>
                        <link>http://java.sun.org/javase/6/docs/api/</link>
                    </links>
                    <detectOfflineLinks />
                    <aggregate>true</aggregate>
                    <doclet>org.umlgraph.doclet.UmlGraphDoc</doclet>
                    <docletArtifact>
                        <groupId>org.umlgraph</groupId>
                        <artifactId>doclet</artifactId>
                        <version>5.1</version>
                    </docletArtifact>
                    <additionalparam>-operations</additionalparam>
                    <additionalparam>-qualify</additionalparam>
                    <additionalparam>-types</additionalparam>
                    <additionalparam>-visibility</additionalparam>
                    <additionalparam>-collpackages</additionalparam>
                    <additionalparam>-views</additionalparam>
                    <useStandardDocletOptions>true</useStandardDocletOptions>
                    <show>private</show>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>2.6</version>
                <!-- TODO: choose appropriate rulesets -->
                <configuration>
                    <targetJdk>1.6</targetJdk>
                </configuration>
            </plugin>
        </plugins>
    </reporting>
    <properties>
        <java-version>1.6</java-version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>3.1.0.RELEASE</spring.version>
        <log4j.version>1.2.16</log4j.version>
        <junit.version>4.10</junit.version>
        <aspectj.version>1.6.11</aspectj.version>
    </properties>
    <dependencies>   
        <dependency>
            ...............
            ................
            ...............
        </dependency>       
    </dependencies>
</project>

No comments:

Post a Comment