Maven学习,使用笔记

Maven使用笔记

使用Maven有一段时间了,用它做过几个项目的构建工具,感觉还是非常不错的,省去很多不必要的麻烦,比如jar包的依赖管理,升级等,还可以处理一些繁杂的事务,比如简单的代码生成,数据导入导出等。当然这里有一定的学习成本!

本文就一些常规使用做了介绍,包括一些需要注意的地方和本人常人的配置插件等。

特别说明,由于settings.xml是针对全局或个人的设置,不能随项目走,所以本文直接无视settings.xml的配置!

Maven一般目录结构

.
pom.xml
src
   |-main
         |-java
         |-resources
         |-webapp
   |-test
         |-java
         |-resources
target

Maven属性设置

项目属性配置

加*项是建项目必要属性

属性名称 描述
groupId * 当前项目隶属的上级项目ID,一般是系列相关子项目的组ID,如:org.springframework
artifactId * 当前项目模块ID,一般为实际项目ID,如:spring-web
version * 此项目模块的版本
packaging 项目类型,jar或war,默认为jar
name 项目名称,如果跟IDE配合使用时IDE会识别此名称
description 项目描述
organization 所属组织
licenses 许可协议
mailingLists 邮件列表
developers 开发者
contributors 贡献者
issueManagement 问题追踪系统
ciManagement 持续集成系统
scm 版本控制系统

POM一般属性变量

名称 说明
${basedir} 项目根目录,包含pom.xml文件的目录
${version} 项目的版本
${pom.build.sourceDirectory} 项目的主源码目录,默认为:src/main/java
${pom.build.testSourceDiretory} 项目的测试源码目录, 默认为:src/test/java
${pom.build.directory} 项目构建输出目录,默认为target
${pom.outputDirectory} 项目主代码编译输出目录,默认为: target/classess
${pom.testOutputDirectory} 项目主代码编译输出目录,默认为: target/test-classess
${pom.groupId} 项目的groupId
${pom.artifactId} 项目的artifactId
${pom.version} 项目的版本
${pom.build.finalName} 项目打包输出文件的名称,默认为${pom.artifactId}-${pom.version}

以上build属性可通过pom.xml文件中build结点指定如:

