如何将RTC中通过Java创建的构建定义移至指定子目录
解决RTC构建定义创建到指定多级子目录的问题
首先得明确:RTC的构建文件夹API不支持直接创建多级嵌套目录,你得从父到子逐层检查并创建每个层级的文件夹,最后把构建定义关联到最底层的目标文件夹才行。结合你的现有代码,我整理了具体的实现步骤和代码示例:
步骤1:拆分目标路径为层级数组
先把你需要的目标路径Definition/tools/B1/check拆成单个文件夹名称的数组,方便逐层处理:
String targetFolderPath = "Definition/tools/B1/check"; String[] folderHierarchy = targetFolderPath.split("/");
步骤2:逐层遍历创建文件夹
从你的根构建文件夹句柄(或者你指定的父文件夹)开始,逐个检查每个层级的文件夹是否存在,不存在就创建,同时更新当前的父文件夹句柄:
// 假设你已经获取到根构建文件夹的句柄,比如rootBuildFolderHandle IBuildFolderHandle currentParent = rootBuildFolderHandle; for (String folderName : folderHierarchy) { boolean isFolderExists = checkFolderExists(currentParent, folderName); if (!isFolderExists) { // 创建新的构建文件夹 IBuildFolder newFolder = BuildItemFactory.createBuildFolder(); newFolder.setName(folderName); // 设置当前父文件夹为新文件夹的上级 newFolder.setParent(currentParent); // 保存到RTC服务器,获取新文件夹的句柄 IBuildFolderHandle newFolderHandle = (IBuildFolderHandle) IBuildItem.save(newFolder, null); currentParent = newFolderHandle; } else { // 如果文件夹已存在,获取它的句柄作为下一级的父目录 currentParent = getExistingFolderHandle(currentParent, folderName); } }
步骤3:把构建定义关联到目标文件夹
等最底层的check文件夹创建完成后,把你的构建定义的父目录设置为这个文件夹的句柄,再保存即可:
// 假设你已经创建好构建定义buildDefinition buildDefinition.setParent(currentParent); // 保存构建定义到服务器 IBuildDefinitionHandle savedDefHandle = (IBuildDefinitionHandle) IBuildItem.save(buildDefinition, null);
补充:实现文件夹检查和获取的辅助方法
你需要两个辅助方法来完成文件夹存在性检查和已存在文件夹句柄的获取:
private boolean checkFolderExists(IBuildFolderHandle parentHandle, String folderName) throws TeamRepositoryException { IBuildItemQuery folderQuery = BuildItemQueryFactory.createBuildFolderQuery(); folderQuery.setParent(parentHandle); folderQuery.setName(folderName); List<IBuildFolder> matchedFolders = IBuildItem.query(folderQuery, null); return !matchedFolders.isEmpty(); } private IBuildFolderHandle getExistingFolderHandle(IBuildFolderHandle parentHandle, String folderName) throws TeamRepositoryException { IBuildItemQuery folderQuery = BuildItemQueryFactory.createBuildFolderQuery(); folderQuery.setParent(parentHandle); folderQuery.setName(folderName); List<IBuildFolder> matchedFolders = IBuildItem.query(folderQuery, null); if (!matchedFolders.isEmpty()) { return matchedFolders.get(0).getHandle(); } return null; // 这里可以根据业务需求抛出异常 }
关键注意事项
- 一定要逐层处理文件夹,RTC不允许跳过父级直接创建子文件夹。
- 所有RTC API操作都要处理
TeamRepositoryException异常,这是这类操作的常见异常类型。 - 保存文件夹和构建定义时,如果需要跟踪进度,可以传入
IProgressMonitor实例,示例中用null表示不跟踪进度。
内容的提问来源于stack exchange,提问作者user2561288
相关产品推荐
相关产品推荐

