两个项目:产品(项目A)和A的自动基准测试项目(项目B)。
在B的构建文件中,我们需要调用A的构建文件来运行构建并与应用服务器捆绑,过程如下:
<ant antfile="${build-file-A}" inheritall="false" target="all" />
在项目B中,我们有很多Ant任务,它们使用java.util.logging(JDK日志框架)输出消息。
问题是,在那一行之后,所有jdk记录器输出都消失了
通过调试,我发现,在项目A的构建文件的初始化过程中,项目A中静态定义的东西将运行LogManager.readConfiguration(InputStream)
,它加载一个只包含单个类的记录器配置的配置文件。
在readConfiguration
期间,将调用LogManager.reset()
在reset
期间,每个记录器的每个处理程序都将被删除。由于<ant>
将把目标构建文件加载到调用方的同一进程,因此所有处理程序都将被删除。
因此,除了已配置的类之外,由于缺少输出处理程序,其他所有使用jdk记录器的类都无法输出消息。
我的问题是:
除了之外,还有什么方法可以解决这个问题吗
- 使用
<exec>
运行项目A的构建文件 - 编写一个任务来运行
readConfiguration()
,以便在<ant>
调用后从默认配置文件中恢复默认的JDK日志记录设置 - 使用ant自己的日志框架(Task.log()等)
请注意,我无法修改项目A以防止出现问题。
您可以创建LogManager
的子类,并重写reset
和两个readConfiguration
方法来安装所需的处理程序。然后使用java.util.logging.config.class
系统属性在statup上安装自定义代码。