Facebook Twitter LinkedIn E-mail
magnify
Home 2012 九月

Maven 使用指南(8): 使用Maven管理多个项目

可以使用Maven来管理多个项目,首先是添加一个父pom.xml 文件,在所需管理项目的上一级,还是以hibernate tutorial 项目为例:

其中父pom.xml 的packaging 必须为 pom 类型

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd" 
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.hibernate.tutorials</groupId>
  <artifactId>hibernate-tutorials</artifactId>
  <version>4.1.6.Final</version>
  <packaging>pom</packaging>
  <name>Hibernate Getting Started Guide Tutorials</name>
  <description0>
     Aggregator for the Hibernate tutorials presented in the Getting Started Guide
 </description>
  <modules>
    <module>basic</module>
    <module>annotations</module>
    <module>entitymanager</module>
    <module>envers</module>
  </modules>
  <properties>
    <maven.deploy.skip>true</maven.deploy.skip>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.1.6.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.6.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>1.2.145</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Maven Repository Switchboard</name>
      <url>http://repo1.maven.org/maven2</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Maven Plugin Repository</name>
      <url>http://repo1.maven.org/maven2</url>
    </pluginRepository>
  </pluginRepositories>
  <build>
    <plugins>
       ....
    </plugins>
  </build>
  <reporting>
    ...
  </reporting>
</project>

此时可以把需管理的项目的共用的dependencies ,plugin 移动到这个父pom.xml ,然后使用modules 添加到父pom.xml 中。

修改子项目的pom.xml ,添加一个parent 元素。比如 basic 项目的 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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.hibernate.tutorials</groupId>
        <artifactId>hibernate-tutorials</artifactId>
        <version>4.1.6.Final</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>hibernate-tutorial-hbm</artifactId>
    <name>Hibernate hbm.xml Tutorial</name>
    <description>
	   Hibernate tutorial illustrating the use of native APIs and hbm.xml for mapping metadata
	</description>

    <properties>
        <!-- Skip artifact deployment -->
        <maven.deploy.skip>true</maven.deploy.skip>
    </properties>

</project>

如果使用eclipse IDE ,就更简单了,直接通过modules 来管理模块:

本文是Maven系列教程最后一篇。

 

Maven 使用指南(7): 使用Maven打包资源文件

使用Maven 打包资源文件无需修改pom.xml ,对于一般的Maven项目,Maven 通过标准的文件目录结构来搜寻资源文件,自动将其打包到最终的jar, war包中。

Maven将所有存放在目录${basedir}/src/main/resources 下的所有文件及其目录原封不动的大包到Jar包中,

例如,修改Maven 使用指南(2): 第一个例子Hello World ,在main 目录下创建一个resources 目录,然后创建一个META-INF子目录,在META-INF目录下添加一个application.resources 文件。

然后再命令行使用mvn package 在target 目录下生成HelloWorld-1.0-SNAPSHOT.jar,解压这个文件,可以看到application.resources 文件中目录META-INF目录下:

可以看到META-INF 目录下还有其它一些文件,是有Maven生成的,对于MANIFEST.MF你可以使用自定义的MANIFEST.MF,如果没提供,Maven自动生成一个。

在test 目录中也可以添加resources 目录来使用资源。然后使用如下类似代码来访问资源

// Retrieve resource
InputStream is = getClass().getResourceAsStream( "/application.properties" );

// Do something with the resource

 

Maven 使用指南(6): 使用Maven插件

Maven 使用指南(4): Maven Build 的阶段时介绍过Maven的阶段命令最终是通过Maven的插件来运行的。

Maven采用插件方式的好处是灵活(可以配置),可以扩展(可以开发插件以满足项目Build的需求,比如编译打包项目后,可以通过插件将应用部署到远程服务器等)。

Maven预先定义了很多插件,可以参见http://maven.apache.org/plugins/ ,如果需要另外开发插件,可以参见http://maven.apache.org/plugin-developers/index.html

在Maven中使用插件是通过在pom.xml 中使用plugins 定义,比如 修改缺省的compiler 插件使用Java编译的版本。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.0.2</version>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>
    </plugin>
  </plugins>
</build>

可以看出使用plugin 的方法和定义依赖的非常类似,其中configuration部分用来配置插件参数。具体可以参见插件文档

