java 项目工具Maven详解

在工作项目中,出于方便的的角度考虑,我们往往会使用Maven这种项目管理工具,让我们的项目更加简单明了。

Maven简介


那么Maven是什么呢?

Maven全称Apache Maven,它是一个软件(特别是Java)项目管理及自动构建工具。由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven也可被用于构建和管理各种项目,例如C#,Ruby,Scala和其他语言编写的项目。Maven曾是Jakarta项目的子项目,现为由Apache软件基金会主持的独立Apache项目。简单的说,Maven本质上是一个项目管理和理解工具。Maven通过提供了一种帮助管理项目的方法,提高项目可读性和生产效率。

项目对象模型POM


这里涉及到一个项目对象模型POM(Project Object Model)的概念。POM.xml文件是Maven能够起作用的核心文件。因为Maven本质上是以项目为中心的,一切都围绕一个项目的概念,而POM包含有关您的项目的所有重要信息,并且基本上是一站式购物,可以在POM中查找与您的项目相关的任何内容。Apache官方对POM的解释如下:

A Project Object Model or POM is the fundamental unit of work in Maven. It is an XML file that contains information about the project and configuration details used by Maven to build the project. It contains default values for most projects.

这段话翻译过来大概是这样的:

一个项目对象模型POM是Maven的一个基本单元。
POM是一个包含Maven配置细节和项目信息的XML文件。它包含了项目中所有的默认值。

在Maven1中POM模型是用文件:project.xml来表示的,而在Maven的第二个版本Maven2中这个文件的名字改成了POM.xml。在Maven中并没有一个能够执行的、名字叫做Maven.xml的文件。当任务或项目启动时,Maven会在当前目录下查找POM.xml文件读取并获取相关信息。

那么POM文件中存放些什么呢?在POM.xml文件中可以对项目所依赖的信息、可执行的插件或目标、构建配置信息进行配置。除此之外,POM.xml文件中还包含项目版本、说明、开发者、邮件列表等信息。为了更加直观的展现出POM文件存放的内容,我们介绍两个POM文件,看看他们具体是如何工作的。

super POM——所有POM文件的”父亲”

super POM文件定义了部分属性的默认值。并且我们规定,所有的POM文件都继承于super POM文件,如果你不在自己的文件中对一些值手动修改,那么它们将会延续使用super POM中的默认值。下面的代码片段是Maven2.1.0版本的super POM。

<project>
  <modelVersion>4.0.0</modelVersion>
  <name>Maven Default Project</name>

  <repositories>
    <repository>
      <id>central</id>
      <name>Maven Repository Switchboard</name>
      <layout>default</layout>
      <url>http://repo1.maven.org/maven2</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Maven Plugin Repository</name>
      <url>http://repo1.maven.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <directory>${project.basedir}/target</directory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <!-- TODO: MNG-3731 maven-plugin-tools-api < 2.4.4 expect this to be relative... -->
    <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
   <pluginManagement>
       <plugins>
         <plugin>
           <artifactId>maven-antrun-plugin</artifactId>
           <version>1.3</version>
         </plugin>       
         <plugin>
           <artifactId>maven-assembly-plugin</artifactId>
           <version>2.2-beta-2</version>
         </plugin>         
         <plugin>
           <artifactId>maven-clean-plugin</artifactId>
           <version>2.2</version>
         </plugin>
         <plugin>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>2.0.2</version>
         </plugin>
         <plugin>
           <artifactId>maven-dependency-plugin</artifactId>
           <version>2.0</version>
         </plugin>
         <plugin>
           <artifactId>maven-deploy-plugin</artifactId>
           <version>2.4</version>
         </plugin>
         <plugin>
           <artifactId>maven-ear-plugin</artifactId>
           <version>2.3.1</version>
         </plugin>
         <plugin>
           <artifactId>maven-ejb-plugin</artifactId>
           <version>2.1</version>
         </plugin>
         <plugin>
           <artifactId>maven-install-plugin</artifactId>
           <version>2.2</version>
         </plugin>
         <plugin>
           <artifactId>maven-jar-plugin</artifactId>
           <version>2.2</version>
         </plugin>
         <plugin>
           <artifactId>maven-javadoc-plugin</artifactId>
           <version>2.5</version>
         </plugin>
         <plugin>
           <artifactId>maven-plugin-plugin</artifactId>
           <version>2.4.3</version>
         </plugin>
         <plugin>
           <artifactId>maven-rar-plugin</artifactId>
           <version>2.2</version>
         </plugin>        
         <plugin>                
           <artifactId>maven-release-plugin</artifactId>
           <version>2.0-beta-8</version>
         </plugin>
         <plugin>                
           <artifactId>maven-resources-plugin</artifactId>
           <version>2.3</version>
         </plugin>
         <plugin>
           <artifactId>maven-site-plugin</artifactId>
           <version>2.0-beta-7</version>
         </plugin>
         <plugin>
           <artifactId>maven-source-plugin</artifactId>
           <version>2.0.4</version>
         </plugin>         
         <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.4.3</version>
         </plugin>
         <plugin>
           <artifactId>maven-war-plugin</artifactId>
           <version>2.1-alpha-2</version>
         </plugin>
       </plugins>
     </pluginManagement>
  </build>

  <reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
  </reporting>
  <profiles>
    <profile>
      <id>release-profile</id>

      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>

      <build>
        <plugins>
          <plugin>
            <inherited>true</inherited>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
              <updateReleaseInfo>true</updateReleaseInfo>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>

