摆脱derby.log
我正在使用Apache Derby嵌入式数据库在Maven项目中进行unit testing。 不幸的是,每当我运行测试时,我最终会得到项目根目录中的derby.log
文件。 数据库本身是在target
目录( jdbc:derby:target/unittest-db;create=true
)中jdbc:derby:target/unittest-db;create=true
因此这不是问题。 在查阅参考指南之后,我尝试在JDBC url上设置logDevice
参数( jdbc:derby:target/unittest-db;create=true;logDevice=/mylogs
),但这似乎是针对不同的日志,因此derby.log
仍然出现。
任何帮助深表感谢。
您可以通过创建以下类来删除derby.log
文件
public class DerbyUtil { public static final OutputStream DEV_NULL = new OutputStream() { public void write(int b) {} }; }
并设置JVM系统属性derby.stream.error.field
,例如,使用以下JVM命令行参数:
-Dderby.stream.error.field=DerbyUtil.DEV_NULL
归功于它应得的人。
Derby允许您使用Java系统属性derby.stream.error.file
指定要将错误日志消息写入的文件的名称。 默认值为’derby.log’。
要在Maven derby.log
测试阶段摆脱derby.log
,我只需在插件配置中添加属性定义,如下所示:
org.apache.maven.plugins maven-surefire-plugin derby.stream.error.file target/derby.log
在derby.properties文件中包含以下内容:
derby.stream.error.file=/dev/null
( 要么
derby.stream.error.file=\\Device\\Null
在Windows上)
对于集成测试,情况可能比简单的surefire属性更棘手。 在maven-failsafe-plugin
指定属性derby.stream.error.file
将不起作用,因为服务器环境不从该插件inheritance(显然使用maven-surefire-plugin
没有区别)。
相反,您需要修改实际的服务器启动插件。 以下示例适用于maven-jetty-plugin
:
org.mortbay.jetty jetty-maven-plugin derby.stream.error.file ${project.build.directory}/derby.log
请注意,出于某种原因,我们使用systemProperty
而不仅仅是确保解决方案中的property
。
你也可以通过以下方式将derby home设置为target/derby
或target
:
System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());
然后使用JDBC URL jdbc:derby:unittest-db;create=true
。 然后derby.log出现在右侧文件夹中。
如果您无权访问配置,则可以在建立连接之前执行此操作:
System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");
我想出了另一个解决方案。 试试这个; 它对我有用。 我在这里做的是我已经更改了System.stream.error.file路径并将其设置为我的属性文件下的属性之一。 只需将以下给定的代码添加到applicationContext.xml文件即可。
java.lang.System setProperty derby.stream.error.file ${derby.stream.error.file}
这不是你的derby.log
文件问题的解决方案(许多人已经展示了如何解决),而是 – 一个建议。 为什么不使用derby-maven-plugin进行测试? 它将derby.log
文件放在target/derby
,因此不会留下任何垃圾。
正如我在这里的回答所述,您可以通过我编写的derby-maven-plugin将Derby用作您的数据库,可以在GitHub和Maven Central上获得。