Eclipse RCP中自定义扩展名XML文件自动验证配置问题
问题背景
我在Eclipse RCP应用中有一些自定义扩展名(非.xml)的XML文件,希望它们和常规.xml文件一样,在格式错误时(比如缺少结束标签、尖括号)显示错误标记。手动通过「首选项->验证->XML验证器->设置->添加新文件扩展名规则」配置后可以正常工作,但想跳过手动配置,通过.ini文件实现自动生效。
手动配置后,Eclipse在org.eclipse.wst.validation.prefs节点中存储了以下设置:
vals/org.eclipse.wst.xml.core.xml/groups=0107include07111contentType128org.eclipse.core.runtime.xmlT111contentType134org.eclipse.wst.xml.core.xmlsourceT111contentType134org.eclipse.wst.xml.core.xslsourceT111contentType134org.eclipse.jst.jsp.core.tldsourceT07fileext03xmlF07fileext06varselF07fileext06vardefF0107exclude05113projectNature134org.eclipse.jst.j2ee.ejb.EJBNature113projectNature130org.eclipse.jst.j2ee.EARNature04file08.projectT0104file110.classpathT0104file110.settings/T02
我尝试把这个条目加到产品的.ini文件里,但没生效,想问操作哪里错了?怎么正确实现自动启用验证?
为什么.ini文件添加设置无效
Eclipse的.ini文件主要用于配置JVM参数、启动参数和核心框架的基础设置,并不支持直接存储首选项节点的配置内容。你添加的org.eclipse.wst.validation.prefs属于工作区/插件的首选项,这类设置无法通过.ini文件加载。
正确的实现方式
方法1:通过插件默认首选项配置(推荐,适合RCP产品)
- 在你的RCP插件项目根目录下创建
plugin_customization.ini文件。 - 在该文件中添加XML验证器的规则配置,注意要加上首选项节点前缀:
org.eclipse.wst.validation/vals/org.eclipse.wst.xml.core.xml/groups=0107include07111contentType128org.eclipse.core.runtime.xmlT111contentType134org.eclipse.wst.xml.core.xmlsourceT111contentType134org.eclipse.wst.xml.core.xslsourceT111contentType134org.eclipse.jst.jsp.core.tldsourceT07fileext03xmlF07fileext06varselF07fileext06vardefF0107exclude05113projectNature134org.eclipse.jst.j2ee.ejb.EJBNature113projectNature130org.eclipse.jst.j2ee.EARNature04file08.projectT0104file110.classpathT0104file110.settings/T02 - 在RCP产品的
.product文件「Launching」选项卡的「Program arguments」中添加:
打包后的产品,确保-pluginCustomization <你的插件ID>/plugin_customization.iniplugin_customization.ini被包含在插件中,并在产品.ini文件内添加上述参数即可。
方法2:通过代码初始化首选项
在RCP应用的启动类(如继承AbstractUIApplication的类)中,添加代码自动写入默认首选项:
import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.osgi.service.prefs.BackingStoreException; public class YourApplication extends AbstractUIApplication { @Override protected IStatus run(IApplicationContext context) throws Exception { // 初始化XML验证器首选项 IEclipsePreferences prefs = DefaultScope.INSTANCE.getNode("org.eclipse.wst.validation"); prefs.put("vals/org.eclipse.wst.xml.core.xml/groups", "0107include07111contentType128org.eclipse.core.runtime.xmlT111contentType134org.eclipse.wst.xml.core.xmlsourceT111contentType134org.eclipse.wst.xml.core.xslsourceT111contentType134org.eclipse.jst.jsp.core.tldsourceT07fileext03xmlF07fileext06varselF07fileext06vardefF0107exclude05113projectNature134org.eclipse.jst.j2ee.ejb.EJBNature113projectNature130org.eclipse.jst.j2ee.EARNature04file08.projectT0104file110.classpathT0104file110.settings/T02"); try { prefs.flush(); } catch (BackingStoreException e) { e.printStackTrace(); } return super.run(context); } }
该方式会在应用启动时自动将设置写入默认首选项,对所有新工作区生效。
方法3:配置文件关联(额外优化)
为了让自定义扩展名文件被自动识别为XML类型,可在插件plugin.xml中添加内容类型绑定:
<extension point="org.eclipse.core.contenttype.contentTypes"> <content-type base-type="org.eclipse.core.runtime.xml" file-extensions="varsel,vardef" id="com.yourcompany.customxml" name="Custom XML Files"> </content-type> </extension>
将file-extensions替换为你的自定义扩展名,配合验证规则就能更稳定地触发XML验证。
内容的提问来源于stack exchange,提问作者Sangli

