分享

maven2 (二) SCM

 pint 2010-08-24

依赖管理?

这里我们通过使用外部依赖(external dependencies)来大家对maven的依赖管理有一个简单而具体的了解。

当我们在做一个工程的时候,不可能一切都是从空白开始,对于我们做Web应用的来说,使用框架已经司空见惯,而这种对框架的引入使用对于Maven来说,就是工程的依赖。而我们的工程要进行测试,则不能少了对Junit框架的依赖。

依赖管理是maven的一个主要特征,这个是对于用户来说,是Maven令人振奋的一个最著名的特征。对于一个单一的工程来说,依赖管理没有什么困难的,但是当你开始处理多个模块的工程或由10多个甚至上百个模块组成的应用程序时, Maven能帮助你轻松稳定的控制这些大量的依赖。

在pom.xml中dependencies部分列出了所有外部依赖,详细描述了在编译时,测试时,运行时是否需要这个依赖。现在,假定我们的工程只有对Junit的依赖。它的pom.xml文件可能如下:

<project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://maven./POM/4.0.0 http://maven./maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
<url>http://maven.</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

从以上pom.xml文件可以看出,定义一个外部依赖(external dependencies)至少需要4个元素:groupId, artifactId, version, and scope。对于groupId, artifactId, version的意思,和前面我们在创建工程时提到的这几个元素的意义相同,这里就不再重复介绍,scope元素指出你的工程如何使用依赖,并且它的值有 compile,test和runtime等等。想要了解更多的依赖说明的信息,请看:http://maven./maven-model/maven.html

要想了解完整的依赖机制,请看:http://maven./guides/introduction/introduction-to-dependency-management.html

有了这些依赖信息,Maven将能在工程构建时引用依赖。

引用的过程是:

  1. 在本地仓库(默认的本地仓库地址为:~/.m2/repository)中查找此依赖是否存在。

  2. 如果在本地仓库中未发现,则在远程仓库中下载此依赖,并下载到本地仓库中。

  3. 通过以上两个步骤就能找到依赖。如果远程仓库无法访问,则可以设置其他远程仓库。具体请看:http://maven./guides/introduction/introduction-to-repositories.html

一个简单的例子。比如我们要添加一个log4j到我们的工程中。

首先.需要了解log4j的groupId, artifactId, and version信息。可在google上搜索“site:www. maven2 log4j”。这样在搜索结果里可以找到/maven2/log4j/log4j (or /pub/packages/maven2/log4j/log4j)这样的目录,在这个目录中有一个文件叫做maven-metadata.xml。这个文件内容如下所示:

<metadata>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.1.3</version>
<versioning>
<versions>
<version>1.1.3</version>
<version>1.2.4</version>
<version>1.2.5</version>
<version>1.2.6</version>
<version>1.2.7</version>
<version>1.2.8</version>
<version>1.2.11</version>
<version>1.2.9</version>
<version>1.2.12</version>
</versions>
</versioning>
</metadata>

这样我们能找到groupId为log4j,artifactId为log4j,version当然要用最新的,选择1.2.12。scope我们设置为compile。
这样我们使用mvn compile 编译工程时,会看到mvn下载了log4j到我们的本地仓库。

配置管理?

Maven的配置管理是作为一个单独的Maven子项目在做。叫做SCM。他是这样介绍的:

MavenSCM 支持Maven 2.x插件(例如,maven-release-plugin)和其他工具(例如,Continuum,这个是一个和maven 2.x结合很好的一个持续集成工具。),Maven SCM提供给他们一个公共的API去做配置管理的各种操作。当然了要执行配置管理操作,当然少不了配置工具了。Maven SCM给出了一个列表,说明Maven SCM现在所支持的配置管理工具。

完全支持的配置管理工具:

  • CVS

  • Subversion

  • Perforce

  • StarTeam

当你选中了上面的一个配置管理工具,你就可以利用Maven 2.x的插件或者集成管理工具进行配置管理了。

