layer.xml 是netbeans开发富客户端应用程序非常重要的配置文件。 layer.xml定义了目录和文件组成netbeans运行时的配置信息和富客户端应用程序使用的信息。
       下来看看layer.xml的自动生成,在上篇《NetBeans 模块开发简介》中,layer.xml的内容就是完全根据向导设置生成的,右键点击工程->netbeans 模块开发->Action(为菜单,工具栏等添加事件动作),在“GUI 注册”选择全局菜单,全局工具栏,为layer.xml生成如下内容:


< 
  folder  
  name 
  ="Actions" 
  > 
  
         
  < 
  folder  
  name 
  ="Tools" 
  > 
  
             
  < 
  file  
  name 
  ="org-stoneyang-nbplugin-MyFirstAction.instance" 
  /> 
  
         
  </ 
  folder 
  > 
  
     
  </ 
  folder 
  > 
  
     
  < 
  folder  
  name 
  ="Menu" 
  > 
  
         
  < 
  folder  
  name 
  ="Tools" 
  > 
  
             
  < 
  attr  
  name 
  ="org-openide-actions-ToolsAction.instance/org-stoneyang-nbplugin-separatorBefore.instance" 
   boolvalue 
  ="true" 
  /> 
  
             
  < 
  file  
  name 
  ="org-stoneyang-nbplugin-separatorBefore.instance" 
  > 
  
                 
  < 
  attr  
  name 
  ="instanceClass" 
   stringvalue 
  ="javax.swing.JSeparator" 
  /> 
  
             
  </ 
  file 
  > 
  
             
  < 
  attr  
  name 
  ="org-stoneyang-nbplugin-separatorBefore.instance/org-stoneyang-nbplugin-MyFirstAction.shadow" 
   boolvalue 
  ="true" 
  /> 
  
             
  < 
  file  
  name 
  ="org-stoneyang-nbplugin-MyFirstAction.shadow" 
  > 
  
                 
  < 
  attr  
  name 
  ="originalFile" 
   stringvalue 
  ="Actions/Tools/org-stoneyang-nbplugin-MyFirstAction.instance" 
  /> 
  
             
  </ 
  file 
  > 
  
             
  < 
  attr  
  name 
  ="org-stoneyang-nbplugin-MyFirstAction.shadow/org-stoneyang-nbplugin-separatorAfter.instance" 
   boolvalue 
  ="true" 
  /> 
  
             
  < 
  file  
  name 
  ="org-stoneyang-nbplugin-separatorAfter.instance" 
  > 
  
                 
  < 
  attr  
  name 
  ="instanceClass" 
   stringvalue 
  ="javax.swing.JSeparator" 
  /> 
  
             
  </ 
  file 
  > 
  
             
  < 
  attr  
  name 
  ="org-stoneyang-nbplugin-separatorAfter.instance/Separator1.instance" 
   boolvalue 
  ="true" 
  /> 
  
         
  </ 
  folder 
  > 
  
     
  </ 
  folder 
  > 
  
     
  < 
  folder  
  name 
  ="Toolbars" 
  > 
  
         
  < 
  folder  
  name 
  ="Build" 
  > 
  
             
  < 
  attr  
  name 
  ="org-netbeans-modules-project-ui-RunMainProject.shadow/org-stoneyang-nbplugin-MyFirstAction.shadow" 
   boolvalue 
  ="true" 
  /> 
  
             
  < 
  file  
  name 
  ="org-stoneyang-nbplugin-MyFirstAction.shadow" 
  > 
  
                 
  < 
  attr  
  name 
  ="originalFile" 
   stringvalue 
  ="Actions/Tools/org-stoneyang-nbplugin-MyFirstAction.instance" 
  /> 
  
             
  </ 
  file 
  > 
  
             
  < 
  attr  
  name 
  ="org-stoneyang-nbplugin-MyFirstAction.shadow/org-netbeans-modules-project-ui-DebugMainProject.shadow" 
   boolvalue 
  ="true" 
  /> 
  
         
  </ 
  folder 
  > 
  
     
  </ 
  folder 
  >           netbeans使用虚拟文件结构表示使用者文件和netbeans本身配置文件。 我们可以想象netbeans本身可以这样表示: 

   
