maven学习七:maven基础总结

maven是一个非常好的项目管理工具,采用了“约定优于配置”的方法,一些开发常用的操作和步骤已经固定在maven中,所以使用者不再需要去编写烦人的语句。同时,maven内置了开发流程的支持,它不仅能够编译,还能够打包,发布,也能够一气呵成做完这些所有步骤。

maven是什么

1.版本
maven有自己的版本定义和规则
2.构建
maven支持多种应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。
3.输出物管理
maven可以管理项目构建的产物并将其加入到用户库中,这个功能可以用于项目组和其他部门之间的交付行为。
4.依赖关系
maven对依赖关系的特征进行细致的分析和划分,避免开发过程中依赖混乱和相互污染行为。
5.文档和构建结果
maven的site命令支持各种文档信息的发布,包括构建过程的各种输出,javadoc,产品文档等。
6.项目关系
一个大型的项目通常有几个小项目或者模快组成用maven可以很方便地管理。
7.移植性管理
maven可以针对不同的开发场景,输出不同类型的输出结果。

maven生命周期

maven把项目的构建划分为不同的生命周期(lifecycle).包括:编译、测试、打包、验证、部署。maven中所有执行动作都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些动作进行各种处理。这个也是maven的一个基本调度机制。

maven规则:约定优于配置

所谓的“约定优于配置”在maven中并不是完全不可以修改的,他们只是一些配置的默认值而已。但是使用者除非必要,并不需要去修改那些约定内容。
maven默认文件存放结构如下:

/项目目录
    pom.xml 用于maven配置文件
    /src 源代码目录
        /src/main 工程源代码目录
            /src/main/java 工程Java源代码目录
            /src/main/resources 工程资源目录
        /src/test 单元测试目录
            /src/test/java 单元测试Java目录
            /src/test/resources 单元测试资源目录
    /target 输出目录,所有输出物都存放在这个目录下
        /target/classes 编译之后的class文件

每一个阶段的任务都知道怎么正确完成自己的工作 。比如compile任务就知道从/src/main/java 下编译所有的Java文件并把它输出class文件存放到target/classes中。对maven来说,采用“约定优于配置”的策略可以减少修改配置工作量也可以降低学习成本,更重要的是给项目引入统一的规范。

maven版本规范

maven使用如下几个要素来唯一定位某一输出物:groupId,artifactId,packaging,version.具体介绍如下:
1.groupId
团体,公司,小组,项目或者其他团体。团体标识的约定是以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个com.sonatype开头的groupId,而Apache Software的项目有以org.apache开头的groupId。
2.artifactId
在groupId下的表示一个单独项目的唯一标识符。比如我们的tomcat,commons等。注意不要在artifactId中包含点号(.)
3.version
一个项目的特定版本发布的项目有一个固定的版本标识来指向该项目的某一个特定版本。而正在开发中的项目可以用一个特殊的标识。则这种标识给版本加上一个”SNAPSHOT”的标识。虽然项目的打包格式也是maven坐标的重要组成部分,但是它不是唯一标识符的一个部分。一个项目的groupId,artifactId,version使之成为一个独一无二的项目,你不能同时有一个拥有同样的groupId,artifactId,version标识的项目。
4.packaging
项目的类型,默认为jar。描述了项目打包后的输出,类型为jar的项目产生一个jar文件,类型为war的项目产生一个web应用。
5.classifier
很少使用的坐标。一般都可以忽略classifiers。如果你要发布同样的代码,但是由于技术原因需要生成两个单独的构件,你就要使用一个分类器(classifier)。例如如果你想要构建两个单独的构件成jar,一个使用java1.4编译器,另一个使用java6编译器,你就可以使用分类器来生成两个单独的jar构件,它们有同样的groupId,artifactId,version组合。如果你的项目使用本地扩展类库,你可以使用分类器为每一个目标平台生成一个构件。分类器常用于打包构件的源码,javadoc或者二进制集合。