持续集成工具continuum?

continuum是Maven的一个子项目。他是一个构建基于java的工程的持续集成服务器。他支持以下多种工程类型:

  • Maven 1

  • Maven 2

  • Ant

  • Shell scripts

continuum有以下特征

  • 紧密整合Maven 2.x

  • 紧密整合Maven SCM

  • 更易用的基于网络的设置和界面

  • 基于Quartz(Quartz-based)的时间计划表设置

  • 添加新项目十分方便

  • 邮件通知

  • 其他IM通知:IRC, Jabber, MSN

  • 责备机制(Blame Mechanism)

在以下连接处下载此软件:http://maven./continuum/download.html

安装?

解压缩continuum-1.0.2-bin.zip到你希望安装Continuum 1.0.2的所在目录。
运行:
  • bin/linux/run.sh 如果是UNIX平台

  • bin/solaris/run.sh 如果是Solaris平台

  • bin/win32/run.bat 如果是Windows平台

  • bin/macosx/run.sh 如果是MacOS X平台.

  • bin/plexus.sh 如果是其他平台

当服务器启动成功后,打开浏览器访问:http://localhost:8080/continuum/

注意:由于continuum判断一个工程是否构建成功,是使用一个命令行返回值。而windows平台的用户,这个返回值有问题。因此需要修改以下maven 2的bin/mvn.bat文件。这里可以直接从以下地址下载修改后的文件替换掉即可:http://maven./continuum/scripts/mvn.bat

添加一个项目到continuum?

要添加一个maven 2的项目到continuum,需要写入一个pom url或者导入一个pom.xml,当然导入的这个pom.xml文件中包含了continuum需要的各种信息。
我们来看看导入的pom.xml文件中具体需要包含哪些项:

配置管理信息(The SCM information)?

<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>

开发者信息(The developers)?

<ciManagement>
<system>continuum</system>
<notifiers>
<notifier>
...
</notifier>
</notifiers>
</ciManagement>

集成后所有的通知人信息(The notifiers)?

<notifier>
<type>mail</type>
<configuration>
<address>dev@maven.</address>
</configuration>
<notifier>
<notifier>
<type>irc</type>
<configuration>
<host>irc.</host>
<port>6667</port>
<channel>#maven</channel>
</configuration>
</notifier>

构建工程?

  • 按照定制的时间构建

  • 点击本项目上的build按钮进行构建。

发布管理?

配置?

要发布(Releases)一个项目,需要在pom.xml和setting.xml中分别配置。在pom.xml中

<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>

在setting.xml中

<settings>
...
<servers>
<server>
<id>mycompany-repository</id>
<username>jvanzyl</username>
<!-- Default value is ~/.ssh/id_dsa -->
<privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
<passphrase>my_key_passphrase</passphrase>
</server>
</servers>
...
</settings>

通过以上的设置,项目将可以发布到远程仓库,远程服务器。

项目发布现在支持scp,ftp和scpexe等方式。

Setting.xml文件是一个maven的配置文件。它有下面的功能:

  • 配置本地仓库

  • 配置访问网络的代理服务器

  • 安全和部署的设置。

  • 为仓库设置景象

想要了解更多这个文件的信息可以参考一下以下文章:http://maven./guides/mini/guide-configuring-maven.html

运行发布的命令?

mvn deploy

Maven和eclipse工具的合作?

当有了以上的工程目录,无论是webapp工程,还是app,我们都希望在集成开发环境中开发。Maven如何和IDE集成。现在我们就来进行讲解。

首先要让eclipse知道Maven 2的repository(仓库)的路径。因此要设置一个M2_REPO的变量为classpath。可以使用命令行的方式来设置:

mvn -Declipse.workspace=<path-to-eclipse-workspace> eclipse:add-maven-repo

还可以在eclipse中定义一个新的classpath变量通过在eclipse的菜单上选择Window> Preferences. 选择Java > Build Path > Classpath Variables page.

