- maven2.0學(xué)習(xí)筆記 2006-04-17 srx
- mvn功能簡(jiǎn)介 2006-05-07 nimeimei
- Maven中文手冊(cè) 2005-04-15 qiquan36
- Maven使用手冊(cè) 2004-08-19 cqboy
- maven翻譯一結(jié) 2006-02-22 yingwu0579
maven2完全使用手冊(cè)
maven2 起步
相信maven1 大家都已經(jīng)很熟悉了,具體maven能做什么,就不詳細(xì)說了。個(gè)人覺得maven在開源項(xiàng)目中用的還是比較多的,公司內(nèi)部,就不太清楚了。我以前的公司用過一段時(shí)間,不過后來就沒有下文了。
與maven1 相比,maven2可算是幾乎重寫了,不過從速度來說應(yīng)該更快。 主要的幾個(gè)新特性包括:(詳細(xì)參考http://www.ibm.com/developerworks/cn/opensource/os-maven2/index.html) 1. 更快、更簡(jiǎn)單 速度方面可以比上ant了 2. 更少的配置文件 現(xiàn)在的配置文件只剩下了settings.xml和pom.xml了。 3. Plugin語言更換 語言開始支持java,BeanShell和ant 4. 提供了預(yù)定義的模版 這點(diǎn)是最有幫助的,用戶可以自己定義自己的項(xiàng)目模版了,就像用appfuse一樣生成項(xiàng)目結(jié)構(gòu) 5. 生命周期的引入 在Maven2中有了明確的生命周期概念,而且都提供與之對(duì)應(yīng)的命令,使得項(xiàng)目構(gòu)建更加清晰明了。 6. 新增Dependency Scope 這點(diǎn)也比較重要,有些用于test范圍的包,可以不用加入依賴了 7. 傳遞依賴,簡(jiǎn)化依賴管理 這是最為方便的,可以省了很多配置。如a 依賴 b,b 依賴c 默認(rèn) a也會(huì)依賴 c。但是也會(huì)帶來隱患,如版本沖突。不過maven 也已經(jīng)考慮到了,可以使用exclusions來排除相應(yīng)的重復(fù)依賴 介紹了那么多,現(xiàn)在切入正題,開始maven2 之旅: 首些下載需要的工具: maven2: http://maven./download.html 最主要的 maven-proxy:用來代理repository,使用本地庫代替maven2的遠(yuǎn)程庫 http://maven-proxy./ continuum:一個(gè)不錯(cuò)的持續(xù)整合工具,用于自動(dòng)build。支持ant,maven http://maven./continuum/ svn:版本控制工具相信都已經(jīng)配置了。 maven 用于eclipse的插件 ,在maven主站有下載,不錯(cuò)的插件。當(dāng)然idea也有相應(yīng)的插件 最后,http,服務(wù)器是必不可少的。用于內(nèi)部開發(fā)使用。 可以使用apache ,或者jetty http://www./ 安裝: 安裝maven2很簡(jiǎn)單,把下載來的maven包解開就行了。(目前我的配置都在win2003上,還沒有應(yīng)用于linux,所有所有的配置都針對(duì) windows).增加相應(yīng)的環(huán)境變量m2_home=maven2的安裝目錄,不要忘了設(shè)置java_home的目錄。另外在path中增加% m2_home%\bin;可以直接在命令行下面使用mvn。 其他工具的安裝在后續(xù)的文章會(huì)介紹。 開始第一個(gè)mvean2項(xiàng)目: mvn archetype:create -DgroupId=com.mycompany.app \ -DartifactId=my-app 簡(jiǎn)單介紹一下 groupId相當(dāng)于你的組織,如同org.springframework,會(huì)轉(zhuǎn)化為相應(yīng)得本地路徑 artifactId,你主要的jar包名稱,也就是你要打成的jar 名稱。 編譯應(yīng)用資源 mvn compile 編譯相應(yīng)的jave 文件 編譯測(cè)試類以及運(yùn)行測(cè)試類 mvn test 運(yùn)行測(cè)試類 如果只想編譯test,執(zhí)行 mvn test-compile 打包和安裝你的本地庫 打包: mvn package 安裝: mvn install 創(chuàng)建web site mvn site 清除所有輸出 mvn clean 創(chuàng)建相關(guān)的ide文件 mvn idea:idea 或者 mvn eclipse:eclipse 順便說一下,maven2 是有生命周期這一概念的,也就是說如果你執(zhí)行package,相應(yīng)的以前步驟,如compile,test等都會(huì)自動(dòng)執(zhí)行。 剛開始執(zhí)行會(huì)比較慢,需要從maven2遠(yuǎn)程庫中下載所有的文件到本地。如果你的本地沒有相應(yīng)的依賴包,則每次maven都會(huì)去遠(yuǎn)程下載,所以配置一個(gè)鏡像庫就比較重要了。 另外介紹一下主要的參考資料: mavn2 主站:主要的pom和settings.xml參考資料 Better Builds with Maven http://www./m2book_download.jsp 不錯(cuò)的書,主要通過例子介紹。可惜都是E文的,花點(diǎn)時(shí)間還是值得的。 下一個(gè)主題,會(huì)說一下maven2的主要配置。 maven 配置篇 之 settings.xml
maven2 比起maven1 來說,需要配置的文件少多了,主要集中在pom.xml和settings.xml中。
先來說說settings.xml,settings.xml對(duì)于maven來說相當(dāng)于全局性的配置,用于所有的項(xiàng)目。在maven2中存在兩個(gè) settings.xml,一個(gè)位于maven2的安裝目錄conf下面,作為全局性配置。對(duì)于團(tuán)隊(duì)設(shè)置,保持一致的定義是關(guān)鍵,所以 maven2/conf下面的settings.xml就作為團(tuán)隊(duì)共同的配置文件。保證所有的團(tuán)隊(duì)成員都擁有相同的配置。當(dāng)然對(duì)于每個(gè)成員,都需要特殊的 自定義設(shè)置,如用戶信息,所以另外一個(gè)settings.xml就作為本地配置。默認(rèn)的位置為:${user.dir} /.m2/settings.xml目錄中(${user.dir} 指windows 中的用戶目錄)。 settings.xml基本結(jié)構(gòu)如下: <settings xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://maven./POM/4.0.0 http://maven./xsd/settings-1.0.0.xsd"> <localRepository/> <interactiveMode/> <usePluginRegistry/> <offline/> <pluginGroups/> <servers/> <mirrors/> <proxies/> <profiles/> <activeProfiles/> </settings> 簡(jiǎn)單介紹一下幾個(gè)主要的配置因素: localRepository:表示本地庫的保存位置,也就是maven2主要的jar保存位置,默認(rèn)在${user.dir}/.m2/repository,如果需要另外設(shè)置,就換成其他的路徑。 offline:如果不想每次編譯,都去查找遠(yuǎn)程中心庫,那就設(shè)置為true。當(dāng)然前提是你已經(jīng)下載了必須的依賴包。 Servers 在POM中的 distributionManagement元素定義了開發(fā)庫。然而,特定的username和pwd不能使用于pom.xml,所以通過此配置來保存server信息 <servers> <server> <id>server001</id> <username>my_login</username> <password>my_password</password> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <passphrase>some_passphrase</passphrase> <filePermissions>664</filePermissions> <directoryPermissions>775</directoryPermissions> <configuration></configuration> </server> </servers>
Mirrors
表示鏡像庫,指定庫的鏡像,用于增加其他庫 <mirrors> <mirror> <id></id> <name>PlanetMirror Australia</name> <url>http://downloads./pub/maven2</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
Proxies
此設(shè)置,主要用于無法直接訪問中心的庫用戶配置。 <proxies> <proxy> <id>myproxy</id> <active>true</active> <protocol>http</protocol> <host>proxy.somewhere.com</host> <port>8080</port> <username>proxyuser</username> <password>somepassword</password> <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> </proxy> </proxies>
Profiles
類似于pom.xml中的profile元素,主要包括activation,repositories,pluginRepositories 和properties元素 剛開始接觸的時(shí)候,可能會(huì)比較迷惑,其實(shí)這是maven2中比較強(qiáng)大的功能。從字面上來說,就是個(gè)性配置。 單獨(dú)定義profile后,并不會(huì)生效,需要通過滿足條件來激活。 repositories 和pluginRepositories 定義其他開發(fā)庫和插件開發(fā)庫。對(duì)于團(tuán)隊(duì)來說,肯定有自己的開發(fā)庫??梢酝?/span>過此配置來定義。 如下的配置,定義了本地開發(fā)庫,用于release 發(fā)布。 <repositories> <repository> <id>repo-local</id> <name>Internal 開發(fā)庫</name> <url>http://192.168.0.2:8082/repo-local</url> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <enabled>false</enabled> </snapshots> <layout>default</layout> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>repo-local</id> <name>Internal 開發(fā)庫</name> <url>http://192.168.0.2:8082/repo-local</url> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <enabled>false</enabled> </snapshots> <layout>default</layout> </pluginRepository> </pluginRepositories> releases, snapshots:每個(gè)產(chǎn)品的版本的Release或者snapshot(注:release和snapshot的區(qū)別,release一般是比較穩(wěn)定的版本,而snapshot基本上不穩(wěn)定,只是作為快照) properties maven 的properties作為placeholder值,如ant的properties。 包括以下的5種類型值: 1. env.X,返回當(dāng)前的環(huán)境變量
2. project.x:返回pom中定義的元素值,如project.version
3. settings.x:返回settings.xml中定義的元素
4. java 系統(tǒng)屬性:所有經(jīng)過java.lang.System.getProperties()返回的值
5. x:用戶自己設(shè)定的值
Activation
用于激活此profile <activation> <activeByDefault>false</activeByDefault> <jdk>1.5</jdk> <os> <name>Windows XP</name> <family>Windows</family> <arch>x86</arch> <version>5.1.2600</version> </os> <property> <name>mavenVersion</name> <value>2.0.3</value> </property> <file> <exists>${basedir}/file2.properties</exists> <missing>${basedir}/file1.properties</missing> </file> </activation>
除了使用activation來激活profile,同樣可以通過activeProfiles來激活 Active Profiles 表示激活的profile,通過profile id來指定。 <activeProfiles> <activeProfile>env-test</activeProfile> 指定的profile id </activeProfiles> maven 配置篇 之pom.xml
說完了settings.xml配置,下來說一下maven2的主要配置pom.xml
什么是pom? pom作為項(xiàng)目對(duì)象模型。通過xml表示maven項(xiàng)目,使用pom.xml來實(shí)現(xiàn)。主要描述了項(xiàng)目:包括配置文件;開發(fā)者需要遵循的規(guī)則,缺陷管理系統(tǒng),組織和licenses,項(xiàng)目的url,項(xiàng)目的依賴性,以及其他所有的項(xiàng)目相關(guān)因素。 快速察看: <project> <modelVersion>4.0.0</modelVersion> <!-- The Basics --> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <packaging>...</packaging> <dependencies>...</dependencies> <parent>...</parent> <dependencyManagement>...</dependencyManagement> <modules>...</modules> <properties>...</properties> <!-- Build Settings --> <build>...</build> <reporting>...</reporting> <!-- More Project Information --> <name>...</name> <description>...</description> <url>...</url> <inceptionYear>...</inceptionYear> <licenses>...</licenses> <organization>...</organization> <developers>...</developers> <contributors>...</contributors> <!-- Environment Settings --> <issueManagement>...</issueManagement> <ciManagement>...</ciManagement> <mailingLists>...</mailingLists> <scm>...</scm> <prerequisites>...</prerequisites> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <distributionManagement>...</distributionManagement> <profiles>...</profiles> </project> 基本內(nèi)容: POM包括了所有的項(xiàng)目信息。 maven 相關(guān): pom定義了最小的maven2元素,允許groupId,artifactId,version。所有需要的元素
POM關(guān)系:
主要為依賴,繼承,合成 依賴關(guān)系: <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <type>jar</type> <scope>test</scope> <optional>true</optional> </dependency> ... </dependencies>
可以通過以下方式進(jìn)行安裝:
· 使用以下的命令安裝:
· mvn install:install-file –Dfile=non-maven-proj.jar –DgroupId=some.group –DartifactId=non-maven-proj –Dversion=1
· 創(chuàng)建自己的庫,并配置,使用deploy:deploy-file
· 設(shè)置此依賴范圍為system,定義一個(gè)系統(tǒng)路徑。不提倡。
· compile :默認(rèn)范圍,用于編譯
· provided:類似于編譯,但支持你期待jdk或者容器提供,類似于classpath
· runtime:在執(zhí)行時(shí),需要使用
· test:用于test任務(wù)時(shí)使用
· system:需要外在提供相應(yīng)得元素。通過systemPath來取得
獨(dú)占性
外在告訴maven你只包括指定的項(xiàng)目,不包括相關(guān)的依賴。此因素主要用于解決版本沖突問題 <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-embedder</artifactId> <version>2.0</version> <exclusions> <exclusion> <groupId>org.apache.maven</groupId> <artifactId>maven-core</artifactId> </exclusion> </exclusions> </dependency> 表示項(xiàng)目maven-embedder需要項(xiàng)目maven-core,但我們不想引用maven-core 繼承關(guān)系 另一個(gè)強(qiáng)大的變化,maven帶來的是項(xiàng)目繼承。主要的設(shè)置: 定義父項(xiàng)目 <project> <modelVersion>4.0.0</modelVersion> <groupId>org.codehaus.mojo</groupId> <artifactId>my-parent</artifactId> <version>2.0</version> <packaging>pom</packaging> </project> packaging 類型,需要pom用于parent和合成多個(gè)項(xiàng)目。我們需要增加相應(yīng)的值給父pom,用于子項(xiàng)目繼承。主要的元素如下:
<project>
<modelVersion>4.0.0</modelVersion> <parent> <groupId>org.codehaus.mojo</groupId> <artifactId>my-parent</artifactId> <version>2.0</version> <relativePath>../my-parent</relativePath> </parent> <artifactId>my-project</artifactId> </project> relativePath可以不需要,但是用于指明parent的目錄,用于快速查詢。 dependencyManagement: 用于父項(xiàng)目配置共同的依賴關(guān)系,主要配置依賴包相同因素,如版本,scope。 合成(或者多個(gè)模塊) 一個(gè)項(xiàng)目有多個(gè)模塊,也叫做多重模塊,或者合成項(xiàng)目。 如下的定義: <project> <modelVersion>4.0.0</modelVersion> <groupId>org.codehaus.mojo</groupId> <artifactId>my-parent</artifactId> <version>2.0</version> <modules> <module>my-project1<module> <module>my-project2<module> </modules> </project> build 設(shè)置 主要用于編譯設(shè)置,包括兩個(gè)主要的元素,build和report build 主要分為兩部分,基本元素和擴(kuò)展元素集合 注意:包括項(xiàng)目build和profile build <project> <!-- "Project Build" contains more elements than just the BaseBuild set --> <build>...</build> <profiles> <profile> <!-- "Profile Build" contains a subset of "Project Build"s elements --> <build>...</build> </profile> </profiles> </project> 基本元素 <build> <defaultGoal>install</defaultGoal> <directory>${basedir}/target</directory> <finalName>${artifactId}-${version}</finalName> <filters> <filter>filters/filter1.properties</filter> </filters> ... </build>
資源(resources) 你項(xiàng)目中需要指定的資源。如spring配置文件,log4j.properties <project> <build> ... <resources> <resource> <targetPath>META-INF/plexus</targetPath> <filtering>false</filtering> <directory>${basedir}/src/main/plexus</directory> <includes> <include>configuration.xml</include> </includes> <excludes> <exclude>**/*.properties</exclude> </excludes> </resource> </resources> <testResources> ... </testResources> ... </build> </project>
插件
在build時(shí),執(zhí)行的插件,比較有用的部分,如使用jdk 5.0編譯等等 <project> <build> ... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.0</version> <extensions>false</extensions> <inherited>true</inherited> <configuration> <classifier>test</classifier> </configuration> <dependencies>...</dependencies> <executions>...</executions> </plugin> </plugins> </build> </project>
如下:
<plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>echodir</id> <goals> <goal>run</goal> </goals> <phase>verify</phase> <inherited>false</inherited> <configuration> <tasks> <echo>Build Dir: ${project.build.directory}</echo> </tasks> </configuration> </execution> </executions> </plugin> 說明:
插件管理 pluginManagement:插件管理以同樣的方式包括插件元素,用于在特定的項(xiàng)目中配置。所有繼承于此項(xiàng)目的子項(xiàng)目都能使用。主要定義插件的共同元素 擴(kuò)展元素集合 主要包括以下的元素: Directories 用于設(shè)置各種目錄結(jié)構(gòu),如下: <build> <sourceDirectory>${basedir}/src/main/java</sourceDirectory> <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory> <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory> <outputDirectory>${basedir}/target/classes</outputDirectory> <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory> ... </build> Extensions 表示需要擴(kuò)展的插件,必須包括進(jìn)相應(yīng)的build路徑。 <project> <build> ... <extensions> <extension> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-ftp</artifactId> <version>1.0-alpha-3</version> </extension> </extensions> ... </build> </project> Reporting 用于在site階段輸出報(bào)表。特定的maven 插件能輸出相應(yīng)的定制和配置報(bào)表。 <reporting> <plugins> <plugin> <outputDirectory>${basedir}/target/site</outputDirectory> <artifactId>maven-project-info-reports-plugin</artifactId> <reportSets> <reportSet></reportSet> </reportSets> </plugin> </plugins> </reporting> Report Sets 用于配置不同的目標(biāo),應(yīng)用于不同的報(bào)表 <reporting> <plugins> <plugin> ... <reportSets> <reportSet> <id>sunlink</id> <reports> <report>javadoc</report> </reports> <inherited>true</inherited> <configuration> <links> <link>http://java./j2se/1.5.0/docs/api/</link> </links> </configuration> </reportSet> </reportSets> </plugin> </plugins> </reporting> 更多的項(xiàng)目信息 name:項(xiàng)目除了artifactId外,可以定義多個(gè)名稱 description: 項(xiàng)目描述 url: 項(xiàng)目url inceptionYear:創(chuàng)始年份 Licenses <licenses> <license> <name>Apache 2</name> <url>http://www./licenses/LICENSE-2.0.txt</url> <distribution>repo</distribution> <comments>A business-friendly OSS license</comments> </license> </licenses> Organization 配置組織信息 <organization> <name>Codehaus Mojo</name> <url>http://mojo.</url> </organization> Developers 配置開發(fā)者信息 <developers> <developer> <id>eric</id> <name>Eric</name> <email>eredmond@</email> <url>http://eric.</url> <organization>Codehaus</organization> <organizationUrl>http://mojo.</organizationUrl> <roles> <role>architect</role> <role>developer</role> </roles> <timezone>-6</timezone> <properties> <picUrl>http:///prv4t</picUrl> </properties> </developer> </developers> Contributors <contributors> <contributor> <name>Noelle</name> <email>some.name@gmail.com</email> <url>http://</url> <organization>Noelle Marie</organization> <organizationUrl>http://</organizationUrl> <roles> <role>tester</role> </roles> <timezone>-5</timezone> <properties> <gtalk>some.name@gmail.com</gtalk> </properties> </contributor> </contributors> 環(huán)境設(shè)置 Issue Management 定義相關(guān)的bug跟蹤系統(tǒng),如bugzilla,testtrack,clearQuest等 <issueManagement> <system>Bugzilla</system> <url>http://127.0.0.1/bugzilla</url> </issueManagement> Continuous Integration Management 連續(xù)整合管理,基于triggers或者timings <ciManagement> <system>continuum</system> <url>http://127.0.0.1:8080/continuum</url> <notifiers> <notifier> <type>mail</type> <sendOnError>true</sendOnError> <sendOnFailure>true</sendOnFailure> <sendOnSuccess>false</sendOnSuccess> <sendOnWarning>false</sendOnWarning> <configuration><address>continuum@127.0.0.1</address></configuration> </notifier> </notifiers> </ciManagement> Mailing Lists <mailingLists> <mailingList> <name>User List</name> <subscribe>user-subscribe@127.0.0.1</subscribe> <unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe> <post>user@127.0.0.1</post> <archive>http://127.0.0.1/user/</archive> <otherArchives> <otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive> </otherArchives> </mailingList> </mailingLists> SCM 軟件配置管理,如cvs 和svn <scm> <connection>scm:svn:http://127.0.0.1/svn/my-project</connection> <developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection> <tag>HEAD</tag> <url>http://127.0.0.1/websvn/my-project</url> </scm> Repositories 配置同setting.xml中的開發(fā)庫 Plugin Repositories 配置同 repositories Distribution Management 用于配置分發(fā)管理,配置相應(yīng)的產(chǎn)品發(fā)布信息,主要用于發(fā)布,在執(zhí)行mvn deploy后表示要發(fā)布的位置 1 配置到文件系統(tǒng) <distributionManagement> <repository> <id>proficio-repository</id> <name>Proficio Repository</name> <url>file://${basedir}/target/deploy</url> </repository> </distributionManagement> 2 使用ssh2配置 <distributionManagement> <repository> <id>proficio-repository</id> <name>Proficio Repository</name> <url>scp://sshserver.yourcompany.com/deploy</url> </repository> </distributionManagement> 3 使用sftp配置 <distributionManagement> <repository> <id>proficio-repository</id> <name>Proficio Repository</name> <url>sftp://ftpserver.yourcompany.com/deploy</url> </repository> </distributionManagement> 4 使用外在的ssh配置 編譯擴(kuò)展用于指定使用wagon外在ssh提供,用于提供你的文件到相應(yīng)的遠(yuǎn)程服務(wù)器。 <distributionManagement> <repository> <id>proficio-repository</id> <name>Proficio Repository</name> <url>scpexe://sshserver.yourcompany.com/deploy</url> </repository> </distributionManagement> <build> <extensions> <extension> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-ssh-external</artifactId> <version>1.0-alpha-6</version> </extension> </extensions> </build> 5 使用ftp配置 <distributionManagement> <repository> <id>proficio-repository</id> <name>Proficio Repository</name> <url>ftp://ftpserver.yourcompany.com/deploy</url> </repository> </distributionManagement> <build> <extensions> <extension> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-ftp</artifactId> <version>1.0-alpha-6</version> </extension> </extensions> </build> repository 對(duì)應(yīng)于你的開發(fā)庫,用戶信息通過settings.xml中的server取得 Profiles 類似于settings.xml中的profiles,增加了幾個(gè)元素,如下的樣式: <profiles> <profile> <id>test</id> <activation>...</activation> <build>...</build> <modules>...</modules> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <dependencies>...</dependencies> <reporting>...</reporting> <dependencyManagement>...</dependencyManagement> <distributionManagement>...</distributionManagement> </profile> </profiles> 使用maven2 進(jìn)行團(tuán)隊(duì)配置
對(duì)于團(tuán)隊(duì)來說,建立統(tǒng)一的開發(fā)環(huán)境是必須的,而maven能很好幫助建立統(tǒng)一的環(huán)境。下面就介紹如何更有效的進(jìn)行統(tǒng)一的配置。
準(zhǔn)備工作: 下載必須的軟件: maven2: http://maven./download.html 最主要的 maven-proxy:用來代理repository,使用代理來訪問多個(gè)遠(yuǎn)程庫 http://maven-proxy./ continuum:一個(gè)不錯(cuò)的持續(xù)整合工具,用于自動(dòng)build。支持ant,maven http://maven./continuum/ svn:版本控制工具 創(chuàng)建一致的開發(fā)環(huán)境 在共享的開發(fā)環(huán)境中,更好的建議是保持maven的兩個(gè)不同的配置文件分別管理,包括共享和用戶自定義設(shè)置。共同的配置包括在安裝目錄中,而單獨(dú)的開發(fā)設(shè)置保存在用戶本地目錄。 全局的配置文件settings.xml <servers>
//公司內(nèi)部庫,所有的release版本,serverid對(duì)應(yīng)于repository id,用于在deploy時(shí),訪問使用,主要保存用戶名和密碼 <server> <id>internal</id> <username>${website.username}</username> <password>${website.pwd}</password> <filePermissions>664</filePermissions> <directoryPermissions>775</directoryPermissions> </server> //目前的開發(fā)庫,用于snapshot庫 <server> <id>snapshot</id> <username>${website.username}</username> <password>${website.pwd}</password> <filePermissions>664</filePermissions> <directoryPermissions>775</directoryPermissions> </server> </servers> <profiles> <!--定義核心庫 maven 鏡像,由maven-proxy實(shí)現(xiàn)--> <profile> <id>central-repo</id> <repositories> <repository> <id>central</id> <name>Internal Repository</name> <url>http://192.168.0.2:9999/repository</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <name>Internal Repository</name> <url>http://192.168.0.2:9999/repository</url> </pluginRepository> </pluginRepositories> </profile> <!--定義內(nèi)部庫,包括公司的所有release版本--> <profile> <id>internal-repo</id> <repositories> <repository> <id>internal</id> <name>Internal Repository</name> <url>http://192.168.0.2:8080/repo-local</url> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>internal</id> <name>Internal Plugin Repository</name> <url>http://192.168.0.2:8080/repo-local</url> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> </pluginRepository> </pluginRepositories> </profile> <!--定義內(nèi)部開發(fā)庫 ,也可以合并snapshot和release--> <profile> <id>snapshot-repo</id> <repositories> <repository> <id>snapshot</id> <name>Internal Repository</name> <url>http://192.168.0.2:8080/repo-snapshot</url> <snapshots> <enabled>true</enabled> <updatePolicy>interval:60</updatePolicy> <checksumPolicy>warn</checksumPolicy> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>snapshot</id> <name>Internal Plugin Repository</name> <url>http://192.168.0.2:8080/repo-snapshot</url> <snapshots> <enabled>true</enabled> <updatePolicy>interval:60</updatePolicy> <checksumPolicy>warn</checksumPolicy> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <!-- 激活相應(yīng)得配置--> <activeProfiles> <activeProfile>central-repo</activeProfile> <activeProfile>internal-repo</activeProfile> <activeProfile>snapshot-repo</activeProfile> </activeProfiles> <!-- 插件默認(rèn)groupId --> <pluginGroups> <pluginGroup>com.mycompany.plugins</pluginGroup> </pluginGroups> 包括了以下的共享因素:
服務(wù)器設(shè)置典型是共同的,只有用戶名需要在用戶環(huán)境中設(shè)置。使用一致的定義來配置共同的設(shè)置
對(duì)于單獨(dú)的用戶來說,設(shè)置如下:
<settings>
<profiles> <profile> <id>property-overrides</id> <properties> <website.username>myuser</website.username> <website.pwd>test</website.username> </properties> </profile> </profiles> </settings> 創(chuàng)建共享開發(fā)庫 大多數(shù)組織將會(huì)創(chuàng)建自己的內(nèi)部開發(fā)庫,用于配置,而中心開發(fā)庫用于連接maven 設(shè)置內(nèi)部開發(fā)庫是簡(jiǎn)單的,使用http協(xié)議,可以使用存在的http 服務(wù)器。或者創(chuàng)建新的服務(wù),使用apache,或者jetty 假設(shè)服務(wù)器地址192.168.0.2 ,端口8080 http://192.168.0.2:8080/repo-local 設(shè)置另外一個(gè)開發(fā)庫,用于設(shè)置項(xiàng)目的snapshot庫http://192.168.0.2:8080/repo-snapshot 中心鏡像庫,使用maven-proxy創(chuàng)建,當(dāng)然也可以創(chuàng)建自己的鏡像。用于下載本地庫中沒有的artifact maven-proxy 設(shè)置 從網(wǎng)上直接下載maven-proxy-standalone-0.2-app.jar和 proxy.properties 在命令行中,直接運(yùn)行java -jar maven-proxy-standalone-0.2-app.jar proxy.properties 主要的配置: 設(shè)置repo.list 中增加相應(yīng)的庫就可以,如下定義: repo.list=repo1.,... #maven 的中心庫 repo.repo1..url=http://repo1./maven2 repo.repo1..description= repo.repo1..proxy=one repo.repo1..hardfail=false repo.repo1..cache.period=360000 repo.repo1..cache.failures=true 以后所有的遠(yuǎn)程庫,都通過此方式增加。順便說一下,不要忘了注釋原來的example,那是沒有辦法訪問的。 其他配置如 端口號(hào) port=9999 保存的位置 repo.local.store=target/repo serverName=http://localhost:9999 創(chuàng)建標(biāo)準(zhǔn)的組織pom 定義共同的內(nèi)容,包括公司的結(jié)構(gòu),如組織,部門以及團(tuán)隊(duì)。 察看一下maven 的自身,可以作為很好的參考。 如scm <project> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.maven</groupId> <artifactId>maven-parent</artifactId> <version>1</version> </parent> <groupId>org.apache.maven.scm</groupId> <artifactId>maven-scm</artifactId> <url>http://maven./maven-scm/</url> ... <modules> <module>maven-scm-api</module> <module>maven-scm-providers</module> ... </modules> </project> 在maven父項(xiàng)目中可以看到如下定義: <project> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache</groupId> <artifactId>apache</artifactId> <version>1</version> </parent> <groupId>org.apache.maven</groupId> <artifactId>maven-parent</artifactId> <version>5</version> <url>http://maven./</url> ... <mailingLists> <mailingList> <name>Maven Announcements List</name> <post>announce@maven.</post> ... </mailingList> </mailingLists> <developers> <developer> ... </developer> </developers> </project> maven 父pom包括了共享的元素,如聲明郵件列表,開發(fā)者。并且大多數(shù)項(xiàng)目繼承apache組織:
<project>
<modelVersion>4.0.0</modelVersion> <groupId>org.apache</groupId> <artifactId>apache</artifactId> <version>1</version> <organization> <name>Apache Software Foundation</name> <url>http://www./</url> </organization> <url>http://www./</url> ... <repositories> <repository> <id>apache.snapshots</id> <name>Apache Snapshot Repository</name> <url>http://svn./maven-snapshot-repository</url> <releases> <enabled>false</enabled> </releases> </repository> </repositories> ... <distributionManagement> <repository> ... </repository> <snapshotRepository> ... </snapshotRepository> </distributionManagement> </project> 對(duì)于項(xiàng)目自身來說,父pom很少更新。所以,最后的方式保存父pom文件在單獨(dú)的版本控制區(qū)域,它們能夠check out,更改和配置. 使用Continuum持久整合 持續(xù)整合自動(dòng)build你的項(xiàng)目,通過一定的時(shí)間,包括所有的沖突在早期察覺,而不是發(fā)布的時(shí)候。另外持續(xù)整合也是一種很好的開發(fā)方式,使團(tuán)隊(duì)成員能產(chǎn)生細(xì)微的,交互的變動(dòng),能更有效的支持平行開發(fā)進(jìn)程。 可以使用maven的continuum作為持久整合的服務(wù)。 安裝continuum,比較簡(jiǎn),使用以下的命令: C:\mvnbook\continuum-1.0.3> bin\win32\run 可以通過http://localhost:8082/continuum來驗(yàn)證 為了支持continuum 發(fā)送e-mail提醒,你需要相應(yīng)的smtp服務(wù)用于發(fā)送信息。默認(rèn)使用localhost:25,如果你沒有設(shè)置,編輯上面的文件改變smtp-host設(shè)置。 下一步,設(shè)置svn目錄: svn co file://localhost/C:/mvnbook/svn/proficio/trunk proficio 編輯pom.xml用于正確相應(yīng)得e-mail地址。 ... <ciManagement> <system>continuum</system> <url>http://localhost:8080/continuum <notifiers> <notifier> <type>mail</type> <configuration> <address>youremail@yourdomain.com</address> </configuration> </notifier> </notifiers> </ciManagement> ... <scm> <connection> scm:svn:file://localhost/c:/mvnbook/svn/proficio/trunk </connection> <developerConnection> scm:svn:file://localhost/c:/mvnbook/svn/proficio/trunk </developerConnection> </scm> ... <distributionManagement> <site> <id>website</id> <url> file://localhost/c:/mvnbook/repository/sites/proficio /reference/${project.version} </url> </site> </distributionManagement> 提交相應(yīng)的pom,然后執(zhí)行mvn install 如果你返回http://localhost:8082/continuum,你會(huì)看到相應(yīng)的項(xiàng)目列表。 一旦你登錄后,你可以選擇mavan 2.0項(xiàng)目用于增加相應(yīng)的項(xiàng)目。你可以增加你的url或者提交你的本地內(nèi)容。 你可以使用本地pom url,如下file://localhost/c:mvnbook/proficio/pom.xml 在提交了此url后,continuum將會(huì)返回相應(yīng)的成功信息。 以下的原則用于更好的幫助持續(xù)整合: 早提交,經(jīng)常提交:當(dāng)用戶經(jīng)常提交時(shí),持續(xù)整合是最有效的。這并不意味著,提交不正確的代碼。 經(jīng)常運(yùn)行build:用于最快檢測(cè)失敗 盡快修正失敗:當(dāng)失敗發(fā)生時(shí),應(yīng)該馬上修正失敗 建議一個(gè)有效的版本 運(yùn)行clean build 運(yùn)行復(fù)雜的綜合測(cè)試 build所有的項(xiàng)目結(jié)構(gòu)分支 持續(xù)運(yùn)行項(xiàng)目的拷貝 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1830826
[收藏到我的網(wǎng)摘] [發(fā)送Trackback] wind5shy發(fā)表于 2007年10月18日 12:41:00
相關(guān)文章:
|
|