maven有自己的版本规范,一般是如下定义 比如1.2.3-beta-01 要说明的是maven自己判断版本的算法是major,minor,incremental部分用数字比较,qualifier部分用字符串比较,所以要小心alpha-2和alpha-15的比较关系,最好用alpha-2的格式。
maven在版本管理时候可以使用几个特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。比如”1.0-SNAPSHOT”。各个部分的含义和处理逻辑如下说明:
1.SNAPSHOT
如果一个版本包含字符串”SNAPSHOT”,Maven就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为UTC时间。例 如,”1.0-SNAPSHOT”会在2010年5月5日下午2点10分发布时候变成1.0-20100505-141000-1。
这个词只能用于开发过程中,因为一般来说,项目组都会频繁发布一些版本,最后实际发布的时候,会在这些snapshot版本中寻找一个稳定的,用于正式发 布,比如1.4版本发布之前,就会有一系列的1.4-SNAPSHOT,而实际发布的1.4,也是从中拿出来的一个稳定版。
2.LATEST
指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个snapshot版,具体看哪个时间最后。
3.RELEASE
指最后一个发布版。

maven组成部分

maven把整个maven管理的项目分为几个部分,一个部分是源代码,包括源代码本身、相关的各种资源,一个部分则是单元测试用例,另外一部分则是各种maven的插件。对于这几个部分,maven可以独立管理他们,包括各种外部依赖关系。

maven的依赖管理

依赖管理一般是最吸引人使用maven的功能特性了,这个特性让开发者只需要关注代码的直接依赖,比如我们用了spring,就加入spring依赖说明就可以了,至于spring自己还依赖哪些外部的东西,maven帮我们搞定。
任意一个外部依赖说明包含如下几个要素:groupId, artifactId, version, scope, type, optional。其中前3个是必须的,各自含义如下:

  • groupId 必须

  • artifactId 必须

  • version 必须 这里的version可以用区间表达式来表示比如(2.0,)表示>2.0 [2.0,3.0)表示2.0<=version<3.0 多个条件直接用逗号分隔 如[1,3),[5,7]

  • scope 作用域限制

  • type 一般在pom引用依赖时候出现,其他时候不用

  • optional 是否可选依赖

maven认为程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中依赖关系有作用域(scope)的限制。在maven中scope包含如下取值:

  • compile(编译范围)
    compile是默认的范围,如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。

  • provided(已提供范围)
    provided依赖只有在当jdk或者一个容器已提供该依赖之后才使用。例如如果你开发了一个web应用,你可能在编译classpath中需要可用的Serverlet API来编译一个Servlet,但是你不会想要在打包好的war中包含这个servletAPI 这个servlet API jar由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的也不会被打包。

  • runtime(运行时范围)
    runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如你可能在编译的时候只需要jdbc api jar 而只有在运行的时候才需要jdbc驱动实现。

  • test(测试范围)
    test范围依赖在一般的编译和运行时都不需要,他们只有在测试编译和测试运行阶段可用。

  • system(系统范围)
    system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。 如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素 。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。

另外,代码有代码自己的依赖,各个maven使用的插件也可以有自己的依赖关系。依赖也可以是可选的,比如我们代码中没有任何cache依赖,但是hibernate可能要配置cache,所以该cache的依赖就是可选的。

多项目管理

maven的多项目管理也是非常强大的。一般来说,maven要求同一个工程的所有子项目都放置到同一个目录下,每一个子目录代表一个项目,比如

总项目/
  pom.xml 总项目的pom配置文件
  子项目1/
    pom.xml1
  字项目2/
    pom.xml2

按照这种格式存放,就是继承方式,所有具体子项目的pom.xml都会继承总项目pom的内容,取值为子项目pom内容优先。

要设置继承方式,首先要在总项目的pom中加入如下配置:

<modules>    
   <module>simple-weather</module>    
   <module>simple-webapp</module>    
</modules> 

其次在每个子项目中加入

<parent>
<groupId>org.sonatype.mavenbook.ch06</groupId>
  <artifactId>simple-parent</artifactId>
  <version>1.0</version>
</parent>

即可
当然,继承不是唯一的配置文件共用方式,maven还支持引用方式。引用pom的方式更简单,在依赖中加入一个type为pom的依赖即可。

<project>
  <description>This is a project requiring JDBC</description>
  ... 
  <dependencies>
  ...
  <dependency>
      <groupId>org.sonatype.mavenbook</groupId>
      <artifactId>persistence-deps</artifactId> 
      <version>1.0</version>
      <type>pom</type> 
    </dependency>
  </dependencies>
</project>

属性
用户可以在maven中定义一些属性,然后在其他地方用${xxx}进行引用。比如:

<project>    
    <modelVersion>4.0.0</modelVersion>
    ...
    <properties>
        <var1>value1</var1>  
    </properties>
</project>