接下来,生成eclipse的工程文件。使用命令行

mvn eclipse:eclipse

这样通过在eclipse的菜单上选择File >Import >Existing Projects into Workspace,就可以将工程导入eclipse中。
通过以上2个步骤,我们就可以利用eclipse来进行开发工作了。

Eclipse插件mavenide?

同时在eclipse中我们可以下载一个maven的插件,用来辅助eclipse进行maven工程的开发工作。这个插件名称叫做mavenide。

这个插件可使用以下更新站点:http://m2eclipse./

并且非常方便的是,这里还提供了一个flash的演示来介绍如何安装此插件,这个flash演示的观看地址在:

http://m2eclipse./Installing_Maven_2.0_plugin_for_Eclipse.html

要正常使用此插件请注意以下问题:

  • eclipse使用3.1或以上版本。

  • Mavenide的插件为0.0.5不要安装错误了。

通过笔者在安装好此插件的一些使用后,看到了此插件的以下一些特性。

  • 可以方便的添加依赖。

  • 在编辑完pom.xml文档后,会自动检查此文档的格式是否正确。

  • 可以将mvn的一些命令通过扩展工具的方式在eclipse中轻松执行。

心得体会?

扬长避短使用Maven 2?

转载自 http://www./topic/162217

架设私服?

比如Spring 2.5.1,可能刚release,repo1.maven.org/maven2/不一定有。你可以install到你的私服去。

结合Ant?

很多maven不灵活的地方,可以用ant来解决

定义meta-inf的信息?

开发OSGI的Bundle,就必须定义meta-inf信息。也可以定义自己的格式。

不要使用maven2相关的ide插件?

多使用命令行。比如,先 mvn eclipse,然后导入到eclipse工程。有更新,执行 mvn eclipse,再刷新工程就可以。
我非常反对过多的依赖IDE。单元测试比较难做,无法做到持续集成!

题外话:我个人强烈倾向于调式用mvn jetty:run,数据库用hsqldb,便于使用dbunit。毕竟,现在可以用spring,jpa/hibernate做到数据库无关性和应用服务器无关性。

依赖关系要设计好?

即jar和jar之间的关系,package和package之间的关系。开发前,设计的时候就要规划好,不能什么都靠工具。工具不是万能的。
尤其是开发OSGI bundle的时候,依赖关系一定要先设计好,一定要保证单向依赖性!

实际上,我使用maven,中间也遇到了一些问题,总的说来,帮助还是非常大。尤其是,新来的开发人员搭建开发、测试环境、持续集成的时候,效果非常明显!
我也承认maven2是好的思路,但是实现得不好。最重要的是,在新的工具出现前,我们只能选择它。不过,可以结合IVY,ant,尽可能的扬长避短。

Maven中的中文编码问题?

在Windows下,默认编码是GBK,所以需要在pom中增加属性:

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>

第一个在filter拷贝文件时用,第二个在编译时用。第二个属性是在 http://maven./plugins/maven-compiler-plugin/ 翻到的

Maven2主要配置文件?

pom.xml和settings.xml。
POM是Maven的核心对象模型,对于项目,一般只需要pom.xml就行了。

settings.xml配置在Maven2中存在两种级别:
用户级,针对操作系统登录用户而言。一般在$home/.m2/,对于windows用户,就是目录:C:\Documents and Settings\用户名\.m2\settings.xml。
全局级:一般在%M2_HOME%/conf/settings.xml,M2_HOME是Maven2的根目录环境变量名。

maven2具体应用?

1.下载maven2
http://maven./download.html

2.设置二环境变量:解压,如解压在D:\mvntest,然后设置系统环境变量M2_HOME=D:\apache-maven-2.0.8 ,path变量里添加D:\apache-maven-2.0.8\bin,方便Maven在任何目录下运行。

3.mvn -h可以查看帮助
如执行mvn --version可以查看版本信息
mvn --version

