User Tools

Site Tools


maven

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
maven [2024/02/27 12:31] – [Maven in 5 minutes] kalaschnikowmaven [2024/08/01 13:41] (current) – [Maven Getting Started Guide] kalaschnikow
Line 1: Line 1:
 +====== Apache Maven ======
  
 +https://maven.apache.org/
 +
 +===== Documentation =====
 +
 +==== What is Maven? ====
 +
 +https://maven.apache.org/what-is-maven.html
 +
 +  * POM = Project Object Model
 +  * POM + Plugins
 +  * Maven suggest guidelines for project directory layout
 +
 +  * Features of Maven
 +    * simple project setup
 +    * using across many projects
 +      * => no ramp-up time for new developers
 +    * dependency management
 +    * repository of libs and metadata
 +    * model-based builds
 +      * JAR, WAR, ...
 +    * release management and distribution publication
 +      * For example:
 +        * integration with SCMs (e.g. Git)
 +        * releases based on a tag
 +        * source ditribution
 +
 +==== Maven in 5 minutes ====
 +
 +https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
 +
 +<code>
 +mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
 +</code>
 +
 +  * ''archetype:generate''
 +    * ''archetype'' - plugin
 +    * ''generate'' - goal
 +  * A plugin can be understood as a "collection" of goals.
 +  * this ''generate'' call has created a [[https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html|standard directory layout]]. Like:
 +    * my-app
 +      * pom.xml
 +      * /src
 +        * /main
 +          * /java
 +            * ...
 +          * ...
 +        * /test
 +          * /java
 +            * ...
 +          * ...
 +
 +  * Build the project:
 +    * ''mvn package''
 +      * ''package'' is a //phase// (not a goal as ''archetype:generate'')
 +      * When a phase is given, Maven executes every phase in the sequence up to and including the one defined.
 +  * To use proper Java version, ''maven-compiler-plugin'' should be properly configured, because by default it uses Java 8.
 +  * //Default// Maven build lifecycle:
 +    * ''validate'': validate the project is correct and all necessary information is available
 +    * ''compile'': compile the source code of the project
 +    * ''test'': test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
 +    * ''package'': take the compiled code and package it in its distributable format, such as a JAR.
 +    * ''integration-test'': process and deploy the package if necessary into an environment where integration tests can be run
 +    * ''verify'': run any checks to verify the package is valid and meets quality criteria
 +    * ''install'': install the package into the local repository, for use as a dependency in other projects locally
 +    * ''deploy'': done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
 +  * Other build lifecycles (not in //default//):
 +    * ''clean'': cleans up artifacts created by prior builds
 +    * ''site'': generates site documentation for this project
 +  * Phases are actually mapped to underlying goals. The specific goals executed per phase is dependant upon the packaging type of the project. For example, package executes jar:jar if the project type is a JAR, and war:war if the project type is a WAR.
 +  * An interesting thing to note is that phases and goals may be executed in sequence:
 +    * ''mvn clean dependency:copy-dependencies package''
 +==== Maven Getting Started Guide ====
 +
 +https://maven.apache.org/guides/getting-started/index.html
 +
 +  * Maven helps to manage:
 +    * builds
 +    * documentation
 +    * reporting
 +    * dependencies
 +    * SCMs
 +    * releases
 +    * distribution
 +  * How to make a first Maven project?
 +    * archetypes = "templates" of a project
 +    * ''mvn archetype:generate''
 +      * Example:
 +        * ''mvn -B archetype:generate -DgroupId=my.company.app DartifactId=my-app -DarchetypeVersion=1.4 -DarchetypeArtifactId=maven-archetype-quickstart''
 +    * ''pom.xml''
 +      * contains Project Object Model
 +    * ''artifactId'' 
 +      * used for the names of project artifacts
 +        * e.g. primary artifact (typically JAR): ''myapp-1.0.jar''
 +    * properties
 +      * value placeholders accessible anywhere within a POM
 +  * How do I compile my application sources?
 +    * ''mvn compile''
 +    * ''mvn test''
 +      * compile + execute unit tests
 +    * ''mvn test-compile''
 +      * compile unit tests (without executing)
 +  * How do I create a JAR and install it in my local repository?
 +    * ''mvn package''
 +      * packages JAR in "target" directory
 +    * ''mvn install''
 +      * installs the JAR in the local repo (default: ''${user.home}/.m2/repository'')
 +  * How do I use plugins?
 +    * ''configuration'' element applies the given parameters to every goal from the plugin
 +  * How do I add resources to my JAR?
 +    * use standard directory layout
 +      * ''/src/main/resources''
 +        * -> goes to the root of JAR
 +      * ''/src/test/resources''
 +        * can be addressed in Java code for example as:
 +          * ''InputStream in = getClass().getResourceAsStream("/test.properties");''
 +  * How do I filter resource files?
 +    * To reference a property which value will be known firstly at the build time use ''${<property_name>}''
 +    * The value of such property can be defined in:
 +      * pom.xml
 +        * ''${<property_name>}''
 +          * e.g. ''${project.name}''
 +      * settings.xml
 +        * ''${settings.<property_name>}''
 +          * e.g.''${settings.localRepository}''
 +      * external properties file
 +      * system property
 +  * How do I use external dependencies?
 +    * ''dependencies'' section in pom.xml lists all external dependencies
 +    * each dependency entry defines at least:
 +      * groupId
 +      * artifactId
 +      * version
 +      * scope
 +        * e.g. ''test'' or ''compile''
 +    * dependencies will be fetched from local repo (default: ''${user.home}/.m2/repository'')
 +      * with command: ''mvn install''
 +    * if dependency is not in local repo, it will be fetched from a remote repo (by default Maven Central: https://repo.maven.apache.org/maven2)
 +  * How do I deploy my JAR in my remote repository?
 +    * configure repo URL in the ''pom.xml''
 +    * authentication info in ''settings.xml''
 +  * How do I build more than one project at once?
 +    * ...
 +
 +. . .
 +
 +=== The Build Lifecycle ===
 +
 +https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
 +
 +Three built-in build lifecycles: 
 +  * default
 +    * The default lifecycle handles your project deployment
 +  * clean
 +    * the clean lifecycle handles project cleaning
 +  * site
 +    * the site lifecycle handles the creation of your project's web site.
 +
 +The full [[https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#lifecycle-reference|Lifecycle reference]].
 +
 +Default lifecycle:
 +
 +  * ''validate'' - validate the project is correct and all necessary information is available
 +  * ''compile'' - compile the source code of the project
 +  * ''test'' - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
 +  * ''package'' - take the compiled code and package it in its distributable format, such as a JAR.
 +  * ''verify'' - run any checks on results of integration tests to ensure quality criteria are met
 +  * ''install'' - install the package into the local repository, for use as a dependency in other projects locally
 +  * ''deploy'' - done in the build environment, copies the final package to the remote repository for sharing with other developers and projects.
 +
 +===== Misc =====
 +
 +  * [[https://maven.apache.org/maven-release/maven-release-plugin/|Maven Release Plugin]]
 +    * [[https://maven.apache.org/maven-release/maven-release-plugin/usage.html|Maven Release Plugin - Usage]]
 +
 +  * [[https://maven.apache.org/guides/introduction/introduction-to-the-pom.html|Introduction to the POM]]