Environment Setup
To begin utilizing Maven effectively, the toolchain must first be integrated into your development environment. This involves installing the binary distribution and ensuring the MAVEN\_HOME environment variable is correctly configured. Additionally, verify that the Java Development Kit (JDK) is installed and accessible via JAVA\_HOME, as Maven acts as a build automation tool relying on Java.
Standard Project Layout
Maven enforces a conventional directory structure to streamline the build process. By adhering to this standard, plugins can automatically locate source files and dependencies.
project-root/
├── src/
│ ├── main/
│ │ ├── java/ # Primary application source code
│ │ └── resources/ # Static configuration files and assets
│ └── test/
│ ├── java/ # Unit test source code
│ └── resources/ # Test specific configurations
└── pom.xml # Project Object Model definition
POM Structure and Coordinates
The core configuration file, pom.xml, defines the project metadata. Every module is uniquely identified by its coordinates, comprising three primary elements:
- GroupId: Represents the organization namespace. A common convention is reversing the domain name (e.g.,
io.github.jdoe). - ArtifactId: The unique identifier for the project artifact within the group.
- Version: Indicates the release status. Formats typically follow Major.Minor.Snapshot (e.g.,
1.0-SNAPSHOT), where-SNAPSHOTdenotes an unstable, ongoing development build.
The root element is <project>, which must declare the model version, typically 4.0.0.
Property Definitions
To maintain consistency across dependencies, global variables can be defined within the <properties> section. This centralizes version management.
<properties>
<jdk.version>17</jdk.version>
<encoding>UTF-8</encoding>
<database.driver.version>4.2.10</database.driver.version>
</properties>
These variables are referenced later using the ${variableName} syntax.
Dependency Management
External libraries are declared inside the <dependencies> block. Each entry requires a fully qualified coordinate. The <scope> attribute dictates where the dependency is required:
compile: Available during compilation, testing, and execution (default).test: Only available for compiling and running tests.provided: Expected to be provided by the runtime container (e.g., Servlet API in a server).runtime: Required only for runtime and tests, not compilation.system: Refers to a local path jar file explicitly.
Build Plugins and Packaging
The default output type is governed by <packaging>, which defaults to jar but can be set to war or others depending on deployment needs. Custom build logic is often added via the <build> section.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${encoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
Lifecycle Execution
Maven operations are organized into phases executed via command-line interfaces. These commands operate sequentially upon request:
- clean: Removes the
targetdirectory generated by previous builds. - compile: Compiles main source code into bytecode located in
target/classes. - test: Compiles and executes unit tests found in
src/test, generating reports intarget/surefire-reports. - package: Bundles compiled classes and resources into distributable formats like JAR or WAR.
- install: Copies the packaged artifact in to the local repository cache for other projects to consume.
- deploy: Transfers the final artifact to a remote repository for public access.
Resource Processing Rules
Maven filters resources by default. While src/main/resources is processed automatically, Java source directories (src/main/java) are excluded unless explicitly configured. To ensure properties in Java packages (like .xml config files) are resolved, resource handlers must be adjusted.
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
Complete Project Definition
A functional pom.xml structure combines the above elements into a cohesive configuration.
<?xml version="1.0" encoding="UTF-8"?>
<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>io.github.jdoe</groupId>
<artifactId>core-library</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>