为什么需要创建本地的p2 repository
通常RCP软件开发测试完成 后,在本地Eclipse中通过product文件导出成软件产品即可发布。但也有一些情况是开发测试在本地完成,然后需要在远程服务器上进行编译打包和部署,通常会配合Tycho一块使用来完成自动编译打包的工作,Tycho中可以配置p2 repository,以方便Tycho在打包时下载插件项目所依赖的其他插件(包括Eclipse的核心插件等),如果配置成Eclipse官方的p2 repository地址时,每次打包都需要联网到Eclipse,耗时很长,这时就可以考虑在本地或本地服务器端建立一个自用的p2 repostory,以加快编译打包进程。
可以通过以下两种方式创建本地p2 repository:
- 使用Eclipse的p2 url创建本地的p2 repository
- 将本地的Eclipse发布成p2 repository【推荐】
推荐使用这种方式,因为本地的开发环境中的插件都是比较齐备的(不然代码中会有编译错误_),这样直接导出成p2比较方便。
当然使用一个纯净版的Eclipse,靠Target Platform来接管RCP项目的编译也可以。
使用Eclipse的p2 url创建本地的p2 repository
每个Eclipse版本都提供了对应的p2 url,可以用在product的Target Platform或Tycho中。
例如Eclipse 4.13的p2 url为:
其他版本的p2 url可以去这里查到:Eclipse各版本更新地址
有了p2 url后,我们先在本地创建一个新的文件夹“p2mirrors”,然后在其中建立一个子文件夹“4.13”,因为以后我们可能还会建立其他版本的Eclipse p2 repository,这样做方便归类管理。
p2 repository中包含两类数据,一种是metadata,另一种是artifact,Eclipse p2 url中包含了这两种数据,只是需要用命令来分别下载。
对于下载顺序没有严格规定,但通常都是先下载metadata,然后再下载artifact。
下载Metadata
在本地命令行或终端中切换到Eclipse所在的目录,然后执行以下命令:
eclipse -nosplash -verbose -application org.eclipse.equinox.p2.metadata.repository.mirrorApplication -source <eclipse p2 url> -destination <local folder uri>
NOTE:如果上述命令在Windows系统中执行,需要把上述命令中的“eclipse”改为“eclipsec”。
部分参数说明如下:
- nosplash:执行时不显示Eclipse的启动画面。
- verbose:执行时同时打印执行日志。
- application:执行下载metadata功能的Eclipse Application,固定值。
- source:Eclipse p2的地址。
- destination:目标地址,就是存储下载后的metadata的本地目录,需要注意的是这里接受的是URI,不仅通常使用的本地文件夹路径。例如,对于之前我们创建好的文件夹“D:\p2mirrors\4.13”,用在这里的话需要写成“file://D:/p2mirrors/4.13”。
命令执行完成后,会在目标路径中生成“content.jar”。
下载Artifacts
在本地命令行或终端中切换到Eclipse所在的目录,然后执行以下命令:
eclipse -nosplash -verbose -application org.eclipse.equinox.p2.artifact.repository.mirrorApplication -source <eclipse p2 url> -destination <local folder uri>
NOTE:跟Metadata指令一样,如果在Windows系统中执行,需要把命令中的“eclipse”改为“eclipsec”。
下载Artifact的指令除了application的值不一样之外,其他的参数都一样。
该命令的执行过程较长,取决于网络环境。
命令执行完成后,会在目标路径中生成“binary”、“features”、“plugins”文件夹和“artifacts.jar”文件。
将本地的Eclipse发布成p2 repository
将本地的Eclipse发布成p2主要是利用Eclipse提供的FeaturesAndBundles Publisher
,在命令行或终端中输入以下命令:
java -jar <Eclipse Installation Folder>/plugins/org.eclipse.equinox.launcher_*.jar
-application org.eclipse.equinox.p2.publisher.UpdateSitePublisher
-metadataRepository file:/<some location>/repository
-artifactRepository file:/<some location>/repository
-source /<location with a site.xml>
-configs <e.g. gtk.linux.x86>
-compress
-publishArtifacts
上述命令中的换行只是为了方便阅读,在命令行或终端中输入或粘贴时应去掉换行。
_*.jar”中的“*”需要替换为具体的版本号。
参数说明:
- metadataRepository:存放生成的metadata数据的位置,URI格式。
- artifactRepository:存放生成的artifact数据的位置,URI格式。
- source:要导出的Eclipse的路径,指定到Eclipse “plugins”和“features”文件夹的上一级目录即可,这里可以使用本地的路径格式。
- configs:运行环境属性,表示该p2支持的运行环境。以“.”分隔的由os、ws和arch组成的格式,或者“ANY”表示支持所有平台,不使用此参数似乎也是表示支持所有平台。
- compress:指示是否将content.xml和artifacts.xml生成到jar包中。
一个示例:
java -jar plugins/org.eclipse.equinox.launcher_1.5.500.v20190715-1310.jar
-application org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher
-metadataRepository file://E:/p2mirrors/eclipse_4_13
-artifactRepository file://E:/p2mirrors/eclipse_4_13
-source D:\IDE\Eclipse\2019-09-4.13-rcp\eclipse
-compress
-publishArtifacts
该命令也可以用来将一些插件包打包成p2 repository,适用场景为例如有一些插件不是通过Eclipse的“安装新软件”安装的,而是通过下载jar包或zip包直接放到或合并到Eclipse的plugins文件夹中的方式来安装的,这样的插件如果想让我们的RCP产品在编译打包时能打进来,就需要将其打包为p2 repository。
步骤如下:
- 创建一个专门的文件夹,例如
abc
,在该文件夹下创建plugins
文件夹,把需要打包的插件的jar放入其中。文件夹结构如下:
+abc
+plugins
-abc-bundle.jar
- 用上述
abc
文件夹的地址替换到上面命令中的-source
的值,示例如下:
java -jar plugins/org.eclipse.equinox.launcher_1.5.700.v20200207-2156.jar -application org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher -metadataRepository file://E:/p2mirrors/abc1.0 -artifactRepository file://E:/p2mirrors/abc1.0 -source D:\test\abc -compress -publishArtifacts
- 命令执行结束后,相应位置应该就生成出
abc
的p2 repository了。
因为是从本地数据源中生成jar包,该命令执行速度很快,执行结束后,目标文件夹中将会生成以下结构的数据:
+features
+plugins
-artifacts.jar
-content.jar
部署p2 repository
在本地创建p2 repository后,将其打包上传到远程服务器中即可。远程服务器通常是linux环境,window工作站可以使用putty+pscp进行远程登录和上传文件。
参考资料
Equinox p2 Repository Mirroring
Equinox/p2/Publisher
Setting up a local p2 mirror for Tycho
Local Copy of an Eclipse P2 Repository