maven提供了三个隐式的变量,用来访问系统环境变量、POM信息和maven的settings:

  • env
    暴露操作系统的环境变量,比如env.PATH

  • project
    暴露POM中的内容,用点号(.)的路径来引用POM元素的值,比如${project.artifactId}。另外,java的系统属性比如user.dir等也暴露在这里。

  • settings
    暴露maven的settings的信息,也可以用点号(.)来引用。maven把系统配置文件存放在maven的安装目录中,把用户相关的配置文件存放 在~/.m2/settings.xml(unix)或者%USERPROFILE%/.m2/settings.xml(windows)中。

maven的profile

profile是maven的一个重要特性,它可以让maven能够自动适应外部的环境变化,比如同一个项目,在linux下编译linux的版 本,在win下编译win的版本等。一个项目可以设置多个profile,也可以在同一时间设置多个profile被激活(active)的。自动激活的 profile的条件可以是各种各样的设定条件,组合放置在activation节点中,也可以通过命令行直接指定。profile包含的其他配置内容可以覆盖掉pom定义的相应值。如果认为profile设置比较复杂,可以将所有的profiles内容移动到专门的 profiles.xml 文件中,不过记得和pom.xml放在一起。
activation节点中的激活条件中常见的有如下几个:
1、OS 判断操作系统相关的参数,它包含如下可以自由组合的子节点元素

  • message - 规则失败之后显示的消息

  • arch - 匹配cpu结构,常见为x86

  • family - 匹配操作系统家族,常见的取值
    为:dos,mac,netware,os/2,unix,windows,win9x,os/400等

  • name - 匹配操作系统的名字

  • version - 匹配的操作系统版本号

  • display - 检测到操作系统之后显示的信息

pom.xml中

<profiles>    
  <profile>    
    <id>profileTest1</id>    
    <activation>    
      <os>    
         <name>Windows XP</name>    
         <family>Windows</family>    
         <arch>x86</arch>    
         <version>5.1.2600</version>    
      </os>    
    </activation>    
  </profile>    
</profiles>   

上面的情况就是根据操作系统的类型来激活profileTest1。
2、检查jdk版本,可以用区间表示。

<profiles>    
   <profile>    
     <id>profileTest1</id>    
     <jdk>1.5</jdk>    
   </profile>    
<profiles>  

上面情况表示在jdk为1.5版本系列的时候激活profileTest1。

<profiles>    
  <profile>    
     <id>profileTest1</id>    
     <jdk>[1.4,1.7)</jdk>    
  </profile>    
<profiles> 

上面的情况表示在jdk为1.4、1.5和1.6的时候激活profileTest1。
3、property 检查属性值,本节点可以包含name和value两个子节点。

<profiles>    
  <profile>    
     <id>profileTest1</id>    
     <activation>    
     <property>    
         <name>hello</name>    
         <value>world</value>    
      </property>    
    </activation>    
  </profile>    
</profiles> 

上面的profileTest1将在提供了系统属性hello,并且其值为world的时候激活。下面的做法可以激活profileTest1。

mvn package –Dhello=world 

4、file 检查文件相关内容,包含两个子节点:exists和missing,用于分别检查文件存在和不存在两种情况。

<profiles>    
  <profile>    
    <id>profileTest1</id>    
    <activation>    
      <file>    
         <exists>target</exists>    
      </file>    
    </activation>    
  </profile>    
</profiles> 

上面的定义表示当存在target文件时激活profileTest1。

maven的操作和使用

maven的操作有两种方式,一种是通过mvn命令行命令,一种是使用maven的eclipse插件。因为使用eclipse的maven插件操作起来比较容易,这里就只介绍使用mvn命令行的操作。

maven的配置文件

maven的主执行程序为mvn.bat,linux下为mvn.sh,这两个程序都很简单,它们的共同用途就是收集一些参数,然后用 java.exe来运行maven的Main函数。maven同样需要有配置文件,名字叫做settings.xml,它放在两个地方,一个是maven 安装目录的conf目录下,对所有使用该maven的用户都起作用,我们称为主配置文件,另外一个放在 %USERPROFILE%/.m2/settings.xml下,我们成为用户配置文件,只对当前用户有效,且可以覆盖主配置文件的参数内容。还有就是项目级别的配置信息了,它存放在每一个maven管理的项目目录下,叫pom.xml,主要用于配置项目相关的一些内容。当然如果有必要,用户也可以在 pom中写一些配置,覆盖住配置文件和用户配置文件的设置参数内容。
一般来说,settings文件配置的是比如repository库路径之类的全局信息,具体可以参考官方网站的文章

