maven
------------------------------------------------------------------
POM
POM(项目对象模型):
描述性和声明性的,它不像Ant或者Make那样提供显式的指令;
不是特定于Java的
POM包含了四类描述和配置:
项目总体信息:名称,项目的URL,发起组织,以及项目的开发者贡献者列表和许可证
构建设置:代码位置,插件,插件目标,站点生成参数
构建环境:~/.m2/settings.xml
POM关系:依赖,继承,坐标,子模块
超级POM:pom-4.0.0.xml
项目版本:<主版本>.<次版本>.<增量版本>-<限定版本>
限定版本用来标识里程碑构建:alpha和beta发布 1.2.3-alpha-02
SNAPSHOT版本:只用于开发过程
一个快照版是一个处于开发过程中的组件的版本
如果一个版本包含字符串“SNAPSHOT”,Maven就会在安装或发布这个组件的时候
将该符号展开为一个日期和时间值,转换为UTC(协调世界时)
LATEST是指某个特定构件最新的发布版或者快照版(snapshot),最近被部署到某个特定仓库的构件
RELEASE是指仓库中最后的一个非快照版本
在构件中使用任何一个自定义非核心插件的时候,都应该显式的指定版本号
Maven提供了三个隐式的变量,可以用来访问环境变量,POM信息,和Maven Settings:
env:操作系统或者shell的环境变量
project:POM ${project.artifactId}
settings:Maven settings ${settings.offline}
除了这三个隐式的变量,你还可以引用系统属性,以及任何在Maven POM中和构建profile中自定义的属性组:
Java系统属性:所有可以通过java.lang.System中getProperties()方法访问的属性
x:通过pom.xml或者settings.xml中的properties元素
项目依赖:
外部依赖:如Plexus,SpringFramework,或者Log4J的类库
内部依赖:就像另外一个包含服务类,模型类,或者持久化逻辑的项目
依赖范围scope:
compile(编译范围):默认,在所有的classpath中可用,同时它们也会被打包
provided(已提供范围):在编译classpath(不是运行时)可用,不会被打包
runtime(运行时范围):运行和测试系统的时候需要,但在编译的时候不需要
test(测试范围):编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用
system(系统范围):与provided类似,不推荐使用
可选依赖:<optional>true</optional>
依赖版本界限:<version>[3.8,4.0)</version> <version>[,3.8.1]</version>
排除并替换一个传递性依赖:
<dependencies>
<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>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
dependencyManagement元素:和一个环境变量一样,
能让你在一个项目下面的任何地方声明一个依赖而不用指定一个版本号
只有在子项目没有直接声明一个版本的时候,dependencyManagement定义的版本才会被使用
项目坐标:
groupId:归类了一组相关的构件,类似于一个Java包名,被翻译成路径
artifactId:项目的主要定义符
version:版本号
classifier:分类器,用于生成多个不同的构件;常用于打包构件的源码,JavaDoc或者二进制集合
多模块项目:
打包类型:pom jar
<modules> <module>sub-group</module> <module>project-c</module> </modules>
为“模块”而不是“子项目”
项目继承:
<parent>
<groupId>com.training.killerapp</groupId>
<artifactId>a-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
相对位置:<relativePath>../a-parent/pom.xml</relativePath>
POM最佳实践:
依赖归类:
<dependency>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>persistence-deps</artifactId>
<version>1.0</version>
<type>pom</type>
多模块 vs. 继承:
一个父项目是指它把所有的值传给它的子项目
一个多模块项目只是说它管理一组子模块,或者说一组子项目
使用父子关系的最主要原因是为了给一组逻辑关联的项目共享依赖和通用配置
所有模块都是子模块是为了方便,要构建整个系统,
只要到big-system项目目录下运行mvn package
------------------------------------------------------------------------------------
生命周期
三种:clean default site
clean:pre-clean clean(clean:clean) post-clean
目标clean:clean通过删除构建目录删除整个构建的输出
default:validate ... compile ... test . package ... varify install deploy
site:pre-site site(site:site) post-site site-deploy(site:deploy)
绑定到每个阶段的特定目标默认根据项目的打包类型设:
jar POM(生成的构件只是它本身) Maven Plugin EJB war ear(Java EE结构体) NAR(本地归档Flash和Flex)
通用生命周期目标:
process-resources:resources:resources目标 处理资源并将资源复制到输出目录
资源过滤
<resource>
<filtering>true</filtering>
<directory>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
<includes>
<include>run.bat</include>
<include>run.sh</include>
</includes>
<targetPath>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
</resource>
compile:compile:compile 编译所有的源码并复制到构建输出目录
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
<sourceDirectory>src/java</sourceDirectory>
<outputDirectory>classes</outputDirectory>
Process Test Resources:和process-resources有一些微小的差别,但大部分是一样的
Test Compile:test-compile阶段基本上和compile阶段一致,
唯一的不同是会调用compile:testCompile编译测试源代码目录至测试构建构建输出目录
Test:surefire:test
<testFailureIgnore>true</testFailureIgnore>
整个的跳过测试:$ mvn install -Dmaven.test.skip=true
Install:install:install 将项目的主要构件安装到本地仓库
Deploy:deploy:deploy 将一个构件部署到远程Maven仓库
-------------------------------------------------------------------
Profile
Profile能让你为一个特殊的环境自定义一个特殊的构建;profile使得不同环境间构建的可移植性成为可能
Maven profile可以覆盖几乎所有pom.xml中的配置
$ mvn clean install -Pproduction -X
默认的构建是针对开发环境设计的,而production profile的存在就是为了为产品环境提供配置
激活profile:
<activation>
<activeByDefault>false</activeByDefault>#
<jdk>1.5</jdk>#
<os><name>Windows XP</name>#</os>
<property><name>mavenVersion</name>#<value>2.0.5</value></property>
<file>
<exists>file2.properties</exists>#
<missing>file1.properties</missing>
</file>
</activation>
属性缺失激活:
<property>
<name>!environment.type</name>
</property>
外部profiles.xml
定义激活的Settings Profile
<settings>
...
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
</settings>
该设置只会激活settings
定义用户特定的Setting Profile (~/.m2/settings.xml)
<settings>
<profiles>
<profile>
<id>dev</id>
<plugin>
<groupId>...
local/maven/conf/settings.xml中定义一组全局profile
列出活动的Profile:$ mvn help:active-profiles
使用profile,构建可以变得容易移植,没有必要为一个新的环境重写你的构建
逻辑,只需要重写那些需要变化的配置,共享那些可以被共享的配置
-----------------------------------------------------------------------
Maven套件(Assembly):创建一个自定义格式的归档文件或目录
“分发(distribution)”意思是,根据项目将会如何被使用,为不同的人(或项目)提供不同的东西
assembly:assembly目标被设计成直接从命令行调用,它永远不应该被绑定到生命周期阶段
single mojo被设计成作为你每日构建的一部分,应该被绑定到项目生命周期的某个阶段
预定义的套件描述符:
bin:包裹该主构件和项目的LICENSE, README, 和NOTICE文件,最可能小的二进制分发包。
jar-with-dependencies:带有主项目jar文件和所有项目运行时依赖未解开内容的JAR归档文件
project:简单的将你文件系统或者版本控制中的项目目录结构整个的归档
src:包含你项目源码,pom.xml文件,以及项目根目录中所有LICENSE,README,和NOTICE文件的归档
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
<executions>
<execution>
<id>create-executable-jar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.sonatype.mavenbook.App</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
------------------------------------------------------------------
POM
POM(项目对象模型):
描述性和声明性的,它不像Ant或者Make那样提供显式的指令;
不是特定于Java的
POM包含了四类描述和配置:
项目总体信息:名称,项目的URL,发起组织,以及项目的开发者贡献者列表和许可证
构建设置:代码位置,插件,插件目标,站点生成参数
构建环境:~/.m2/settings.xml
POM关系:依赖,继承,坐标,子模块
超级POM:pom-4.0.0.xml
项目版本:<主版本>.<次版本>.<增量版本>-<限定版本>
限定版本用来标识里程碑构建:alpha和beta发布 1.2.3-alpha-02
SNAPSHOT版本:只用于开发过程
一个快照版是一个处于开发过程中的组件的版本
如果一个版本包含字符串“SNAPSHOT”,Maven就会在安装或发布这个组件的时候
将该符号展开为一个日期和时间值,转换为UTC(协调世界时)
LATEST是指某个特定构件最新的发布版或者快照版(snapshot),最近被部署到某个特定仓库的构件
RELEASE是指仓库中最后的一个非快照版本
在构件中使用任何一个自定义非核心插件的时候,都应该显式的指定版本号
Maven提供了三个隐式的变量,可以用来访问环境变量,POM信息,和Maven Settings:
env:操作系统或者shell的环境变量
project:POM ${project.artifactId}
settings:Maven settings ${settings.offline}
除了这三个隐式的变量,你还可以引用系统属性,以及任何在Maven POM中和构建profile中自定义的属性组:
Java系统属性:所有可以通过java.lang.System中getProperties()方法访问的属性
x:通过pom.xml或者settings.xml中的properties元素
项目依赖:
外部依赖:如Plexus,SpringFramework,或者Log4J的类库
内部依赖:就像另外一个包含服务类,模型类,或者持久化逻辑的项目
依赖范围scope:
compile(编译范围):默认,在所有的classpath中可用,同时它们也会被打包
provided(已提供范围):在编译classpath(不是运行时)可用,不会被打包
runtime(运行时范围):运行和测试系统的时候需要,但在编译的时候不需要
test(测试范围):编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用
system(系统范围):与provided类似,不推荐使用
可选依赖:<optional>true</optional>
依赖版本界限:<version>[3.8,4.0)</version> <version>[,3.8.1]</version>
排除并替换一个传递性依赖:
<dependencies>
<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>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
dependencyManagement元素:和一个环境变量一样,
能让你在一个项目下面的任何地方声明一个依赖而不用指定一个版本号
只有在子项目没有直接声明一个版本的时候,dependencyManagement定义的版本才会被使用
项目坐标:
groupId:归类了一组相关的构件,类似于一个Java包名,被翻译成路径
artifactId:项目的主要定义符
version:版本号
classifier:分类器,用于生成多个不同的构件;常用于打包构件的源码,JavaDoc或者二进制集合
多模块项目:
打包类型:pom jar
<modules> <module>sub-group</module> <module>project-c</module> </modules>
为“模块”而不是“子项目”
项目继承:
<parent>
<groupId>com.training.killerapp</groupId>
<artifactId>a-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
相对位置:<relativePath>../a-parent/pom.xml</relativePath>
POM最佳实践:
依赖归类:
<dependency>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>persistence-deps</artifactId>
<version>1.0</version>
<type>pom</type>
多模块 vs. 继承:
一个父项目是指它把所有的值传给它的子项目
一个多模块项目只是说它管理一组子模块,或者说一组子项目
使用父子关系的最主要原因是为了给一组逻辑关联的项目共享依赖和通用配置
所有模块都是子模块是为了方便,要构建整个系统,
只要到big-system项目目录下运行mvn package
------------------------------------------------------------------------------------
生命周期
三种:clean default site
clean:pre-clean clean(clean:clean) post-clean
目标clean:clean通过删除构建目录删除整个构建的输出
default:validate ... compile ... test . package ... varify install deploy
site:pre-site site(site:site) post-site site-deploy(site:deploy)
绑定到每个阶段的特定目标默认根据项目的打包类型设:
jar POM(生成的构件只是它本身) Maven Plugin EJB war ear(Java EE结构体) NAR(本地归档Flash和Flex)
通用生命周期目标:
process-resources:resources:resources目标 处理资源并将资源复制到输出目录
资源过滤
<resource>
<filtering>true</filtering>
<directory>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
<includes>
<include>run.bat</include>
<include>run.sh</include>
</includes>
<targetPath>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
</resource>
compile:compile:compile 编译所有的源码并复制到构建输出目录
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
<sourceDirectory>src/java</sourceDirectory>
<outputDirectory>classes</outputDirectory>
Process Test Resources:和process-resources有一些微小的差别,但大部分是一样的
Test Compile:test-compile阶段基本上和compile阶段一致,
唯一的不同是会调用compile:testCompile编译测试源代码目录至测试构建构建输出目录
Test:surefire:test
<testFailureIgnore>true</testFailureIgnore>
整个的跳过测试:$ mvn install -Dmaven.test.skip=true
Install:install:install 将项目的主要构件安装到本地仓库
Deploy:deploy:deploy 将一个构件部署到远程Maven仓库
-------------------------------------------------------------------
Profile
Profile能让你为一个特殊的环境自定义一个特殊的构建;profile使得不同环境间构建的可移植性成为可能
Maven profile可以覆盖几乎所有pom.xml中的配置
$ mvn clean install -Pproduction -X
默认的构建是针对开发环境设计的,而production profile的存在就是为了为产品环境提供配置
激活profile:
<activation>
<activeByDefault>false</activeByDefault>#
<jdk>1.5</jdk>#
<os><name>Windows XP</name>#</os>
<property><name>mavenVersion</name>#<value>2.0.5</value></property>
<file>
<exists>file2.properties</exists>#
<missing>file1.properties</missing>
</file>
</activation>
属性缺失激活:
<property>
<name>!environment.type</name>
</property>
外部profiles.xml
定义激活的Settings Profile
<settings>
...
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
</settings>
该设置只会激活settings
定义用户特定的Setting Profile (~/.m2/settings.xml)
<settings>
<profiles>
<profile>
<id>dev</id>
<plugin>
<groupId>...
local/maven/conf/settings.xml中定义一组全局profile
列出活动的Profile:$ mvn help:active-profiles
使用profile,构建可以变得容易移植,没有必要为一个新的环境重写你的构建
逻辑,只需要重写那些需要变化的配置,共享那些可以被共享的配置
-----------------------------------------------------------------------
Maven套件(Assembly):创建一个自定义格式的归档文件或目录
“分发(distribution)”意思是,根据项目将会如何被使用,为不同的人(或项目)提供不同的东西
assembly:assembly目标被设计成直接从命令行调用,它永远不应该被绑定到生命周期阶段
single mojo被设计成作为你每日构建的一部分,应该被绑定到项目生命周期的某个阶段
预定义的套件描述符:
bin:包裹该主构件和项目的LICENSE, README, 和NOTICE文件,最可能小的二进制分发包。
jar-with-dependencies:带有主项目jar文件和所有项目运行时依赖未解开内容的JAR归档文件
project:简单的将你文件系统或者版本控制中的项目目录结构整个的归档
src:包含你项目源码,pom.xml文件,以及项目根目录中所有LICENSE,README,和NOTICE文件的归档
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
<executions>
<execution>
<id>create-executable-jar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.sonatype.mavenbook.App</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>