`

工程管理之四:Maven工程管理配置

 
阅读更多

最近经常使用Maven管理工程,于是总结一下使用过的Maven pom.xml配置。我本地使用的Maven版本是apache-maven-3.0.3。工程为普通java application打成jar包形式部署,web工程配置在后面也会做简要介绍。

一、基本配置

<!-- pom.xml文件以project为根节点 -->
<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">
	
	<!-- 声明pom.xml文件所支持的版本 -->
    <modelVersion>4.0.0</modelVersion>
	<!-- 全局性项目唯一标识,通常使用完全限定的包名来和其它项目区分 -->
    <groupId>front</groupId>
	<!-- 在给定的groupId内唯一的产品标识,也是输出的工程名 -->
    <artifactId>front</artifactId>
	<!-- 此项目输出的artifactId的当前版本 -->
    <version>1.0</version>
	<!-- 输出类型:jar、war、ear... -->
    <packaging>jar</packaging>

二、构建配置

<!-- 项目本地构建文件列表,可以改变文件构建过程 -->
    <profiles>
        <profile>
	    <!-- 开发环境配置 -->
            <id>dev</id>
	    <!-- 默认执行开发环境配置 -->
	    <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
		<!-- 各属性配置,在配置文件中直接使用${}占位即可 -->
                <log.level>TRACE</log.level>
           	<!-- ... -->
            </properties>
        </profile>
        <profile>
	    <!-- 线上环境配置 -->
            <id>prod</id>
            <properties>
                <log.level>DEBUG</log.level>
                <!-- ... -->
            </properties>
        </profile>
    </profiles>
使用方法:mvn clean package -Pdev 或者 -Pprod (执行不同的构建配置)进行打包。

详情可以参见我的另一篇blog:

结合Commons Configuration和Maven进行工程配置管理 http://shensy.iteye.com/blog/1747408  

三、常量

<!-- 定义一些常量,在项目其他地方可以使用 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<!-- ... -->
    </properties>

四、依赖管理

<!-- 此项目所有的依赖列表 -->
  <dependencies>
    <dependency>
        <groupId>xxx</groupId>
        <artifactId>xxx</artifactId>
        <version>x.x.x</version>
        <scope>xx</scope>
    </dependency>
    <!-- ... -->
  </dependencies>

五、<build></build>标签内元素

1、资源resources

<!-- resource的列表,用于包括所有的资源 -->
        <resources>
            <resource>
		<!-- 资源所在的位置 -->
                <directory>${project.basedir}/src/main/resources</directory>
		<!-- 是否替换资源中的属性placehold:${} -->
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>${project.basedir}/bin</directory>
                <targetPath>${project.build.directory}/bin</targetPath>
                <filtering>true</filtering>
            </resource>
        </resources>

 2、插件plugins

<plugins>
	    <!-- 资源插件:用于资源文件管理 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.5</version>
                <configuration>
		    <!-- 资源文件编码 -->
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>

 

<!-- 编译插件 -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
		    <!-- 源代码jdk编译版本 -->
                    <source>1.6</source>
		    <!-- 目标平台jdk编译版本 -->
                    <target>1.6</target>
		    <!-- 字符集编码 -->
                    <encoding>UTF-8</encoding>
		    <!--编译参数,详见javac命令,此处为控制是否执行注释处理和/或编译.-->
                    <compilerArgument>-proc:none</compilerArgument>
                </configuration>
            </plugin>

 

<!-- 依赖管理 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
			    <!-- 将所有依赖的jar都拷贝出来 -->
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                          <outputDirectory>${project.build.directory}/lib</outputDirectory>
                          <overWriteReleases>false</overWriteReleases>
                          <overWriteSnapshots>false</overWriteSnapshots>
                          <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

 

<!-- jar打包管理 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
			    <!-- 往Manifest.MF文件中添加ClassPath -->                      
                            <addClasspath>true</addClasspath>
			    <!-- classpath前缀 -->
                            <classpathPrefix>lib/</classpathPrefix>
			    <!-- 主程序入口 -->
                            <mainClass>com.xxx.rest.Application</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

 

<!-- 自定义打包管理 -->
<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <!-- 将maven-assembly-plugin继承到标准的maven打包过程中,
         在运行maven-package时就会执行maven-assembly-plugin的操作,
         从而实现我们需要的自定义打包. -->
    <executions>
    	<execution>
            <id>distro-assembly</id>
            <phase>verify</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
	    	<!-- 指定maven-assembly-plugin的配置文件 -->
            	<descriptors>
               	    <descriptor>src/main/assembly/assembly.xml</descriptor>
            	</descriptors>
            </configuration>
        </execution>
     </executions>
</plugin>

 

<!-- 测试插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <includes>
                        <include>**/*Tests.java</include>
                    </includes>
                </configuration>
            </plugin>

 

<!-- 测试覆盖率插件 -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <formats>
                        <format>xml</format>
                    </formats>
                    <check></check>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>cobertura</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

 

<!-- 源码包:当使用一个第三方依赖的时候,有时候会希望在IDE中直接进入该依赖的源码查看其实现的细节,如果该依赖将源码包发布到了Maven仓库,那么像Eclipse就能通过m2eclipse插件解析下载源码包并关联到你的项目中,十分方便. -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>2.1.2</version>
    <executions>
      <execution>
        <id>attach-sources</id>
        <phase>verify</phase>
        <goals>
          <goal>jar-no-fork</goal>
        </goals>
      </execution>
    </executions>
</plugin>

生成Javadoc包:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.7</version>
    <executions>
      <execution>
        <id>attach-javadocs</id>
          <goals>
            <goal>jar</goal>
          </goals>
      </execution>
    </executions>
</plugin>

3、finalname

<finalName>front</finalName>

4、关于自定义打包管理插件maven-assembly-plugin:

将maven-assembly-plugin继承到标准的maven打包过程中,在运行maven-package时就会执行maven-assembly-plugin的操作,从而实现我们需要的自定义打包.上文中将maven-assembly-plugin插件配置文件位置定义在

src/main/assembly/assembly.xml

中,assembly.xml详细配置如下:

基本配置:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <id>dist</id>
    <!-- 打包的最终格式 -->
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>

filesets配置:

<fileSets>
        <fileSet>
	    <!-- ${project.build.directory}/lib打到lib下 -->
            <directory>${project.build.directory}/lib</directory>
            <outputDirectory>lib</outputDirectory>
            <includes>
                <include>**/**</include>
            </includes>
        </fileSet>
        <fileSet>
	    <!-- ${project.build.directory}下的jar打到当前路径下,不包含*-sources.jar -->
            <directory>${project.build.directory}</directory>
            <outputDirectory>.</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
            <excludes>
                <exclude>*-sources.jar</exclude>
            </excludes>
        </fileSet>
        <fileSet>
	    <!-- bin下的sh文件打到bin路径下 -->
            <directory>${project.build.directory}/bin</directory>
            <outputDirectory>bin</outputDirectory>
            <includes>
                <include>*.sh</include>
            </includes>
	    <!-- 最大文件权限 -->
            <fileMode>0777</fileMode>
	    <!-- unix结束符 -->
            <lineEnding>unix</lineEnding>
        </fileSet>
        <fileSet>
	    <!-- classes下的*.properties,*.xml文件打到conf路径下 -->
            <directory>${project.build.directory}/classes</directory>
            <outputDirectory>conf</outputDirectory>
            <includes>
                <include>*.properties</include>
                <include>*.xml</include>
            </includes>
	    <!-- unix结束符 -->
            <lineEnding>unix</lineEnding>
        </fileSet>
</fileSets>

使用maven-assembly-plugin打包完成后,target路径下回生成一个zip文件,然后就可以直接将zip包上传并解压缩直接部署了。

六、关于web工程[以下节选自网络]:

web配置与jar不同,默认配置package为war。如果需要自定义配置,需要修改插件配置。

任何一个Maven项目都需要定义POM元素packaging(如果不写则默认值为jar)。

该元素决定了项目的打包方式。实际的情形中,如果你不声明该元素,Maven会帮你生成一个JAR包;如果你定义该元素的值为war,那你会得到一个WAR包;如果定义其值为POM(比如是一个父模块),那什么包都不会生成。

Maven为jar项目调用了maven-jar-plugin,为war项目调用了maven-war-plugin,换言之,packaging直接影响Maven的构建生命周期。了解这一点非常重要,特别是当你需要自定义打包行为的时候,你就必须知道去配置哪个插件。

一个常见的例子就是在打包war项目的时候排除某些web资源文件,这时就应该配置maven-war-plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
      <webResources>
        <resource>
          <directory>src/main/webapp</directory>
          <excludes>
            <exclude>**/*.jpg</exclude>
          </excludes>
        </resource>
      </webResources>
    </configuration>
</plugin>

 

 

参考资料:

http://maven.apache.org/guides/getting-started/index.html Maven Getting Started Guide 

http://maven.apache.org/plugins/index.html  Maven官方常用插件一栏

http://www.infoq.com/cn/news/2011/04/xxb-maven-7-plugin Maven实战系列(七)——常用Maven插件介绍

http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package Maven实战(九)——打包的技巧

http://www.iteye.com/topic/1127097 深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤

http://snowolf.iteye.com/blog/953735 

http://www.blogjava.net/aoxj/archive/2009/01/16/251615.html 

http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html 

 

 

 

分享到:
评论

相关推荐

    掌握Java生态:Maven与Gradle的项目管理之道

    ### Java 生态中的 Maven 与 Gradle:项目管理之道 #### Java 语言概览 Java 作为一种被广泛采用的编程语言,在多个领域中都发挥着关键作用。它由 Sun Microsystems(现已被 Oracle 收购)在 1995 年首次推出。...

    maven工程

    【标题】:“Maven工程”是一个广泛使用的Java项目管理和构建工具,它简化了构建过程,通过依赖管理和项目对象模型(POM)的概念,使得开发者能够更有效地管理项目的构建、报告和文档。 【描述】:Maven是Apache...

    高效构建Java应用:Maven入门和进阶

    - [二、基于IDEA的Maven工程创建](#二基于IDEA的Maven工程创建) - [2.1梳理Maven工程GAVP属性](#21梳理Maven工程GAVP属性) - [2.2 Idea构建Maven JavaSE工程](#22-Idea构建Maven-JavaSE工程) - [2.3 Idea构建...

    maven 逆向逆向工程

    3. **依赖管理**:Maven的核心功能之一就是管理项目依赖。在逆向工程过程中,Maven会分析.class文件中的引用,推断出项目的外部库依赖,并添加到pom.xml文件中。 4. **项目结构重建**:Maven遵循一套标准的目录结构...

    软件工程课程设计项目:基于Maven+SSM搭建的家庭理财管理系统

    这个系统的核心是基于“SpringMVC+Spring+Mybatis”(SSM)的三层架构,结合Maven作为项目构建和依赖管理工具。下面将详细介绍这些技术及其在项目中的应用。 1. **SpringMVC**: SpringMVC是Spring框架的一部分,...

    使用Maven搭建S2SH工程详解一:使用Maven创建struts2工程

    【使用Maven搭建S2SH工程详解一:创建Struts2工程】 在Java Web开发中,S2SH架构(Struts2 + Spring + Hibernate)是一种常见的应用框架组合,用于构建高效、灵活的企业级应用程序。本篇文章主要讲解如何利用Maven...

    在java工程中配置maven项目

    本文将详细讲解如何在Java工程中配置Maven项目,帮助开发者高效地进行项目构建。 一、Maven简介 Maven是由Apache软件基金会开发的一个项目管理和综合工具。它通过一个XML格式的配置文件(pom.xml)来管理项目的...

    构建工具:maven简介

    创建Java工程是Maven的基本功能之一。使用mvn archetype:generate命令可以启动一个基于不同模板的项目工程的创建。常见的工程类型包括普通的Java应用、Android应用、OSGi bundle、Clojure项目、Web应用打包(WAR)等...

    手动创建maven工程

    本资源提供了一个手动创建的Maven工程示例,有助于初学者理解和掌握如何从零开始构建Maven项目。 首先,我们要理解Maven的核心概念——Project Object Model (POM)。POM是Maven项目的基本配置单元,包含了项目信息...

    Maven是一个开源的项目管理和构建工具,主要用于Java平台的项目构建和依赖管理,但也可以支持其他语言的项目 Maven通过项

    Maven通过项目对象模型(POM)来管理项目配置信息,自动化构建、测试和部署过程。以下是对Maven的详细解析: 一、Maven的主要功能和特点 项目结构管理:Maven使用一种约定的项目结构,通过在项目中定义标准目录结构...

    超详细版图文Maven安装及配置

    #### 五、Maven 工程配置示例 ##### 5.1 pom.xml 文件 - **项目坐标**:在 Maven 项目的核心配置文件 `pom.xml` 中,通过 `&lt;groupId&gt;`, `&lt;artifactId&gt;`, `&lt;version&gt;` 等元素来定义项目的坐标。 - **依赖声明**:...

    孔浩maven工程

    综上所述,"孔浩maven工程"是一个完整的开发环境,涵盖了Maven的使用和实践,适合学习和实践Maven的各类功能,包括项目构建、依赖管理、多模块组织、自定义配置等。通过这个项目,开发者不仅可以深入了解Maven的工作...

    maven工程小例子

    在这个"maven工程小例子"中,我们可能还会遇到如日志管理、异常处理、测试覆盖率报告等其他方面的问题。通过学习和实践,我们可以掌握如何高效地利用Maven和Appium进行Android应用的自动化测试和项目构建。

    maven搭建SSH工程

    总结,Maven搭建SSH工程涉及到多个步骤,包括Maven的安装与配置、SSH框架的依赖引入、配置文件的创建和编辑、业务逻辑的编写以及最后的测试与部署。理解并熟练掌握这些步骤,对于Java Web开发者来说是非常重要的技能...

    maven 项目管理工具

    4. **多模块项目支持**:Maven 支持多个模块的项目结构,可以方便地管理大型的、复杂的软件工程。 5. **版本管理**:Maven 提供了 SNAPSHOT 版本的概念,用于处理开发中的不稳定版本。 6. **项目信息报告**:Maven...

    用Java开发学生信息系统:Maven工程构建与标准库应用

    本文详细介绍了一个Java简易程序实例—学生信息管理系统的制作流程,涵盖创建Maven项目、配置pom.xml、编写实体类(Student)、业务管理类(StudentManager)以及主控类(Main),并介绍数据如何存于本地txt中。...

    maven教案-maven入门学习资料

    【 Maven 工程结构** Maven 项目通常有以下标准目录结构: - `src/main/java`:存放 Java 源代码。 - `src/main/resources`:放置项目资源文件,如配置文件。 - `src/test/java`:存放测试用例的 Java 源代码。 - ...

    项目管理-maven(一)

    Maven是一个流行的项目管理工具,用于帮助Java开发人员构建、发布和管理项目。它提供了一种标准化的方式来构建项目、管理依赖、运行测试、生成文档等,使得项目的构建过程更加自动化和规范化。 Maven基于项目对象...

Global site tag (gtag.js) - Google Analytics