maven多项目管理

多项目管理是maven的主要特色之一,对于一个大型工程,用maven来管理他们之间复杂的依赖关系,是再好不过了。maven的项目配置之间的关系有两种:继承关系和引用关系。
maven默认根据目录结构来设定pom的继承关系,即下级目录的pom默认继承上级目录的pom。要设定两者之间的关系很简单,上级pom如下设置:

<modules>    
    <module>ABCCommon</module>    
    <module>ABCCore</module>    
    <module>ABCTools</module>    
</modules> 

要记住的是,这里的module是目录名,不是子工程的artifactId。子工程如下设置:

<parent>    
    <groupId>com.abc.product1</groupId>    
    <artifactId>abc-product1</artifactId>    
    <version>1.0.0-SNAPSHOT</version>    
</parent>    
<artifactId>abc-my-module2</artifactId>    
<packaging>jar</packaging>  

这样两者就相互关联起来了,继承关系就设定完毕,所有父工程的配置内容都会自动在子工程中生效,除非子工程有相同的配置覆盖。如果你不喜欢层层递进的目录结构来实现继承,也可以在parent中加入 ../a-parent/pom.xml 来制定parent项目的相对目录。继承关系通常用在项目共同特性的抽取上,通过抽取公共特性,可以大幅度减少子项目的配置工作量。
引用关系是另外一种复用的方式,maven中配置引用关系也很简单,加入一个 type 为 pom 的依赖即可。

<dependency>    
  <groupId>org.sonatype.mavenbook</groupId>    
    <artifactId>persistence-deps</artifactId>    
    <version>1.0</version>    
    <type>pom</type>    
</dependency>  

但是无论是父项目还是引用项目,这些工程都必须用 mvn install 或者 mvn deploy安装到本地库才行,否则会报告依赖没有找到,eclipse编译时候也会出错。需要特别提出的是复用过程中,父项目的pom中可以定义 dependencyManagement 节点,其中存放依赖关系,但是这个依赖关系只是定义,不会真的产生效果,如果子项目想要使用这个依赖关系,可以在本身的 dependency 中添加一个简化的引用

<dependency>    
   <groupId>org.springframework</groupId>    
   <artifactId>spring</artifactId>    
</dependency>

这种方法可以避免版本号满天飞的情况。

安装库文件到maven库中

在maven中一般都会用到安装库文件的功能,一则是我们常用的hibernate要使用jmx库,但是因为sun的license限制,所以无法将其直接包含在repository中。所以我们使用mvn命令把jar安装到我们本地的repository中

mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file

maven变量

maven定义了很多变量属性,参考这里 http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide
1.内置属性

${basedir } 项目根目录
${version } 等同于 ${project.version } or ${pom.version }

2.Pom/Project properties 所有pom中的元素都可以用 project. 前缀进行引用,以下是部分常用的

${project.build.directory} 构建目录,缺省为target
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
${project.name} refers to the name of the project
${project.version} refers to the version of the project
${project.packaging} 打包类型,缺省为jar
${project.xxx} 当前pom文件的任意节点的内容
${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}

3.本地用户设定 所有用的的 settings.xml 中的设定都可以通过 settings. 前缀进行引用

${settings.localRepository} refers to the path of the user's local repository.
${maven.repo.local} also works for backward compatibility with maven1 ??

4.环境变量 系统的环境变量通过 env. 前缀引用

${env.M2_HOME } returns the Maven2 installation path
${java.home } specifies the path to the current JRE_HOME environment use with relative paths to get for example:
<jvm>${java.home}../bin/java.exe</jvm>

5.java系统属性 所有JVM中定义的java系统属性.
6.用户在pom中定义的自定义属性

<project>
...
<properties>
  <my.filter.value>hello</my.filter.value>
</properties>
...
</project> 
或者
${my.filter.value } will result in hello if you inserted the above XML fragment in your pom.xml

7.上级工程的变量 上级工程的pom中的变量用前缀

${project.parent } 引用上级工程的版本也可以这样引用: ${parent.version }

maven使用

我们已经知道maven预定义了许多的阶段(phase),每个插件都依附于这些阶段,并且在进入某个阶段的时候,调用运行这些相关插件的功能。我们先来看完整的maven生命周期:在命令行中这样使用如mvn: package

