ant学习3
通常我们打包Product的时候,一般都是通过Product的export操作来进行的,但这样的做法,则限制了ContinousIntegration的自动化执行,那么,应该如何编写自动化构建脚本呢?
一、首先,让我们看一下Eclipse官方的解决方案:
http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.pde.doc.user/guide/tasks/pde_product_build.htm
从文中我们可以看出,PDE已经为从product文件构建RCP应用做好了一切准备,我们所需要做的,就是搭建目录结构以及构建脚本。但是如果完全按照官方方案去做的话,只会使得构建更加复杂,更加不可自动化,那么,让我们跟随一个简单的例子来看一下如何完成自动构建吧(在下使用的是Eclipse3.2,pde的版本号为3.2.0.v20060603,使用其他版本的朋友请自行修改):
1。使用HelloRCP模版构建一个RCP工程。命名为hellorcp,创建到G:\eclipse\workspace\hellorcp
在这一步,有一个很关键的问题需要注意,我们先来看一下上文中builddirectory的结构:
buildDirectory/
plugins/
pluginToBuildA
pluginToBuildB
myProduct.product
...
features/
featureToBuild
要想成功build工程的话,那么工程就必须要放到/plugins/的目录结构下,不然pde是找不到工程的pluginid的!我努力了很长时间才无奈的认可了这个事实。
如果我们不想把工程放到一个很复杂的目录结构下,或者对于既有的工程不想做这样的改动,那么就只好用到ant来拷贝了。我的做法是,在工程目录下,创建名为dist\plugins\hellorcp的目录,待一切就绪后,使用ant来把整个工程拷贝到这个目录下。
2。准备脚本
在工程下,新建buildConfiguration目录,并把\plugins\org.eclipse.pde.build_3.2.0.v20060603\templates\headless-build下的build.properties文件拷贝到此目录下,并修改如下设置项:
1).product——官方的说法是:thelocationofyourproductconfigurationfileintheform"//path/to/.product",而我们的buildConfiguration目录和product文件同处于一个目录下,所以只需要写上product文件的名字即可,如hellorcp.product。
2).baseLocation——官方的说法是:thelocationofaneclipseinstallcontainingallthepre-builtfeaturesandplug-insthatyourproductrequiresinfeatures/andplugins/subdirectories.TheRCPdeltapack(itisavailablefromtheeclipsedownloadpage)ismandatoryasitincludestheorg.eclipse.platform.launchersfeaturewhichcontainsthelaunchersandrootfilesnecessaryforaproduct.我们要做的就是把RCPdeltapack安装到Eclipse目录下,然后把baselocation指向Eclipse根目录即可,这里需要绝对路径。
3).buildDirectory——官方的说法是:thedirectorythebuildwilltakeplacein.Setthistothefullpathofthebuilddirectorycreatedpreviously.这里因为最后的目录指向是ant拷贝完成以后的路径,所以应当是G:\eclipse\workspace\hellorcp\dist
4).configs——listtheconfigurationsforwhichyouwantyourproducttobebuilt.Youcanuncommenttheconfiguration(s)provided(becarefulofthelinecontinuations).
5).archivePrefix——thenameofthedirectoryofyourproductonceinstalledondisk.如hellorcp
以上为官方给出的配置项,而我们如果使用了1.5或1.6中的新功能的话,还需要到文件的最底部,找到javacSource和javacTarget两个选项,进行对应的修改。
3。ant脚本
在工程目录下新建一个ant脚本,把下面的代码粘贴进去,运行,就可以到dist/I.TestBuild下面找构建后的产品了。
xmlversion="1.0"?>
<projectname="project"default="rcpAutomatedBuild">
<propertyname="eclipse.install"value="G:\eclipse">
property>
<propertyname="project.dir"value="G:\eclipse\workspace\hellorcp">
property>
<propertyname="dist.dir"value="${project.dir}\dist\plugins\hellorcp"/>
<targetname="prepare">
<mkdirdir="${dist.dir}"/>
<copytodir="${dist.dir}">
<filesetdir="${project.dir}">
fileset>
copy>
target>
<targetname="rcpAutomatedBuild"depends="prepare">
<javaclassname="org.eclipse.core.launcher.Main"fork="true"failonerror="true">
<argvalue="-application"/>
<argvalue="org.eclipse.ant.core.antRunner"/>
<argvalue="-buildfile"/>
<argvalue="${eclipse.install}\plugins\org.eclipse.pde.build_3.2.0.v20060603\scripts\productBuild\productBuild.xml"/>
<argvalue="-Dbuilder=${dist.dir}\buildConfiguration"/>
<classpath>
<pathelementlocation="${eclipse.install}\startup.jar"/>
classpath>
java>
target>
project>
构建后的产品是以zip形式存在的,我们还可以根据实际的需要,对build.properties进行更多的修改。
上面的脚本还有一些缺陷,比如绝对位置的使用,但这是无法避免的了.......
二、接下来是使用Maven的构建:
使用Maven的准备工作包括下载,配置环境变量,安装MavenpluginforEclipse,并在Preferences中,Java/BuildPath/ClasspathVariables/下面配置M2_REPO变量,使其指向userhome\.m2\repository
关于Maven的入门知识在此略过,请自行阅读Maven官方站点的相关资料。
在创建工程时,请将src目录指向src/main/java,output目录指向target/classes
工程创建完毕后,右击工程名,在弹出菜单中选中“Maven2“,然后选择”Enable“,则会生成对应的pom文件,我们可以自己设置对应的groupid,artifactId,以及相应的dependencies,在这里,我们只需要为Eclipse插件依赖以外的第三方包设置dependency就可以了。如果该包在官网上无法访问到,则可以通过运行
mvninstall:install-file-Dfile=path-to-your-artifact-jar\
-DgroupId=your.groupId\
-DartifactId=your-artifactId\
-Dversion=version\
-Dpackaging=jar\
-DgeneratePom=true
来把第三方包安装到localrepository里面去。
然而,在pluginproject运行时,除了Eclipse插件依赖以外的第三方包是需要位于plugin目录下的,否则在运行时无法找到对应路径,我们也可以看到,在plugin.xml视图的runtime页面中,根本无法把plugin目录以外的jar文件加入到classpath中来。所以,我们还需要另外的ant脚本来完成拷贝工作。脚本如下所示:(此处参考了江南白衣,有一点不同的是,此处把ant的classpath指向了localrepository,这样发布的时候,就无需发布maven-artifact-ant.jar了)
xmlversion="1.0"encoding="UTF-8"?>
<projectname="build-base"default="copy"xmlns:artifact="urn:maven-artifact-ant">
<typedefresource="org/apache/maven/artifact/ant/antlib.xml"uri="urn:maven-artifact-ant">
<classpath>
<pathelementlocation="${user.home}/.m2/repository/org/apache/maven/maven-artifact-ant/2.0.4/maven-artifact-ant-2.0.4.jar"/>
classpath>
typedef>
<artifact:pomid="maven.project"file="pom.xml"/>
<artifact:dependenciesfilesetid="dependency.fileset"useScope="runtime">
<pomrefid="maven.project"/>
artifact:dependencies>
<targetname="copy">
<copytodir="lib">
<filesetrefid="dependency.fileset"/>
<mappertype="flatten"/>
copy>
target>
project>
接下来的目录结构及脚本的准备工作和前面一样,除了两处需要修改:
1)buildConfiguration\build.properties,这里的buildDirectory可以注释掉。
2)第3步中的ant脚本,因为我们这里需要用maven来构建,所以只需要执行prepare任务就可以了。
再有就是pom.xml文件中,要加入构建的任务:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>pde-maven-pluginartifactId>
<extensions>trueextensions>
<configuration>
<eclipseInstall>G:\eclipseeclipseInstall>
<pdeProductFilename>hellorcp.productpdeProductFilename>
<pdeBuildVersion>3.2.0.v20060603pdeBuildVersion>
configuration>
plugin>
plugins>
build>
最后运行第3步中的ant脚本,然后到dist\plugins\hellorcp目录下,运行mvninstall就可以了。构建后的文件可以在localrepository中找到。
常见错误:
使用antbuild的时候,出现plugin:xxx找不到的错误,请检查buidConfiguration\build.properties中buildDirectory的配置项
使用Mavenbuild的时候,出现编译错误,请检查pom.xml中是否少了
<packaging>zip</packaging>