Mavne的插件分为两类:

  • Build plugins  在Build生命周期中执行,必须定义在<build/>元素下.
  • Reporting plugins 在生产site阶段运行,定义在<reporting/> 元素。

和定义依赖一样,使用插件也必须定义groupIdartifactId 和version。

 

Maven 使用指南(5): Maven 自动依赖管理

从Maven2 开始,Maven可以自动管理Java应用所引用的开发包(Jar包),原文为transitive dependency (可传递的依赖管理),也就是说Java应用只需要定义其直接引用的Jar包依赖,而无需定义Java应用所引用的所有Jar 依赖。Maven 2可以自动添加Java应用直接引用库所依赖的其它Jar包。

这里我们可以下载hibernate 的一个示例,可以从http://www.hibernate.org/下载,也可以从本站下载.

使用Eclipse –>Import-> Existing Maven Project 打开这个Maven Project。

打开hibernate-tutorials/pom.xml 其dependency 部分定义如下:

<dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.1.6.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.6.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>1.2.145</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
 

可以看到其直接引用了库有四个: org.hibernate,org.slf4j,junit,com.h2database. 切换到Eclipse pom.xml 的Dependencies 视图。

而实际引用到的所有Jar包的层次如下:

可以看到hibernate-core 又引用了不少其它Jar,这些Maven都可以自动计算出并下载所需依赖。而无需再pom.xml 中一一列出。

在定义dependency时还可以指定其引用的scope,比如有些引用可能只是用在单元测试而不会添加到最终发布的jar包中。Maven支持下面几种Scope:

  • compile: 缺省Scope,应用到Maven所有阶段。
  • provided: 只在编译代码时需要,而无需发布到最终Jar包中。
  • runtime: 只在运行时需要,比如JDBC驱动。
  • test: 只在编译和运行单元测试时需要,比如Juint测试。
 

Maven 使用指南(4): Maven Build 的阶段

有了前面的三篇文章,就可以开始使用Eclipse来创建Maven 项目开发Java应用了。前面用到了

mvn compile

mvn test

mvn package

等命令。

Maven定义了编译打包项目生命周期活动的标准阶段,compile, test ,package 是创建Build生命周期活动的一个阶段。下图定义了Maven Build生命周期的主要阶段。

  • generate-sources: 通常是通过插件支持创建额外的源代码。
  • compile: 编译项目应用代码
  • test-compile: 编译项目单元测试代码
  • test: 运行项目单元测试(一般为Junit 测试)
  • package: 打包项目可以执行代码(以Jar/War/Ear形式)
  • integration-test: 如有需要处理及部署应用以便执行系统集成测试。
  • install: 将应用打包发布到本地Maven 软件包以便其它Maven引用。(注意Install不是指安装Java应用)
  • deploy: 发布到远程Maven软件包以便其他Maven项目下载引用。

每个Maven阶段命令最终是通过Maven的插件来运行的。没个被调用的阶段命令自动调用其生命周期前面的阶段命令,比如mvn package 会依次运行compile , test 阶段命令。

运行Maven阶段命令,是进入到Maven项目包含pom.xml 的目录,

然后运行 mvn [command]

例如 对Hello World  项目运行 mvn package ,命令依次调用 compile, test 及package 本身。

 

如果使用Eclipse IDE,可以通过菜单来执行Maven命令:

 

Maven 使用指南(3): 简述Maven工作过程

前面例子创建了一个HelloWorld应用,所做的工作就是通过命令行输入mvn archetype:generate,然后给出GroupId, artifactId,及Version等信息,Maven就创建了一个新的项目,包括应用本身和Junit单元测试代码框架。
下面给出了Maven的基本工作过程。

Maven 是根据存储在Maven repository 的信息来决定其操作,存放在Maven Repository的信息包括两个部分:

  • Archtype Info相当于项目的模板,Maven根据archtype 来构造新创建项目的文件结构,比如前面使用的是缺省的generate 创建一个Java应用
  • Dependency Info 存放了不同Jar(库)之间的相互依赖(引用关系)

当在命令行调用maven 命令时,maven 通过访问Maven repository 中的信息创建新项目的目录结构(directory structure),下载所依赖的库文件(jar),HelloWorld 只依赖Junit. 并将项目信息写到pom.xml 文件中。你可以通过修改pom.xml 来添加其它引用的库文件。Maven则自动下载所需库文件。