生命周期阶段描述
validate验证项目是否正确,以及所有为了完整构建必要的信息是否可用
generate-source生成所有需要包含在编译过程中的源代码
process-source处理源代码,比如过滤一些值
generate-resources生成所有需要包含在打包过程中的资源文件
process-resources复制并处理资源文件至目标目录,准备打包
compile编译项目的源代码
process-classes后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)
generate-test-sources生成所有包含在测试编译过程中的测试源码
process-test-sources处理测试源码,比如过滤一些值
generate-test-resources生成测试需要的资源文件
process-test-resources复制并处理测试资源文件至测试目标目录
test-compile编译测试源码至测试目标目录
test使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布
prepare-package在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本(将会在Maven 2.1+中实现)
package将编译好的代码打包成可分发的格式,如JAR,WAR或者EAR
pre-integration-test执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境
integration-test如果有必要的话,处理包并发布至集成测试可以运行的环境
post-integration-test执行一些在集成测试运行之后需要的动作。如清理集成测试环境。
verify执行所有检查,验证包是有效的,符合质量规范
install安装包至本地仓库,以备本地的其它项目作为依赖使用
deploy复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)

maven常用插件

maven插件参考地址:http://maven.apache.org/plugins/index.html
1.clean插件
只包含一个goal叫做clean:clean 负责清理构建时候创建的文件。默认清理的位置如下几个变量指定的路径project.build.directory,project.build.outputDirectory,
project.build.testOutputDirectory,project.reporting.outputDirectory.

2.compiler插件
包含2个goal分别是compiler:compile和compiler:testCompile

3.surefire插件
运行单元测试用例的插件并且能够生成报表。包含一个goal为surefire:test只要参数testSourceDirectory用来指定测试用例目录

4.jar
负责将工程输出打包到jar文件中。包含两个goal分别是jar:jar,jar:test-jar 两个goal负责从classesDirectory或testClassesDirectory中获取所有资源然后输出jar文件到outputDirectory中。

5.war
负责打包war文件。常用goal有war:war 负责从warSourceDirectory(默认${basedir}/src/main/webapp)打包所有资源到outputDirectory中。

6.resources
负责复制各种资源文件,常用goal有resources:resources 负责将资源文件复制到outputDirectory中默认为${project.build.outputDirectory}

7.install
负责将项目输出(install:install)或者某个指定文件(install:install-file)加入到本机%USERPROFILE%/.m2/repository中。可以用install:help寻求帮助

8.deploy 负责将项目输出(deploy:deploy)或者某个指定的文件(deploy:deploy-file)加入到公司库中。

9.site 将工程所有文档生成网站,生成的网站界面默认和apache的项目站点类似,但是其文档用doxia格式写的目前不支持docbook需要用其他插件配合才能支持。

maven面试

1.如何增删一个依赖关系?
直接在pom文件中加入一个dependency节点。若是要删除把对应的dependency节点删除即可。
2.如何屏蔽一个依赖关系?比如在项目中使用的libA依赖某个库1.0版,libB依赖某个库2.0版,现在想统一使用2.0版,如何去掉1.0版的依赖?
设置不需要的依赖为exclusion即可。

<dependency>    
   <groupId>org.hibernate</groupId>    
   <artifactId>hibernate</artifactId>    
   <version>3.2.5.ga</version>    
   <exclusions>    
      <exclusion>    
       <groupId>javax.transaction</groupId>    
        <artifactId>jta</artifactId>    
      </exclusion>    
   </exclusions>    
</dependency> 

3.我有一些jar文件要依赖,但是我又不想把这些jar去install到mvn的repository中去,如何设置?
加入一个特殊的依赖关系,使用system类型。

<dependency>  
  <groupId>com.abc</groupId>  
  <artifactId>my-tools</artifactId>  
  <version>2.5.0</version>  
  <type>jar</type>  
  <scope>system</scope>  
  <systemPath>${basedir}/lib/mylib1.jar</systemPath>  
</dependency>  

但是要记住,发布的时候不会复制这个jar。需要手工配置,而且其他project依赖这个project的时候,会报告警告。如果没有特殊要求,建议直接注册发布到repository。
4.在eclipse环境中同时使用maven builder和eclipse builder并且设置项目依赖关系之后为什么编译出现artifactId找不到错误,但是直接使用命令mvn构建则一切正常?
在project属性中去掉java build path中对其他project的依赖关系直接在pom中设置依赖关系即可。

