Maven Snapshot (SNAPSHOT)

A large software application usually contains multiple modules, and the typical scenario is that multiple teams develop different modules of the same application. For example, imagine one team develops the frontend of the application, with the project app-ui (app-ui.jar:1.0), while another team develops the backend, using the project data-service (data-service.jar:1.0).

Now a possible situation is that the team developing data-service is doing fast-paced bug fixes or project improvements, and they release a library to the remote repository almost every other day. Now if the data-service team uploads a new version every other day, the following problems will arise:

  • The data-service team has to inform the app-ui team every time they release updated code.
  • The app-ui team needs to frequently update their pom.xml file to the latest version.

To solve this situation,snapshotcomes in handy.


What is a snapshot?

A snapshot is a special version that specifies a copy of the current development progress. Unlike regular versions, Maven checks the remote repository for new snapshots on every build. Now the data-service team will release a snapshot of updated code to the repository each time, such as data-service:1.0-SNAPSHOT to replace the old snapshot jar.


Project snapshot vs version

For versions, if Maven has previously downloaded a specified version file, such as data-service:1.0, Maven will not download a new available 1.0 file from the repository again. To download updated code, the data-service version needs to be upgraded to 1.1.

In the case of snapshots, every time the app-ui team builds their project, Maven will automatically fetch the latest snapshot (data-service:1.0-SNAPSHOT).

The pom.xml file of the app-ui project

The app-ui project uses the 1.0 snapshot of the data-service 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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>app-ui</groupId> <artifactId>app-ui</artifactId> <version>1.0</version> <packaging>jar</packaging> <name>health</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>data-service</groupId> <artifactId>data-service</artifactId> <version>1.0-SNAPSHOT</version> <scope>test</scope> </dependency> </dependencies> </project>

The pom.xml file of the data-service project

The data-service project publishes a 1.0 snapshot for every minor change.

<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>data-service</groupId> <artifactId>data-service</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>health</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>

Although, in the case of snapshots, Maven automatically fetches the latest snapshot during daily work, you can also use the -U parameter in any Maven command to force Maven to download the latest snapshot build.

mvn clean package -U

Let's open the command console, go to C:\ > MVN > app-ui directory, and then execute the following mvn command.

C:\MVN\app-ui>mvn clean package -U

Maven will start building the project after downloading the latest snapshot of data-service.

[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------
[INFO] Building consumerBanking
[INFO]    task-segment: [clean, package]
[INFO] -------------------------------------------------------------------
[INFO] Downloading data-service:1.0-SNAPSHOT
[INFO] 290K downloaded.
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting directory C:\MVN\app-ui\target
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\app-ui\src\main\
resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to C:\MVN\app-ui\target\classes
[INFO] [resources:testResources {execution: default-testResources}]
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\app-ui\src\test\
resources
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Compiling 1 source file to C:\MVN\app-ui\target\test-classes
[INFO] [surefire:test {execution: default-test}]
[INFO] Surefire report directory: C:\MVN\app-ui\target\
surefire-reports
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.companyname.bank.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] [jar:jar {execution: default-jar}]
[INFO] Building jar: C:\MVN\app-ui\target\
app-ui-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Tue Jul 10 16:52:18 IST 2012
[INFO] Final Memory: 16M/89M
[INFO] ------------------------------------------------------------------------
Other extensions