<build>
    <directory>${pom.basedir}/target</directory>
    <outputDirectory>${pom.build.directory}/classes</outputDirectory>
    <finalName>${pom.artifactId}-${pom.version}</finalName>
    <testOutputDirectory>${pom.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${pom.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${pom.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${pom.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${pom.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
<build>

更多内容:MavenPropertiesGuide

自定义属性变量

在根结点增加:

<projecties>
    <spring.version>3.1-RELEASE</spring.version>
    <hibernate.version>4.2-FINAL</hibernate.version>        
    <!-- 使用${spring.version}读取 -->
</projecties>

资源文件使用Maven变量

如有文件 src/main/resources/application.properties

# application.properties
application.name=${pom.name}
application.version=${pom.version}

执行命令:mvn process-resources maven会给其中的亦是赋值:

# application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT

更多内容:http://maven.apache.org/guides/getting-started/index.html#How_do_I_filter_resource_files

Maven依赖管理

自定义源地址

如在maven的中央仓库中没有你要用的jar包,通过自定义源解决:

<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>

排除依赖和子项目依赖

<dependency>
    <!-- 子项目,被依赖的子项目必须经过maven的install安装,不然maven还是找不到! -->
    <groupId>bgonline</groupId>
    <artifactId>foundation</artifactId>
    <version>1.0.0</version>
    <!-- 排除 -->
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

本地JAR包安装

##安装jar文件
call mvn install:install-file -Dfile=xxx-1.0.0.jar -DgroupId=com.xx -DartifactId=xx -Dversion=1.0.0 -Dpackaging=jar
##安装pom文件
call mvn install:install-file -Dfile=xxx-1.0.0.pom.xml -DgroupId=com.xx -DartifactId=xx -Dversion=1.0.0 -Dpackaging=pom

Maven插件管理

添加插件:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.3</version>
            </plugin> 
        </plugins>
    </pluginManagement>
</build>

自定义插件源

<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>

常用插件

名称 说明
jetty-maven-plugin jetty插件,轻量级web容器,推荐阶段开发使用
maven-antrun-plugin 跑ant命令插件,常用来做文件处理,sql执行等,基本包括ant所有功能
native2ascii-maven-plugin 转ascii,如多语言配置文件的中文转成ascii码解决乱码问题
versions-maven-plugin 检测所有依赖的更新情况
maven-surefire-plugin 生成测试报告,配全Testng,指定单元测试的配置文件,进行分组、分类、分包测试,可参考Testng文档说明

更多内容:plugins

Maven Profile使用

有时候会根据不同的情况执行不现的构建命令,这就用到maven的profile,profile可以直接写在pom.xml里也可以被提出到独立文件profiles.xml同pom.xml同级目录或settings.xml,但Maven3只支持写在pom.xml文件里,why?!

1.使用profile+ant执行sql做数据初始化:

<profile>
    <id>INIT-DB-DATA</id>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <configuration>
                    <target>
                        <sql driver="${jdbc.driver}" url="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}" onerror="continue">
                            <classpath refid="maven.runtime.classpath"/>
                            <transaction src="src/main/resources/sql/${jdbc.direct}/schema.sql"/>
                        </sql>
                    </target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

2.使用maven profile ant hibernate-tools生成类bean:

<profile>
    <id>Gen-Java-Bean</id>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <configuration>
                    <target>
                        <echo message="生成表ENTITY类……"/>
                        <property name="toolsDir" value="src/test/tools"/>
                        <!-- 这里需要指定hibernatetool相关jar包,自行下载 -->
                        <path id="lib.class.path">
                            <fileset dir="${toolsDir}/lib">
                                <include name="*.jar"/>
                            </fileset>
                        </path>
                        <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="lib.class.path"/>
                        <hibernatetool destdir="${toolsDir}/lib/build">
                            <jdbcconfiguration propertyfile="${toolsDir}/lib/cfg/jdbc.properties" revengfile="${toolsDir}/lib/cfg/hibernate.reveng.xml"/>
                            <!-- 指定hibernatetools生成bean的模板,根据自己需要定制生成内容,用的freemarker引擎,在hibernate-tools.jar包里有默认模板 -->
                            <hbmtemplate
                                    destdir="${toolsDir}/lib/build"
                                    templatepath="${basedir}/${toolsDir}/lib/hbmtemplates/"
                                    templateprefix="/hbmtemplates"
                                    filepattern="{class-name}Entity.java"
                                    template="pojo2/Pojo.ftl">
                                <property key="ejb3" value="false"/>
                                <property key="jdk5" value="false"/>
                            </hbmtemplate>
                            <!-- 或者直接 <hbm2java/> 只是这样使用的是默认模板 -->
                        </hibernatetool>
                    </target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

更多内容:profiles.html

Maven多项目配置

创建如下目录结构:

+- pom.xml 父
+- my-app
| +- pom.xml 子1,jar类型
| +- src
|   +- main
|     +- java
+- my-webapp
| +- pom.xml 子2,webapp类型
| +- src
|   +- main
|     +- webapp

父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>app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <modules>
    <module>my-app</module>
    <module>my-webapp</module>
  </modules>
</project>

注:一些项目全局属性可在此pom文件中设置,比如项目信息,所有依赖等,这样在子项目就不用重复申明,如依赖可省掉版本号,直接使用父pom中的版本,这样可以统一管理所有项目的依赖版本。

子1的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">
    <groupId>com.mycompany.app</groupId>
    <artifactId>app-jar</artifactId>
    <packaging>jar</packaging>
    <parent>
        <groupId>com.mycompany.app</groupId>
        <artifactId>app</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    ...

子2的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">
    <groupId>com.mycompany.app</groupId>
    <artifactId>app-war</artifactId>
    <packaging>war</packaging>
    <parent>
        <groupId>com.mycompany.app</groupId>
        <artifactId>app</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    ...

子2需要依赖子1,配置如下:

...
<dependencies>
<dependency>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>

最后在父pom所在目录执行mvn clean install命令,jar包会被安装本地仓库,war会被发布到target目录。

Maven创建项目

创建java项目

mvn archetype:generate \
  -DarchetypeGroupId=org.apache.maven.archetypes \
  -DgroupId=com.mycompany.app \
  -DartifactId=my-app

生成的目录结构:

my-app
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- mycompany
    |               `-- app
    |                   `-- App.java
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java

创建java webapp

mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp \
-DgroupId=com.mycompany.app \
-DartifactId=my-webapp

生成的目录结构:

+- my-webapp
| +- pom.xml
| +- src
|   +- main
|     +- resources
|     +- webapp
|       +- index.jsp
|       +- WEB-INF
|         +- web.xml

之后根据需要在main下创建java目录,在src创建test目录。

生命周期常用命令

  1. 编译 mvn compile,编译测试 mvn test-compile,不执行测试,仅编译
  2. 测试 mvn test,执行测试
  3. 打包 mvn package,java项目打成jar包,web项目打包war包
  4. 安装 mvn install,将自己java项目生成的jar包安装到本地仓库
  5. 站点 mvn site,根据pom.xml配置信息生成项目相关的站点在target/site
  6. 清除 mvn clean,将target目录下build后的内容删除

更多内容:lifecycle.html

更多Maven参考

POM详细说明文档 :http://maven.apache.org/pom.html
POM说明3.0.5版:http://maven.apache.org/ref/3.0.5/maven-model/maven.html
Maven-3.0.5文档:http://maven.apache.org/ref/3.0.5/
maven.apache.org:http://maven.apache.org/guides/getting-started/
docs.codehaus.org:http://docs.codehaus.org/display/MAVENUSER

你可能感兴趣的:(Maven学习,使用笔记)