两个项目:产品(项目-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)
。 ,它加载一个配置文件,该文件仅包含单个类的记录器配置。
并且在 readConfiguration
期间, LogManager.reset()
将被调用; 期间 reset
,每个记录器的每个处理程序都将被删除。作为<ant>
会将目标构建文件加载到调用者的同一进程,所有处理程序都将被删除。
因此,除了配置的类,其他所有使用 jdk logger 的类都由于缺少输出处理程序而无法输出消息。
我的问题是:
有什么办法可以解决这个问题,除了:
- 使用
<exec>
运行项目 A 的构建文件; - 写一个任务来运行
readConfiguration()
在<ant>
之后从默认配置文件恢复默认 JDK 日志记录设置打电话。 - 使用 ant 自己的日志框架(Task.log() 等)。
请注意,我无法修改项目 A 来防止出现问题。
最佳答案
您可以创建 LogManager
的子类并覆盖 reset
和两个 readConfiguration
方法来安装您需要的处理程序。然后使用 java.util.logging.config.class
系统属性在 statup 上安装您的自定义代码。
关于java - 使用 <ant> 任务调用的构建文件会重置调用者的日志记录配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17718635/