Maven – How to create a Java project

In this tutorial, we will show you how to use Maven to manage a Java project – create, add dependencies and package a Java project into an executable jar file. At the end, we will create an executable jar file to hash a given string with the SHA-256 algorithm.

Technologies used :

  1. Maven 3.5.3
  2. JDK 8
  3. Apache Commons Codec 1.11

1. Create a Project from Maven Template

In a terminal (*uix or Mac) or command prompt (Windows), navigate to the folder you want to create the Java project. Type this command :


mvn archetype:generate 
	-DgroupId={project-packaging}
	-DartifactId={project-name}
	-DarchetypeArtifactId={maven-template} 
	-DinteractiveMode=false

This tells Maven to generate a Java project from a Maven template. For example,


D:\>mvn archetype:generate -DgroupId=com.mkyong.hashing -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.992 s
[INFO] Finished at: 2018-09-27T17:15:57+08:00
[INFO] ------------------------------------------------------------------------

Above command will generate a Java project from maven-archetype-quickstart template.

2. Maven Directory Layout

The following project directory structure will be created. In short, source code puts in folder /src/main/java/, unit test code puts in /src/test/java/.

P.S Above figure is captured from IntelliJ IDEA, just ignore those .idea folder.

3. POM file

Review the generated pom.xml. It’s quite empty, just a single jUnit dependency.

pom.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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mkyong.hashing</groupId>
    <artifactId>java-project3</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>java-project</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

This POM file is like the Ant build.xml file, it describes the entire project information, everything from directory structure, project plugins, project dependencies, how to build this project and etc, read this official POM guide.

4. Update POM

4.1 Add compiler properties to tell Maven use a specified JDK version to compile the source code.


	<properties>
		<!-- https://maven.apache.org/general.html#encoding-warning -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

4.2 Update jUnit to 4.12


	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
		<scope>test</scope>
	</dependency>

4.3 Add commons-codec for SHA hashing.


	<!-- Dependency for hashing -->
	<!-- https://search.maven.org/artifact/commons-codec/commons-codec/1.11/jar -->
	<dependency>
		<groupId>commons-codec</groupId>
		<artifactId>commons-codec</artifactId>
		<version>1.11</version>
	</dependency>

4.4 Complete updated version.

pom.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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mkyong.hashing</groupId>
    <artifactId>java-project</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>java-project</name>
    <url>http://maven.apache.org</url>

    <properties>
        <!-- https://maven.apache.org/general.html#encoding-warning -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.11</version>
        </dependency>
    </dependencies>

</project>

5. Write Code

5.1 Update the App.java to accept an input and hash it with a SHA-256 algorithm.

App.java

package com.mkyong.hashing;

import org.apache.commons.codec.digest.DigestUtils;

public class App {

    public static void main(String[] args) {

        if (args.length < 1) {
            System.err.println("Please provide an input!");
            System.exit(0);
        }
        System.out.println(sha256hex(args[0]));

    }

    public static String sha256hex(String input) {
        return DigestUtils.sha256Hex(input);
    }

}

5.2 Unit Test.

AppTest.java

package com.mkyong.hashing;

import org.junit.Assert;
import org.junit.Test;

public class AppTest {

    private String INPUT = "123456";

    @Test
    public void testLength() {
        Assert.assertEquals(64, App.sha256hex(INPUT).length());
    }

    @Test
    public void testHex() {
        String expected = "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92";
        Assert.assertEquals(expected, App.sha256hex(INPUT));
    }

}

Done.

6. Maven Build

6.1 Let build it with mvn package


D:\java-project>mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.mkyong.hashing:java-project >-------------------
[INFO] Building java-project 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
......

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mkyong.hashing.AppTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.067 sec

Results :

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

