7

两个项目:产品(项目-A)和A的汽车基准项目(项目-B)。

在 B 的构建文件中,我们需要调用 A 的构建文件来运行构建和 bundle-with-app-server 过程,如下所示:

<ant antfile="${build-file-A}" inheritall="false" target="all" />

而且,在项目 B 中,我们有很多使用 java.util.logging(JDK 日志框架)输出消息的 Ant 任务。

问题是,在那一行之后,所有 jdk 记录器输出都消失了。

通过调试,我发现在项目A的构建文件的初始化过程中,项目A中的一个静态定义的东西会运行LogManager.readConfiguration(InputStream),它会加载一个配置文件,其中只包含单个类的记录器配置。

期间readConfigurationLogManager.reset()将被调用;在此期间reset,每个记录器的每个处理程序都将被删除。由于<ant>会将目标构建文件加载到调用者的同一进程中,因此所有处理程序都将被删除。

因此,除了已配置的类,其他所有使用 jdk 记录器的类都无法输出消息,因为缺少输出处理程序。

我的问题是:

有没有办法解决这个问题,除了:

  1. 用于<exec>运行项目 A 的构建文件;
  2. 编写一个要运行的任务,以在调用readConfiguration()后从默认配置文件中恢复默认的 JDK 日志记录设置。<ant>
  3. 使用 ant 自己的日志框架(Task.log() 等)。

请注意,我无法修改项目 A 以防止出现问题。

4

1 回答 1

2

您可能能够创建子类LogManager和覆盖以及安装所需处理程序reset的两种方法。readConfiguration然后使用java.util.logging.config.class系统属性在 statup 上安装您的自定义代码。

于 2013-07-26T14:05:35.383 回答