如何通过代码创建带.cproject文件的Eclipse C/C++项目
程序化创建Eclipse C/C++项目时生成.cproject文件的问题
我有一段用于程序化创建Eclipse项目的插件代码,核心逻辑是创建工作区项目。我的场景是创建C/C++项目,最初以为只要给IProjectDescription实例添加CNature就能满足需求,但实际运行后并未生成预期的.cproject文件。
我尝试了多种方法,包括以下代码:
IProject newProject = workspace.getRoot().getProject(projectName); try { newProject.create(newProjectDescription, monitor); // 创建Eclipse项目 CoreModel model = CoreModel.getDefault(); // 获取默认CDT模型 ICProject cproject = model.create(newProject); // 为项目创建CDT模型 } catch (CoreException ex) { // 省略日志处理 }
后续还执行了:
try { newProject.open(monitor); newProject.setDescription(newProjectDescription, null); cproject.save(null, true); } catch (CoreException e) { // 省略日志处理 }
但始终没能成功生成.cproject文件。
我要创建的是现有项目的副本,原项目是通过「将现有项目导入工作区...」选项导入的,未指定工具链,仅包含C/C++文件。对比发现:
- 手动导入的项目右键菜单有「构建项目」「清理项目」「Make目标」选项
- 属性面板有「C/C++构建」章节
- 存在
.cproject文件
而代码创建的项目缺少以上所有内容。我希望代码创建的项目和原项目完全一致,推测.cproject文件是导致IDE行为差异的关键,需要知道如何确保该文件生成。
更新1:追踪到.cproject文件的写入逻辑
基于代码追踪思路,我发现.cproject文件由org.eclipse.cdt.internal.core.settings.model.xml包下的DesSerializationRunnable类负责写入,其run方法如下:
public void run(IProgressMonitor monitor) throws CoreException { JobChangeAdapter notifyJobCanceller = new NotifyJobCanceller((NotifyJobCanceller)null); try { Job.getJobManager().addJobChangeListener(notifyJobCanceller); ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { } }, (ISchedulingRule)null, 1, (IProgressMonitor)null); XmlProjectDescriptionStorage.this.serializingLock.acquire(); LanguageSettingsProvidersSerializer.serializeLanguageSettings(this.fDes); XmlProjectDescriptionStorage.this.projectModificaitonStamp = XmlProjectDescriptionStorage.this.serialize(this.fDes.getProject(), ".cproject", this.fElement); ((ContributedEnvironment)CCorePlugin.getDefault().getBuildEnvironmentManager().getContributedEnvironment()).serialize(this.fDes); } finally { XmlProjectDescriptionStorage.this.serializingLock.release(); Job.getJobManager().removeJobChangeListener(notifyJobCanceller); } }
其中标注.cproject的行负责写入该文件。现在我需要了解该方法的调用方式,以及如何在自己的场景中模仿或复用这段Eclipse代码来生成.cproject文件。
内容的提问来源于stack exchange,提问作者majixin
相关产品推荐
相关产品推荐