<   filesystem 
  > 
  
       < 
  folder  
  name 
  ="Actions" 
  > 
  
        。。。
       </ 
  folder 
  > 
  
       < 
  folder  
  name 
  ="Menu" 
  > 
  
        。。。
       </ 
  folder 
  > 
  
       < 
  folder  
  name 
  ="Toolbars" 
  > 
  
        。。。
       </ 
  folder 
  > 
  
       < 
  folder  
  name 
  ="..." 
  > 
  
        。。。
       </ 
  folder 
  > 
  
   < 
  filesystem 
  >

    回过头来看看layer.xml的内容,它特有的表示法,也就是將所有的『 . 』换成『 - 』。类似于文件结构,要在一个特定的菜单下加入一个菜单项,需要在其folder节点下添加file节点,然后添加相应的属性,originalFile属性说明调用的实际java类。


      layer.xml最重要的作用是使得应用动态安装成为可能,开发者可以监听文件系统中目录和文件的变化,当应用处于运行时,UI就会更新来反映相应的变化。


     现在高版本的netbeans会自动生成layer.xml,自己可以手动添加自己需要的内容,而不需使用向导,例如在开发服务器管理插件时,我们可以手动添加如下内容:


<   folder    name 
  ="J2EE" 
  > 
  
           <   folder  
  name 
  ="DeploymentPlugins" 
  > 
  
           <   folder  
  name 
  ="MyServer" 
  > 
  

                   <   file  
  name 
  ="Descriptor" 
   url 
  ="nbdep.xml" 
  /> 
  

                   <   file  
  name 
  ="Factory.instance" 
  > 
  
                       <   attr  
  name 
  ="instanceCreate" 
   methodvalue 
  ="org.stoneyang.yqserver.MyDeploymentFactory.create" 
  /> 
  
                       <   attr  
  name 
  ="instanceClass" 
   stringvalue 
  ="org.stoneyang.yqserver.MyDeploymentFactory" 
  /> 
  
                       <   attr  
  name 
  ="instanceOf" 
   stringvalue 
  ="javax.enterprise.deploy.spi.factories.DeploymentFactory" 
  /> 
  
           </   file 
  > 
  

                   <   file  
  name 
  ="RegistryNodeFactory.instance" 
  > 
  
                       <   attr  
  name 
  ="instanceClass" 
   stringvalue 
  ="org.stoneyang.yqserver.nodes.MyRegistryNodeFactory" 
  /> 
  
                       <   attr  
  name 
  ="instanceOf" 
   stringvalue 
  ="org.netbeans.modules.j2ee.deployment.plugins.api.RegistryNodeFactory" 
  /> 
  
           </   file 
  > 
  

                   <   file  
  name 
  ="J2eePlatformFactory.instance" 
  > 
  
                       <   attr  
  name 
  ="instanceCreate" 
   newvalue 
  ="org.stoneyang.yqserver.MyJ2eePlatformFactory" 
  /> 
  
                       <   attr  
  name 
  ="instanceClass" 
   stringvalue 
  ="org.stoneyang.yqserver.MyJ2eePlatformFactory" 
  /> 
  
                       <   attr  
  name 
  ="instanceOf" 
   stringvalue 
  ="org.netbeans.modules.j2ee.deployment.plugins.api.J2eePlatformFactory" 
  /> 
  
           </   file 
  > 
  

                   <   file  
  name 
  ="OptionalFactory.instance" 
  > 
  
                       <   attr  
  name 
  ="instanceCreate" 
   newvalue 
  ="org.stoneyang.yqserver.MyOptionalFactory" 
  /> 
  
                       <   attr  
  name 
  ="instanceClass" 
   stringvalue 
  ="org.stoneyang.yqserver.MyOptionalFactory" 
  /> 
  
                       <   attr  
  name 
  ="instanceOf" 
   stringvalue 
  ="org.netbeans.modules.j2ee.deployment.plugins.api.OptionalDeploymentManagerFactory" 
  /> 
  
           </   file 
  > 
  

                   <   file  
  name 
  ="ConfigurationSupportImpl.instance" 
  > 
  
                       <   attr  
  name 
  ="instanceCreate" 
   newvalue 
  ="org.stoneyang.yqserver.ConfigurationSupportImpl" 
  /> 
  
                       <   attr  
  name 
  ="instanceOf" 
   stringvalue 
  ="org.netbeans.modules.j2ee.deployment.plugins.api.ConfigurationSupport" 
  /> 
  
           </   file 
  > 
  
                
                   <   folder  
  name 
  ="DeploymentFileNames" 
  > 
  
                        <   folder  
  name 
  ="WAR" 
  > 
  
                            <   file  
  name 
  ="WEB-INFmyserver-web.xml" 
  /> 
  
                        </   folder 
  > 
  
               </   folder 
  > 
  

               </   folder 
  > 
  
       </   folder 
  > 
  

       </   folder 
  >



   最后,layer.xml的存放位置可以随意改动,在工程的模块清单中修改


OpenIDE-Module-Layer:对应值即可