可以显示类似这样的信息:
Maven version: 2.0.8
Java version: 1.6.0
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"

4.创建一个新项目:
Maven2的运行命令是mvn,常用命令为:

创建Maven项目:mvn archetype:create
编译源代码:mvn compile
编译测试代码:mvn test-compile
运行测试:mvn test
产生site:mvn site
打包:mvn package
在本地Repository中安装jar:mvn install
清除产生的项目:mvn clean
清除产生的项目:mvn clean
例如:创建一个新项目:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app

Maven指南?

http://www./books/maven-book/reference_zh/public-book.html

另一个Maven2简明教程?

安装和配置
把maven-2.0.4-bin.zip解压到D:maven-2.0.4。
下面就是配置环境变量了,这和1.0的版本是一样的。(1)MAVEN_HOME:D:maven-2.0.4 (2)在Path 中加入%MAVEN_HOME%bin?

这样配置就OK了。然后,我建立了如下目录:E:appmavenApp,当然这些可以随便建立,呵呵。

下面说一些Maven1.x和Maven2.x的不同(一些摘自一些网友文章)
------------------------------------
Maven2 把配置文件压缩成了pom.xml和settings.xml 两个文件,简洁了不少。POM是Maven的核心对象模型,在Maven2中POM已由project.xml转移到pom.xml中使用,版本也由3升级为4。对于项目,一般只需要pom.xml就行了。在Maven2中不需要也不提倡使用maven.xml

生命周期的引入
在Maven2中有了明确的生命周期概念,而且都提供与之对应的命令,使得项目构建更加清晰明了。主要的生命周期阶段:?

validate,验证工程是否正确,所有需要的资源是否可用。
compile,编译项目的源代码。
test-compile,编译项目测试代码。
test,使用已编译的测试代码,测试已编译的源代码。
package,已发布的格式,如jar,将已编译的源代码打包。
integration-test,在集成测试可以运行的环境中处理和发布包。
verify,运行任何检查,验证包是否有效且达到质量标准。
install,把包安装在本地的repository中,可以被其他工程作为依赖来使用
deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
generate-sources,产生应用需要的任何额外的源代码,如xdoclet。

新增Dependency Scope
在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:?

compile,缺省值,适用于所有阶段,会随着项目一起发布。
provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

配置?

下面说些基本设置,打开D:/maven-2.0.4/conf/settings.xml

1. 改变<localRepository>E:/app/m2/repository</localRepository> 目的:改变本地的数据仓库目录(存放从远程下载的jar包),如果不改变也可以,如不改变,缺省目录为:C:Documents and Settings主机名.m2repository

2. 配置代理,主要目的是为了能从远程下载jar包,根据实际的网路情况进行配置吧。因为我现在单位是有代理服务器的,如果不配置,就不能从远程下载jar包了。我的配置如下(注意:如果你的网络没有代理服务器,就不用配置这个步骤)

<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<host>192.168.17.100</host>
<port>8889</port>
<nonProxyHosts>192.168.*.*</nonProxyHosts>
</proxy>

常用goal?

下面就是一些goal命令了,这里和Maven1有不少不同,常用的命令有:

  1. 创建Maven的普通java项目:mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=pjoName

  2. 创建Maven的Web项目:mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp

  3. 编译源代码:mvn compile (或者:mvn compiler:compile)

  4. 编译测试代码:mvn test-compile

  5. 运行测试:mvn test

  6. 产生site:mvn site

  7. 打包:mvn package

  8. 在本地Repository中安装jar:mvn install

  9. 清除产生的项目:mvn clean

  10. 生成eclipse项目:mvn eclipse:eclipse

  11. 生成idea项目:mvn idea:idea

  12. 组合使用goal命令,如只打包不测试:mvn -Dtest package

  13. 编译测试的内容:mvn test-compile

  14. 只打jar包: mvn jar:jar

  15. 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile (这里要特别注意 -skipping 的灵活运用,当然也可以用于其他组合命令)

  16. 清除eclipse的一些系统设置:mvn eclipse:clean

