Java 未为JRE 1.7上的NetBeans 7.2注册自定义属性编辑器

Java 未为JRE 1.7上的NetBeans 7.2注册自定义属性编辑器,java,java-7,slf4j,netbeans-platform,Java,Java 7,Slf4j,Netbeans Platform,我有一个大型桌面Java应用程序,正在从JRE 1.6迁移到JRE 1.7。该应用程序使用用于GUI的NetBeans API和带有Log4J后端的SLF4J API。该应用程序有两种部署方法,一种是独立的应用程序(由Ant或Launch4j exe运行),另一种是通过简单的自定义HTTP服务器(Jetty和JNLP servlet)启动web 应用程序有几个NetBeans模块安装组件,这些组件在启动时将属性编辑器添加到Java PropertyEditorManager搜索路径。例如 Arr

我有一个大型桌面Java应用程序,正在从JRE 1.6迁移到JRE 1.7。该应用程序使用用于GUI的NetBeans API和带有Log4J后端的SLF4J API。该应用程序有两种部署方法,一种是独立的应用程序(由Ant或Launch4j exe运行),另一种是通过简单的自定义HTTP服务器(Jetty和JNLP servlet)启动web

应用程序有几个NetBeans模块安装组件,这些组件在启动时将属性编辑器添加到Java PropertyEditorManager搜索路径。例如

ArrayList<String> editorPaths = new ArrayList<String>();
editorPaths.add(LocationEditor.class.getPackage().getName());
editorPaths.addAll(Arrays.asList(PropertyEditorManager.getEditorSearchPath()));
PropertyEditorManager.setEditorSearchPath(editorPaths.toArray(new String[editorPaths.size()]));
ArrayList editorPaths=new ArrayList();
add(LocationEditor.class.getPackage().getName());
addAll(Arrays.asList(PropertyEditorManager.getEditorSearchPath());
PropertyEditorManager.setEditorSearchPath(EditorPath.toArray(新字符串[EditorPath.size()]);
当我迁移到Java1.7(u9)时,应用程序中不再存在这些编辑器,无论是独立的还是WebStart部署。应用程序启动良好,从Eclipse启动时可以访问编辑器。出于好奇,我添加了一些日志语句来报告搜索路径,并通过Ant启动脚本设置log4j.configuration属性。编辑们现在有空了。然后我启动了.exe(它不接受命令行参数,因此没有设置log4j配置),编辑器再次消失

因此,微分器似乎正在设置log4j.configuration参数。我更改了构建,因此standlong Ant和.exe引用了这个,它们可以工作。web start虽然没有传递该值(它在代码中内部加载),但仍然无法找到编辑器。我还从Eclipse运行命令中删除了log4j设置,编辑器再次消失

我尝试专门针对类型注册,而不是使用搜索路径,但仍然没有成功。我使用的搜索路径是一个可选的覆盖另一个模块编辑器,但我不知道模块的启动顺序,因此一个将其路径附加到查找的开始,而另一个附加到查找的结束

我还尝试删除所有SLF4J到Log4J的映射,并改用SLF4J Simple。这没什么区别。将参数添加回中会使代码再次工作。SpringAspects依赖项引入了一个Log4J引用

我有一个独立的工作解决方案,我相信我可以让新的技巧为webstart工作,但这是一个糟糕的黑客臭味让事情工作。我宁愿找出编辑失踪的原因。不会报告任何异常,从所有ModuleInstall对象中删除日志记录不会产生任何效果。所有代码仍在执行,这包括ModuleInstall执行的其他功能,因此我知道它们正在运行

我使用的是NetBeans RELEASE72,其他依赖项包括:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.2</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.2</version>
</dependency>

org.slf4j
slf4j api
1.7.2
org.slf4j
slf4j-log4j12
1.7.2
更新1

我已经跟踪到我们的自定义日志设置的问题。当删除此部分并使用简单记录器时,问题没有发生。当这个自定义配置被删除并且slf4j-log4j12再次连接时,我仍然得到了属性编辑器。但是,当我再次启用自定义日志记录配置时,编辑器失败

自定义日志记录配置确保即使用户未指定任何内容,我们也有日志记录设置。还有一些奇怪的statup过程,其他用户激活了这个过程,在编织过程之后才能激活日志记录。我怀疑自定义日志设置不适用于Java1.7,或者与替换重定向到自定义日志的默认日志处理程序有关


无论如何,这看起来像是一个内部混乱,互联网帮不上什么忙。

我把这个问题抛在脑后,最终又回到了问题上来。问题是PropertyEditorManager现在不再是全局单例,而是线程本地单例。搜索路径在JDK 1.7中的ThreadLocalContext中注册,可能是为了防止线程同步问题。但是,NetBeans模块安装程序在主线程上执行,然后在AWT线程上读取属性读取器。这意味着AWT线程找不到任何属性编辑器

作为修复,我只是使用SwingUtilities.invokeLater()来注册属性编辑器路径


我不知道是什么导致了其他症状的出现。

我只是在追踪一个类似的问题; 当我在java 1.7.025下运行我的NetBeans RCP 7.3应用程序时
org.netbeans.beaninfo.editors.DateEditor
不再适用于我的GUI属性页

正如您所建议的,我已经通过将此代码包含到GUI模块的安装程序中解决了这个问题

SwingUtilities.invokeLater(new Runnable()
{
    @Override
    public void run() {
        NodeOp.registerPropertyEditors();
    }
});
这解决了现在的问题,但感觉有点不舒服