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

时间:2012-11-14 04:37:46

标签: java java-7 slf4j netbeans-platform

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

该应用程序具有多个NetBeans ModuleInstall组件,可在启动时将属性编辑器添加到Java PropertyEditorManager搜索路径中。 E.g。

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()]));

当我迁移到Java 1.7(u9)时,不再在应用程序中找到这些编辑器,无论是独立编辑还是Web启动部署。应用程序启动正常,从Eclipse启动时可以访问编辑器。很想知道独立失败的原因我添加了一些日志语句来报告搜索路径并通过Ant启动脚本设置 log4j.configuration 属性。编辑现已上市。然后我启动了.exe(不接受命令行参数,因此没有设置log4j配置),编辑器再次出现。

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

我尝试专门注册类型而不是使用搜索路径,但仍然没有成功。我正在使用搜索路径,因为一个可选项覆盖了另一个模块编辑器,但我不知道模块启动顺序,因此将其路径附加到查找的开头,而其他人追加到最后。

我也尝试将所有SLF4J删除到Log4J映射并改为使用SLF4J-Simple。这没有任何区别。重新添加参数使代码再次起作用。 spring-aspects依赖性正在引入一个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>

更新1

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

自定义日志记录配置可确保即使用户未指定任何内容也可以进行日志记录设置。还有一些奇怪的statup进程,其他用户激活,直到编织过程之后才能激活日志记录。我怀疑自定义日志记录设置可能不适用于Java 1.7,或者更改默认日志记录处理程序重定向到我们的自定义日志记录。

无论如何,它看起来像一个内部混乱,互联网可以帮助的并不多。

2 个答案:

答案 0 :(得分:1)

我离开了问题,终于回到了原点。问题是PropertyEditorManager现在不再是全局单例,而是一个线程本地单例。搜索路径在JDK 1.7中的ThreadLocalContext中注册,可能是为了防止线程同步问题。但是,NetBeans ModuleInstall正在主线程上执行,然后在AWT线程上读取属性读取器。这意味着AWT线程没有找到任何属性编辑器。

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

我不知道导致其他症状的原因。

答案 1 :(得分:1)

我刚刚跟踪了一个类似的问题; 当我在java 1.7.0_25下运行我的NetBeans RCP 7.3应用程序时 我的GUI Property Sheets不再提供org.netbeans.beaninfo.editors.DateEditor

正如您所建议的那样,我通过将此代码包含在我的GUI模块的安装程序

中解决了这个问题
SwingUtilities.invokeLater(new Runnable()
{
    @Override
    public void run() {
        NodeOp.registerPropertyEditors();
    }
});

这解决了现在的问题,但感觉有些惹人烦恼......

相关问题