配置存储库?

要求项目的每个开发者必须在conf目录中配置存储库是不方便的,所以Maven可以同时查看多个存储库并且将它们全部配置在pom.xml文件中。让我们看看一个例子,它展示了如何在应用程序用使用多个存储库。在以下从pom.xml文件摘录的片断中,我们设置了两个存储库来让Maven寻找依赖项。 Ibiblio一直是默认的存储库,我们又添加了Planet Mirror作为后援存储库。我们也可以让团队使用的本地web服务器作为第二个存储库。

<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www./maven/</url>
</repository>
<repository>
<id>PlanetMirror</id>
<name>Planet Mirror</name>
<url>http://public./pub/maven/</url>
</repository>
</repositories>

一些小问题?

M2_REPO的问题?

当建立一个工程后,执行 mvn eclipse:eclipse ,建立一个maven的工程,用eclipse打开后,发现报如下错误:Unbound classpath variable: 'M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar' in project my-webapp ,这是因为在Eclipse 没有配置 M2_REPO 变量,配置步骤:window >> preferences >> Java >> Build Path >> Classpath Variables
新建一个 M2_REPO 的变量,变量值指向你系统的Maven2的数据仓库位置。

POM.XML 继承的写法?

<project xmlns="http://maven./POM/4.0.0" 
xmlns:xsi="http://www./2001/XMLSchema-instance"
xsi:schemaLocation="http://maven./POM/4.0.0 http://maven./maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.hivemind</groupId>
<artifactId>hivemind-examples</artifactId>
<packaging>jar</packaging>
<version>2.0-alpha-1</version>
<parent>
<groupId>org.apache.hivemind</groupId>
<artifactId>hivemind-project</artifactId>
<version>2.0-alpha-1</version>
<relativePath>../pom.xml</relativePath>
</parent>
<name>HiveMind Examples</name>
<inceptionYear>2003</inceptionYear>
<dependencies>
<dependency>
<groupId>org.apache.hivemind</groupId>
<artifactId>hivemind-framework</artifactId>
<version>2.0-alpha-1</version>
</dependency>

如何安装Jar(或war)依赖到本地的数据仓库中??

下面具一个如何把dwr.jar包上传到本地数据仓库的例子,一看例子,大家就明了了。
1. 下载dwr.jar包到本地,我把它放到了 C:/ (C盘根目录)
2. 进入“命令行提示符”,进入到C:/,然后执行

mvn install:install-file -Dfile=dwr.jar -DgroupId=dwr.mocha -DartifactId=dwrDart -Dversion=1.0 -Dpackaging=jar

这样就把dwr传到了本地仓库中(我的本地仓库地址为:E:appm2repository),上传到仓库中的jar包名为dwrDart- 1.0.jar,目录结构为dwr/mocha/dwrDart/1.0/dwrDart-1.0.jar

maven2命令大全?

validate,验证工程是否正确,所有需要的资源是否可用。
compile,编译项目的源代码。
test-compile,编译项目测试代码。
test,使用已编译的测试代码,测试已编译的源代码。
package,已发布的格式,如jar,将已编译的源代码打包。
integration-test,在集成测试可以运行的环境中处理和发布包。
verify,运行任何检查,验证包是否有效且达到质量标准。
install,把包安装在本地的repository中,可以被其他工程作为依赖来使用
deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
generate-sources,产生应用需要的任何额外的源代码,如xdoclet。

结合Maven2进行J2EE项目构建?

http://www./topic/230265

Maven2 的新特性?

http://www.ibm.com/developerworks/cn/opensource/os-maven2/index.html

maven 配置篇 之 settings.xml?

http://zyl./blog/41612

maven 配置篇 之pom.xml?

配置1: http://zyl./blog/41754
配置2: http://zyl./blog/41761

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多