[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-project ---
[INFO] Building jar: D:\java-project\target\java-project-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.956 s
[INFO] Finished at: 2018-09-28T12:40:18+08:00
[INFO] ------------------------------------------------------------------------

It compiles, run unit test and package the project into a jar file and puts it into the project/target folder.

7. Run#1

7.1 Run it. Oops... By default, Maven didn't add the project dependencies commons-codec into the jar file.


D:\java-project>java -cp target/java-project-1.0-SNAPSHOT.jar com.mkyong.hashing.App 123456

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/digest/DigestUtils
        at com.mkyong.hashing.App.sha256hex(App.java:18)
        at com.mkyong.hashing.App.main(App.java:13)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.digest.DigestUtils
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
        ... 2 more

7.2 To solve it, we can use this maven-shade-plugin to create an uber/fat-jar - group everything into a single jar file.

pom.xml

	<build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

7.3 Package it again!


D:\java-project>mvn clean package
[INFO] Scanning for projects...
[...

[INFO] --- maven-shade-plugin:3.2.0:shade (default) @ java-project ---
[INFO] Including commons-codec:commons-codec:jar:1.11 in the shaded jar.
[INFO] Replacing original artifact with shaded artifact.

[INFO] Replacing D:\java-project\target\java-project-1.0-SNAPSHOT.jar 
	with D:\java-project\target\java-project-1.0-SNAPSHOT-shaded.jar
...

Two jars will be generated, review the file size :


D:\java-project>dir target
 Volume in drive D is Samsung970
 Volume Serial Number is 10DF-E63D

 Directory of D:\java-project\target

28/09/2018  12:57 PM           335,643 java-project-1.0-SNAPSHOT.jar
28/09/2018  12:57 PM             3,053 original-java-project-1.0-SNAPSHOT.jar
...

8. Run#2

8.1 Run it again. Good, the result is expected.


D:\java-project>java -cp target/java-project-1.0-SNAPSHOT.jar com.mkyong.hashing.App 123456
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

8.2 Can we run it as Jar? No, there is no main class.


D:\java-project>java -jar target/java-project-1.0-SNAPSHOT.jar 123456
no main manifest attribute, in target/java-project-1.0-SNAPSHOT.jar

8.3 To solve it, add the main class in maven-shade-plugin like this.

pom.xml

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-shade-plugin</artifactId>
	<version>3.2.0</version>
	<executions>
		<!-- Attach the shade into the package phase -->
		<execution>
			<phase>package</phase>
			<goals>
				<goal>shade</goal>
			</goals>
			<configuration>
				<transformers>
					<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
						<mainClass>com.mkyong.hashing.App</mainClass>
					</transformer>
				</transformers>
			</configuration>
		</execution>
	</executions>
</plugin>

9. Run#3

9.1 Package it again!


D:\java-project>mvn clean package

9.2 Run it as Jar.


D:\java-project>java -jar target/java-project-1.0-SNAPSHOT.jar 123456
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

Done.

10. POM

Final POM file.

pom.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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mkyong.hashing</groupId>
    <artifactId>java-project</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>java-project</name>
    <url>http://maven.apache.org</url>

    <properties>
        <!-- https://maven.apache.org/general.html#encoding-warning -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.11</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.mkyong.hashing.App</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
			
        </plugins>
    </build>
</project>

Download Source Code

$ git clone https://github.com/mkyong/maven-examples.git
$ cd java-project
$ mvn package
$ java -jar target/java-project-1.0-SNAPSHOT.jar 123456

References

  1. Maven – How to create a Java web application project
  2. Apache Maven Project
  3. A Simple Maven Project
  4. Java SHA Hashing Example
  5. How To Create a Jar File, thin-jar example
  6. Create a fat Jar file - One-JAR example
  7. Create a fat Jar file - Maven Shade Plugin example

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

avatar
46 Comment threads
18 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
49 Comment authors
Sarav kvijayysSaurabhiSumanthVenkatesh Recent comment authors
newest oldest most voted
Lucy
Guest
Lucy

Nice tutorial by the way! May I ask how to convert Maven project into NetBeans IDE? I checked on other websites said that it could be automatically opened in NetBeans but I tried and failed to load the project in NetBeans. Anybody could help please? Thanks!!!

mkyong
Guest
mkyong

I don’t use Netbean, hope someone can answer this.

martin
Guest
martin

Hi Mkyong.
Your tutorials are the best. Very well explained and simple, you go step by step.

Thank you very much!

Sathish G
Guest
Sathish G

hi mkyong,
i am following u r java articles for past 1 year .working first time with maven nice article

Jason.H
Guest
Jason.H

really nice ! tks !! Mkyong !

trackback
Maven — ?????? 1 ??????????? Java ???? Maven | Tumit's Blog

[…] How to create a Java project with Maven– @mkyong […]

Sarav k
Guest
Sarav k

I am getting
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains):

vijayys
Guest
vijayys

while installing maven plugins this error message is coming ..HOW to solve it??

An error occurred while collecting items to be installed
session context was:(profile=epp.package.jee, phase=org.eclipse.equinox.internal.p2.engine.phases.Collect, operand=, action=).
Problems downloading artifact: osgi.bundle,com.coderplus.m2e.jaxwscore,0.0.1.201505100425.
MD5 hash is not as expected. Expected: a8e4d4ede43c5da5ea1355e3a465872b and found 08b66fce7afe1fc3c48d295fc0c219f6.

Saurabh
Guest
Saurabh

Hi ,
I am not sure my question is related to the post but I am stuck and need help.
I am trying to create maven project running a bat file in java class.Problem is the project gets created in basedir which is the loaction of my java class instead I want to generate the project at specific path mentioned in bat file.

I did used cd specificlocation in my bat file before running maven command but still it uses the basedir . Can you please help me on this.

Thanks

Venkatesh
Guest
Venkatesh

Hi, how can we write a spark program without using maven in java

Prabhu Kumar Ponnaganti
Guest
Prabhu Kumar Ponnaganti

Hi, How to create multi module project with maven. Could provide an example with parent pom.xml? How to organize multi-module project with maven.

Thanks

Dheeraj kumar
Guest
Dheeraj kumar

My dependencies jar i.e. junit jar is not getting imported by maven. Due to which compile time error is coming.

Elom Agboka
Guest
Elom Agboka

Hello Thank you for the tutorial. But I have the following error when running mvn package C:xxxxxxxxxxxxxxxxxxxxxxxxxxxNumberGenerator>mvn package [INFO] Scanning for projects… [ERROR] The build could not read 1 project -> [Help 1] [ERROR] [ERROR] The project com.mkyong:NumberGenerator:1.0-SNAPSHOT (C:UserseagbokaDocumentsprojectsmvn-proj1NumberGeneratorpom.xml) has 1 error [ERROR] Malformed POM C:UserseagbokaDocumentsprojectsmvn-proj1NumberGeneratorpom.xml: Unrecognised tag: ‘plugin’ (position: START_TAG seen …rn rn … @11:11) @ C:UserseagbokaDocumentsprojectsmvn-proj1NumberGeneratorpom.xml, line 11, column 11 -> [Help 2] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about… Read more »

Martin A
Guest
Martin A

Thank you! Very easy to follow.

SumGai
Guest
SumGai

This worked well for me. Thank you for the demonstration.
I don’t understand how AppTest works, though? Are we just checking it will compile?

mkyong
Guest
mkyong

You can run the test manually via mvn test, when you package it mvn package, it will run the test automatically.

Leonardo Cardozo Cadavid
Guest
Leonardo Cardozo Cadavid

You are the best. Thanks

John
Guest
John

Please give, step by step may…!
How people can understand, you started with the command mvn….bla bla……, i started cmd and tried to execute your first command and getting errors. I am seeing your site in google but such a waste site like reoseinda.

mkyong
Guest
mkyong

Sorry, I should mention you have to install Maven first, article is updated.

Surendra
Guest
Surendra

Hi! i’m getting the error as follows;
E:surendramavenbinNumberGenerator>mvn eclipse:eclipse
‘mvn’ is not recognized as an internal or external command,
operable program or batch file.

Could you please help me to get a solution

Thanks in advance..

panchanan
Guest
panchanan

Set M2_HOME, JAVA_HOME and PATH

mkyong
Guest
mkyong

Please install Maven and configure the mavenbin folder to the environment. Refer to the updated article above.

trackback
Deb's Desk – Maven 3 + Hibernate 3.6 + Oracle 11g Example (XML Mapping)

[…] Note More detail, please refer to this How to create a Java project with Maven. […]

trackback
Maven command line | indybee83

[…] Maven command line […]

ahmed abbas
Guest
ahmed abbas

thanks so much.

first time to practice with maven. nice tutrial

hi
Guest
hi

hi, this is the error i am getting plss help Downloading: http://10.132.96.226:9090/archiva/repository/internal/org/apache/ma ven/plugins/maven-metadata.xml Downloading: http://10.132.96.226:9090/archiva/repository/internal/org/codehaus/ mojo/maven-metadata.xml [WARNING] Could not transfer metadata org.apache.maven.plugins/maven-metadata.xm l from/to archiva.default (http://10.132.96.226:9090/archiva/repository/internal /): Error transferring file: Server returned HTTP response code: 502 for URL: ht tp://10.132.96.226:9090/archiva/repository/internal/org/apache/maven/plugins/mav en-metadata.xml [WARNING] Could not transfer metadata org.codehaus.mojo/maven-metadata.xml from/ to archiva.default (http://10.132.96.226:9090/archiva/repository/internal/): Err or transferring file: Server returned HTTP response code: 502 for URL: http://10 .132.96.226:9090/archiva/repository/internal/org/codehaus/mojo/maven-metadata.xm l [INFO] ———————————————————————— [INFO] BUILD FAILURE [INFO] ———————————————————————— [INFO] Total time: 1:59.247s [INFO] Finished at: Wed Oct 23 16:41:07 IST 2013 [INFO] Final Memory: 4M/15M [INFO] ———————————————————————— [ERROR] No plugin found for prefix ‘archetype’ in… Read more »

Saurabh Kumar
Guest
Saurabh Kumar

u haven’t given the proxy to maven to download(access internet) files in the apache-maven-3.1.1confsettings.xml

optional
true
http
proxyuser
proxypass
proxy.host.net
80
local.net|some.host.com

shekar a
Guest
shekar a

Hi,
How to give internet access to maven, where to find my proxy server username and password, etc.., can you please provide me the exact resolution of above error

Zenith
Guest
Zenith

Best one for a beginner :)