<!-- 依赖的其他项目 -->  
<dependency>  
    <groupId>com.abc.project1</groupId>  
    <artifactId>abc-project1-common</artifactId>  
    <version>${project.version}</version>  
</dependency> 

另外,保证没有其他错误。
5.我想让输出的jar包自动包含所有依赖
使用assmbly插件即可。

<plugin>  
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>  
     <descriptorRefs>  
        <descriptorRef>jar-with-dependencies</descriptorRef>  
     </descriptorRefs>  
   </configuration>  
</plugin>  

6.我的测试用例依赖于其他工程的测试用例如何设置?
答:maven本身在发布的时候,可以发布单纯的jar,也可以同时发布xxx-tests.jar和xxx-javadoc.jar(大家经常在repository中可以看到类似的东西)。我们自己的项目A要同时输出test.jar可以做如下的设置:

<!-- 用于把test代码也做成一个jar -->  
<plugin>  
 <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-jar-plugin</artifactId>  
    <executions>  
        <execution>  
            <goals>  
               <goal>test-jar</goal>  
            </goals>  
        </execution>  
    </executions>  
</plugin> 

然后在其他需要引用的工程B中做如下的dependency设置

<dependency>    
    <groupId>com.abc.XXX</groupId>    
    <artifactId>工程A</artifactId>    
    <version>${project.version}</version>    
    <type>test-jar</type>    
    <scope>test</scope>    
</dependency>   

7.如何使用变量替换?项目中的某个配置文件比如jdbc.properties使用了一些pom中的变量如何在发布中使用包含真实内容的最终结果文件?
使用资源过滤功能比如:

<project>
  ..
  <properties>
  <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
  <jdbc.url>jdbc:mysql://localhost:3306/development_db</jdbc.url>
  <jdbc.username>dev_user</jdbc.username>
  <jdbc.password>s3cr3tw0rd</jdbc.password>
 </properties>
  ..
  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
  </build>
  ..
  <profiles>
    <profile>
      <id>production</id>
      <properties>
        <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName>
        <jdbc.url>jdbc:oracle:thin:@proddb01:1521:PROD</jdbc.url>
        <jdbc.username>prod_user</jdbc.username>
        <jdbc.password>s00p3rs3cr3t</jdbc.password>
      </properties>
    </profile>
  </profiles>
</project>

8.maven-svn-revision-number-plugin插件说明
maven-svn-revision-number-plugin 可以从svn中获取版本号并将其变成环境变量交由其他插件或者profile使用一般和resource的filter机制同时使用。

<plugins>  
  <plugin>  
    <groupId>com.google.code.maven-svn-revision-number-plugin</groupId>  
    <artifactId>maven-svn-revision-number-plugin</artifactId>  
    <version>1.3</version>  
    <executions>  
      <execution>  
        <goals>  
          <goal>revision</goal>  
        </goals>  
      </execution>  
    </executions>  
    <configuration>  
     <entries>  
       <entry>  
         <prefix>prefix</prefix>  
       </entry>  
      </entries>  
    </configuration>  
   </plugin>  
 </plugins>  

这段代码负责把resource文件中的内容替换成适当内容

repository = ${prefix.repository}
path = ${prefix.path}
revision = ${prefix.revision}
mixedRevisions = ${prefix.mixedRevisions}
committedRevision = ${prefix.committedRevision}
status = ${prefix.status}
specialStatus = ${prefix.specialStatus}

9.如何给插件指派参数?比如我要设置一些编译参数?

<project>
  ...
 <build>
    ...
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

10.我的目录是非标准的目录结构,如何设置让maven支持?
指定source目录和test-source目录即可。

<build>  
  <directory>target</directory>  
  <sourceDirectory>src</sourceDirectory>  
  <scriptSourceDirectory>js/scripts</scriptSourceDirectory>  
  <testSourceDirectory>test</testSourceDirectory>  
  <outputDirectory>bin</outputDirectory>  
  <testOutputDirectory>bin</testOutputDirectory>  
</build> 

这个例子把源代码设置成了src目录,测试代码在test目录,所以输出到bin目录。这里要注意,directory如果也设置成bin目录的 话,maven打包的时候会引起死循环,因为directory是所有工作存放的地方,默认包含outputDirectory定义的目录在内。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值