Russell Bateman
August 2021
last update:
The purpose of this write-up was to show the Maven file basis of a multi-module project. This project is conceived to be a web application in which there is a purely "domain" (or logic) component that might wish to be exported as a JAR for use in yet another project. (It's difficult to impossible to excerpt a subset of only some project classes as a JAR for use elsewhere—better to have it as its own, if dependently contributing project.)
As time goes, I will enhance this, but I'll be trying not to lose the essential simplicity of the project. I have already fleshed it out with Java code, a real web.xml, Maven dependencies, etc. and obtained a working project.
The crucial components here are highlighted:
<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>com.windofkeltia</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>domain</module>
<module>web</module>
</modules>
<properties>
<junit.version>4.12</junit.version>
<maven.compiler.plugin.version>3.5.1</maven.compiler.plugin.version>
<maven-war-plugin.version>3.2.0</maven-war-plugin.version>
<maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>
<maven-dependency-plugin.version>3.2.0</maven-dependency-plugin.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
</plugin>
</plugins>
</build>
</project>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.windofkeltia.domain</groupId>
<artifactId>domain</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<parent>
<groupId>com.windofkeltia</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
<!-- JAR files that support domain work... -->
</dependencies>
</project>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.windofkeltia.web</groupId>
<artifactId>webapp</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<parent>
<groupId>com.windofkeltia</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
<!-- JAR files that support the web application/servlet... -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin.version}</version>
<configuration>
<warName>${project.artifactId}-${project.version}</warName>
<webResources>
<resource>
<directory>src/main/webapp</directory>
</resource>
</webResources>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
<manifestEntries>
<Build-Time>${maven.build.timestamp}</Build-Time>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>parent</display-name>
<servlet>
<servlet-name>parent</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.windofkeltia.services</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>parent</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
You must also create the filesystem to look like this prior to setting up an IDE project, then establish the Maven files and add a minimal web.xml:
$ cd ~/home/russ/dev/super $ mkdir -p domain/src/main/java $ mkdir -p domain/src/test/java $ mkdir -p web/src/main/java $ mkdir -p web/src/main/webapp/WEB-INF $ touch web/src/main/webapp/WEB-INF/web.xml $ mkdir -p web/src/test/java $ tree . ├── domain │ ├── pom.xml │ └── src │ ├── main │ │ └── java │ └── test │ └── java ├── pom.xml └── web ├── pom.xml └── src ├── main │ ├── java │ └── webapp │ └── WEB-INF │ └── web.xml └── test └── java
$ mvn clean [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] parent [pom] [INFO] domain [jar] [INFO] webapp [war] [INFO] [INFO] ----------------------< com.windofkeltia:parent >----------------------- [INFO] Building parent 1.0.0 [1/3] [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ parent --- [INFO] [INFO] ------------------< com.windofkeltia.domain:domain >-------------------- [INFO] Building domain 1.0.0 [2/3] [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ domain --- [INFO] Deleting /home/russ/dev/super/domain/target [INFO] [INFO] --------------------< com.windofkeltia.web:webapp >--------------------- [INFO] Building webapp 1.0.0 [3/3] [INFO] --------------------------------[ war ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ webapp --- [INFO] Deleting /home/russ/dev/super/web/target [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for parent 1.0.0: [INFO] [INFO] parent ............................................. SUCCESS [ 0.082 s] [INFO] domain ............................................. SUCCESS [ 0.003 s] [INFO] webapp ............................................. SUCCESS [ 0.002 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.150 s [INFO] Finished at: 2021-08-10T15:22:26-06:00 [INFO] ------------------------------------------------------------------------
If you open this project in IntelliJ IDEA doing the following...
It's important to note first that this is not the only way to set up a project from existing sources. It's probably not even the canonical way that JetBrains would preach to you, but it's an easy way for me coming from a command-line and 10-year Eclipse background.
Second, realize that if you do not reach and complete this step as I have documented it, you're on your own to set up IDEA modules and marking the source and test code and resource filesystems appropriately, a tedious exercise to say the least. Recreate, whatever the strange semantics of that choice of words evokes, is your only salvation.
...you should see something like this below. I called my project root super in the filesystem, but I could have given it a real name.