我们并不需要将每行都看懂,当我们需要修改某些值的时候,这份xml文件才会派上用场。

min POM——最短的POM文件

POM采用xml格式进行书写,那么POM文件最短需要哪些必要的元素呢?
最简单的POM文件也需要下面的几个基本元素:

  1. project根节点
  2. modelVersion节点 —— 应该被设置为4.0.0
  3. groupId节点 —— 表示项目的组的ID
  4. artifactId节点 —— 表示项目的ID
  5. version —— 在规定的组下项目的版本号
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

无论如何,一个完整的项目都需要groupId、artifactId、version三个属性,这三个值形成了一个项目的完全限定名,如上的min POM中,这个项目的完全限定名是:com.mycompany.app:my-app:1。

POM—— 一个常用而简单的POM例子

<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>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

project
这是所有Maven pom.xml文件中的顶级元素。
modelVersion
此元素指示此POM正在使用的对象模型的版本。模型本身的版本很少变化,通常我们使用4.0.0即可,但是如果Maven开发人员认为有必要更改模型,则为了确保使用的稳定性是强制性的。
groupId
此元素指示创建项目的组织或组的唯一标识符。groupId是项目的关键标识符之一,通常基于您组织的完全限定域名。例如,org.apache.maven.plugins是所有Maven插件的指定groupId。
artifactId
此元素指示此项目正在生成的主要工件的唯一基本名称。项目的主要工件通常是JAR文件。诸如源码包之类的辅助工件也使用artifactId作为其最终名称的一部分。由Maven生成的典型工件将具有 - 。(例如myapp-1.0.jar)的形式。
packaging
此元素指示此工件要使用的包类型(例如JAR,WAR,EAR等)。这不仅意味着如果生成的工件是JAR,WAR或EAR,但也可以指示在构建过程中使用的特定生命周期。(生命周期是我们将在指南中进一步处理的主题,现在,请记住,指定的项目包装可以在定制构建生命周期中发挥作用。)包装元素的默认值为JAR所以你不必为大多数项目指定。
version
此元素指示项目生成的工件的版本。Maven可以帮助您进行版本管理,您将经常在一个版本中看到SNAPSHOT指示符,这表明项目处于开发状态。
dependencies
在该元素内部可以使用多个dependency元素表示该项目依赖的包。
dependency
表示项目中需要使用到的文件信息,通常可以有多个这样的dependency并列写出。
name
此元素指示用于项目的显示名称。这通常用在Maven生成的文档中。
url
此元素指示可以找到项目的站点。这通常用在Maven生成的文档中。
description
此元素提供了项目的基本描述。这通常用在Maven生成的文档中。

Maven目录结构


好的目录结构可以使开发人员更容易理解项目,为以后的维护工作也打下良好的基础。Maven2根据业界公认的最佳目录结构,为开发者提供了缺省的标准目录模板。如果开发的是web项目或者其他,可能具体的目录树结构可以进一步进行调整。

目录名功能
src/src目录文件
src/main/项目主目录
src/main/java项目源代码目录
src/main/resources项目所需资源目录
src/main/filters资源过滤文件目录
src/main/assembly文件部件部署目录
src/main/config配置文件目录
src/webapp网络应用目录
src/test/项目测试目录
src/test/java项目测试源代码目录
src/test/resources项目测试资源目录
src/test/filters资源过滤文件目录
src/site与设置相关的资源目录
target/输出目录
target/classes项目主输出目录,主要与main关联
target/test-classes项目测试输出目录,主要与test关联
target/site项目设置目录
pom.xmlMaven的POM基本单元

Maven目录结构非常清晰,但这并不表示我们在实际的项目中必须采用这种目录层次。如果对test目录不感兴趣,把它删除也不会引起任何问题。Maven作为一种工具,只是默认提供这种优秀的目录结构。

如何在MyEclipse中操作Maven


Maven的功能很多,在我们做一些规模并不是很大的项目时,之所以采用Maven其实主要是认可它的两个作用:1.自动下载jar包和它所依赖的包,这样可以保证了多人开发时jar版本不同的问题。2.文件结构清晰,java文件,资源文件,测试文件都分的很清楚。在实际开发中,我们应该如何去配置文件,编写POM呢?
Overview
上图是MyEclipse中的POM.xml文件界面。OverView标签页主要展示出了几个比较重要的信息,并且支持我们在这里直接对这些信息进行修改。如果想要直接阅读代码可以点击下面的pom.xml标签页。
Dependences
Dependences标签页中表示出了所有需要用到的jar包(除了放在lib文件夹下的本地jar包)。只要我们把所有需要使用的包放在这个位置,当项目在另外一台计算机上第一次部署时,会联机下载所有部署的jar包,这样保证了多个计算机同一项目间jar包的一致性。如果我们需要添加jar包,点击add按钮,输入想要添加的jar包的部分名字字段,MyEclipse会智能的列出所有含有该字段的jar包供我们添加。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值