Maven is a build automation tool used primarily for Java projects. Maven can also be used to build and manage projects written in C# , Ruby , Scala , and other languages. The Maven project is hosted by The Apache Software Foundation , where it was formerly part of the Jakarta Project .
33-615: Maven addresses two aspects of building software: how software is built and its dependencies. Unlike earlier tools like Apache Ant , it uses conventions for the build procedure. Only exceptions need to be specified. An XML file describes the software project being built, its dependencies on other external modules and components, the build order, directories, and required plug-ins . It comes with pre-defined targets for performing certain well-defined tasks such as compilation of code and its packaging. Maven dynamically downloads Java libraries and Maven plug-ins from one or more repositories such as
66-479: A Project Object Model (POM) in a pom.xml file. Example file: This POM defines a unique identifier for the project ( coordinates ) and a single dependency on the JUnit library. However, that is already enough for building the project and running the unit tests associated with the project. Maven accomplishes this by embracing the idea of Convention over Configuration , that is, Maven provides default values for
99-472: A predecessor activity For example, on a project to construct a new office building, the landscaping could be scheduled to start prior to the scheduled punch list completion. This would be shown as a finish-to-start with two-week lead". If you are building a building, you can't paint the walls before installing the water pipes into the walls. Activity A and Activity B are said to have a Maximal-Type Relationship, if Activity B can start after Activity A, but with
132-457: A root POM through which one can compile all the modules with a single command. POMs can also inherit configuration from other POMs. All POMs inherit from the Super POM by default. The Super POM provides default configuration, such as default source directories, default plugins, and so on. Most of Maven's functionality is in plug-ins . A plugin provides a set of goals that can be executed using
165-513: A single machine can depend on each other through the local repository. The local repository is a simple folder structure that acts both as a cache for downloaded dependencies and as a centralized storage place for locally built artifacts. The Maven command mvn install builds a project and places its binaries in the local repository. Then, other projects can utilize this project by specifying its coordinates in their POMs. Add-ons to several popular integrated development environments (IDE) targeting
198-424: A successor activity will be delayed with respect to a predecessor activity". For example: When building two walls from a novel design, one might start the second wall 2 days after the first so that the second team can learn from the first. This is an example of a lag in a Start-Start relationship. In accordance to PMBOK a lead is "the amount of time whereby a successor activity can be advanced with respect to
231-508: A well-defined structure, Maven requires that this structure and the operation implementation details be defined in the POM file. Thus, Maven relies on a convention on how to define projects and on the list of work-flows that are generally supported in all projects. There are search engines such as The Central Repository Search Engine, which can be used to find out coordinates for different open-source libraries and frameworks. Projects developed on
264-486: Is a computer system program that takes one or more object files (generated by a compiler or an assembler ) and combines them into a single executable file, library file, or another "object" file. The process of building a computer program is usually managed by a build tool , a program that coordinates and controls other programs. Examples of such a program are make , Gradle , Ant , Maven , Rake , SCons and Phing. The build utility typically needs to compile
297-436: Is given in the article Automate development and management of cloud virtual machines . The build lifecycle is a list of named phases that can be used to give order to goal execution. One of Maven's three standard lifecycles is the default lifecycle , which includes the following phases, performed in the order listed: Goals provided by plugins can be associated with different phases of the lifecycle. For example, by default,
330-459: Is necessarily to overlap activities; an option may be selected to use start-to-start (SS), finish-to-finish (FF) or start-to-finish (SF) relationships....Whenever possible, the FS logical relationship should be used. If other types of relationships are used, they shall be used sparingly and with full understanding of how the relationships have been implemented in the scheduling software being used. Ideally,
363-501: Is not used, because resource levelling can delay a successor activity (an activity, which shall be finished just-in-time) in such a way, that it will finish later than the start of its logical predecessor activity, thus not fulfilling the just-in-time requirement. There are three kinds of dependencies with respect to the reason for the existence of dependency: Early critical path -derived schedules often reflected only on causal (logical) or discretionary (preferential) dependencies because
SECTION 10
#1732790773762396-430: The surefire:test goal. Maven also has standard phases for cleaning the project and for generating a project site. If cleaning were part of the default lifecycle, the project would be cleaned every time it was built. This is clearly undesirable, so cleaning has been given its own lifecycle. Standard lifecycles enable users new to a project the ability to accurately build, test and install every Maven project by issuing
429-560: The JUnit coordinates as a direct dependency of the project. A project that needs, say, the Hibernate library simply has to declare Hibernate's project coordinates in its POM. Maven will automatically download the dependency and the dependencies that Hibernate itself needs (called transitive dependencies ) and store them in the user's local repository. Maven 2 Central Repository is used by default to search for libraries, but one can configure
462-500: The Java programming language exist to provide integration of Maven with the IDE's build mechanism and source editing tools, allowing Maven to compile projects from within the IDE, and also to set the classpath for code completion, highlighting compiler errors, etc. Examples of popular IDEs supporting development with Maven include: These add-ons also provide the ability to edit the POM or use
495-547: The Maven 2 Central Repository, and stores them in a local cache. This local cache of downloaded artifacts can also be updated with artifacts created by local projects. Public repositories can also be updated. Maven is built using a plugin-based architecture that allows it to make use of any application controllable through standard input. A C / C++ native plugin is maintained for Maven 2. Alternative technologies like Gradle and sbt as build tools do not rely on XML , but keep
528-402: The POM to determine a project's complete set of dependencies directly within the IDE. Some built-in features of IDEs are forfeited when the IDE no longer performs compilation. For example, Eclipse's JDT has the ability to recompile a single Java source file after it has been edited. Many IDEs work with a flat set of projects instead of the hierarchy of folders preferred by Maven. This complicates
561-443: The archetypal build sequence of building, testing and packaging a software project required running each respective goal manually: Maven's lifecycle concept handles this issue. Plugins are the primary way to extend Maven. Developing a Maven plugin can be done by extending the org.apache.maven.plugin.AbstractMojo class. Example code and explanation for a Maven plugin to create a cloud-based virtual machine running an application server
594-507: The assumption was that resources would be available or could be made available. Since at least the mid-1980s, competent project managers and schedulers have recognized that schedules must be based on resource availability. The critical chain method necessitates taking into account resource constraint-derived dependencies as well. Dependencies can be modified by leads, and lags. Both leads and lags can be applied to all 4 types of dependencies. PMBOK defines lag as "the amount of time whereby
627-404: The build process and software. Dependency (project management) There are four standard types of dependencies: Finish-to-start is considered a "natural dependency". The Practice Standard for Scheduling recommends, that "Typically, each predecessor activity would finish prior to the start of its successor activity (or activities)(known as finish-to-start (FS) relationship). Sometimes it
660-427: The build process to run in and captures metadata about the inputs and output of the build process to ensure repeatability and reliability. Tools such as Git , AccuRev or StarTeam help with these tasks by offering tools to tag specific points in history as being important, and more. Also known as static program analysis/static code analysis this function is responsible for checking that developers have adhered to
693-423: The build process. The compilation function turns source files into directly executable or intermediate objects. Not every project will require this function. While for simple programs the process consists of a single file being compiled , for complex software the source code may consist of many files and may be combined in different ways to produce many different versions. In computing , a linker or link editor
SECTION 20
#1732790773762726-545: The command mvn [plugin-name]:[goal-name] . For example, a Java project can be compiled with the compiler-plugin's compile-goal by running mvn compiler:compile . There are Maven plugins for building, testing, source control management, running a web server, generating Eclipse project files, and much more. Plugins are introduced and configured in a <plugins>-section of a pom.xml file. Some basic plugins are included in every project by default, and they have sensible default settings. However, it would be cumbersome if
759-510: The configuration for a single project. General configuration covers the project's name, its owner and its dependencies on other projects. One can also configure individual phases of the build process, which are implemented as plugins . For example, one can configure the compiler-plugin to use Java version 1.5 for compilation, or specify packaging the project even if some unit tests fail. Larger projects should be divided into several modules, or sub-projects, each with its own POM. One can then write
792-450: The goal compiler:compile is associated with the compile phase, while the goal surefire:test is associated with the test phase. When the mvn test command is executed, Maven runs all goals associated with each of the phases up to and including the test phase. In such a case, Maven runs the resources:resources goal associated with the process-resources phase, then compiler:compile , and so on until it finally runs
825-429: The key concepts Maven introduced. With Apache Ivy , a dedicated dependency manager was developed as well that also supports Maven repositories. Apache Maven has support for reproducible builds . Maven was created by Jason van Zyl in 2002 and began as a sub-project of Apache Turbine . In 2003 Maven was accepted as a top level Apache Software Foundation project. Version history: Maven projects are configured using
858-401: The project's configuration. The directory structure of a normal idiomatic Maven project has the following directory entries: The command mvn package will compile all the Java files, run any tests, and package the deliverable code and resources into target/my-app-1.0.jar (assuming the artifactId is my-app and the version is 1.0.) Using Maven, the user provides only configuration for
891-401: The project, while the configurable plug-ins do the actual work of compiling the project, cleaning target directories, running unit tests, generating API documentation and so on. In general, users should not have to write plugins themselves. Contrast this with Ant and make , in which one writes imperative procedures for doing the aforementioned tasks. A Project Object Model (POM) provides all
924-419: The repositories to be used (e.g., company-private repositories) within the POM. The fundamental difference between Maven and Ant is that Maven's design regards all projects as having a certain structure and a set of supported task work-flows (e.g., getting resources from source control, compiling the project, unit testing, etc.). While most software projects in effect support these operations and actually do have
957-424: The sequence of all activities will be defined in such a way that the start of every activity has a logical relationship from a predecessor and the finish of every activity has a logical relationship to a successor". SF is rarely used, and should generally be avoided. Microsoft recommends to use SF dependency for just-in-time scheduling. It can be easily shown however, that this would only work if resource levelling
990-450: The seven axes of code quality: comments, unit tests, duplication, complexity, coding rules, potential bugs and architecture & design. Ensuring a project has high-quality code results in fewer bugs and influences nonfunctional requirements such as maintainability, extensibility and readability; which have a direct impact on the ROI for a business. This is only a small feature of managing
1023-511: The single command mvn install . By default, Maven packages the POM file in generated JAR and WAR files. Tools like diet4j can use this information to recursively resolve and run Maven modules at run-time without requiring an "uber"-jar that contains all project code. A central feature in Maven is dependency management . Maven's dependency-handling mechanism is organized around a coordinate system identifying individual artifacts such as software libraries or modules. The POM example above references
Apache Maven - Misplaced Pages Continue
1056-598: The use of SCM systems in IDEs when using Maven. Software build In software development , a build is the process of converting source code files into standalone software artifact(s) that can be run on a computer, or the result of doing so. Building software is an end-to-end process that involves many distinct functions. Some of these functions are described below. The version control function carries out activities such as workspace creation and updating, baselining and reporting. It creates an environment for
1089-476: The various files, in the correct order. If the source code in a particular file has not changed then it may not need to be recompiled ("may not" rather than "need not" because it may itself depend on other files that have changed). Sophisticated build utilities and linkers attempt to refrain from recompiling code that does not need it, to shorten the time required to complete the build. A more complex process may involve other programs producing code or data as part of
#761238