Kedar
Guest
Kedar

Excellent!!!

Works like butter…..I was not much knowing about Maven, but this gave me some confidence.

Milad
Guest
Milad

Hi !
” 1. Create a Project from Maven Template ”
I can not create a project . when I write code in cmd ( windows ) it’s Error .
please help to creat a project and run apache syncope .
TnQ

Yilin
Guest
Yilin

Have you downloaded Maven (http://maven.apache.org/download.cgi) and set to your environment variable? if not, no cmd knows what mvn is.

mkyong
Guest
mkyong

Make sure you installed and configured Maven properly. Set $MAVEN/bin to your environment.

sushmita
Guest
sushmita

hi,

Iam getting build error while creating the project:Property artifactID is missing,Can anyone let me know where to configure artifactID.

Enrique
Guest
Enrique

Take a look at your “pom.xml” file. One of the elements is the “artifactId” node.

mKay
Guest
mKay

Hi, I’m struggling to figure out how to actually import the library that I got through maven. Any suggestions how I can find out the name or path to the library that I got from maven?

For some reason I’m not able to figure out how to import the library into my class… :(

Daniel
Guest
Daniel

Hi There..

I have a machine i can not connect to the internet, and getting the error:
ERROR] No plugin found for prefix ?archetype? in the current project and in the
plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the
repositories [local (C:\Documents and Settings\paris\.m2\repository), centra
l (http://repo1.maven.org/maven2)] -> [Help 1]

is there a way around this? can i download it? where? how? etc.

Many thanks in advance! :)
Daniel

mkyong
Guest
mkyong

For the first time, Maven need internet to download those plugins and dependencies, unless you configure a local repository manager.

iSumanth
Guest
iSumanth

Sir , please tell me how to configure local repository manager ?

Ivan
Guest
Ivan

Very good tutorial. Thanks bro’!!

Awanth
Guest
Awanth

I have builts the maven archetype project and it builds successfully, but when i open the project in eclipse it shows errors int he api and omod projects.. any idea how to solve those?
thanks

satyam
Guest
satyam

The complete explanation was great and I triggered successfully my application in one shot by looking this content.

Great work mkyong!