Apache Maven dev note
Create a multi-module project
- 
Create the main project starting from a folder and convert it into a maven project as defined from the defined inside. 
- 
define the packaging as 'pom' and define the two project as module: xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>it.andzac.dvlp</groupId> <artifactId>mproject</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>engine</module> <module>rpc</module> </modules> </project>
- 
Create the two sub-module project and define in their pom the relation with the defined parent (for the subproject is not necessary define group and version because it is inherit from the parent): 
xml
  <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>
      <groupId>it.andzac.dvlp</groupId>
      <artifactId>mproject</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>engine</artifactId>
    <name>engine</name>
    <!-- ...... -->
  </project>
4. If a module need a dependency with another module of the main (parent) project, is necessary add it as dependency in the dependencies section (In the example below engine need a dependency of rpc module and the pom listed below is relative to engine):
xml
  <!-- ...... -->
  <dependency>
      <groupId>com.ca.lsp</groupId>
      <artifactId>rpc</artifactId>
      <version>0.0.1-SNAPSHOT</version>
  </dependency>
- In order to make the jar executable (with the necessary dependencies inside it) is necessary define the build section:
xml
  <!-- ...... -->
  <build>
      <plugins>
        <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
            <archive>
                <manifest>
                   <addClasspath>true</addClasspath>
                   <mainClass>it.andzac.mproject.engine.App</mainClass>
                </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
       </plugin>
      </plugins>
  </build>
Note
In the
<archive>tag is defined the main class that will be invoked when the jar will be launched.
- Now is possible invoke the maven command to create the jar that can be executed directly from the shell:
sh
  mvn clean install -DskipTests
  mvn package
  java -jar engine-0.0.1-SNAPSHOT-jar-with-dependencies.jar