题
我正在使用Apache Derby嵌入式数据库在Maven项目中进行单元测试。不幸的是,每当我运行测试时,我最终都会在项目的根目录中找到 derby.log
文件。数据库本身是在 target
目录( 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 surefire测试阶段摆脱 derby.log
,我只需在插件配置中添加属性定义,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemProperties>
<property>
<name>derby.stream.error.file</name>
<value>target/derby.log</value>
</property>
</systemProperties>
</configuration>
</plugin>
在derby.properties文件中包含以下内容:
derby.stream.error.file=/dev/null
(或
derby.stream.error.file=\\Device\\Null
在Windows上)
对于集成测试,情况可能比简单的 surefire 属性更棘手。
在 maven-failsafe-plugin
中指定属性 derby.stream.error.file
将不起作用,因为服务器环境不从该插件继承(显然使用 maven-surefire-plugin
没有区别。)
相反,您需要修改实际的服务器启动插件。以下示例适用于 maven-jetty-plugin
:
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<systemProperties>
<!-- Get rid of that missplaced derby.log. -->
<systemProperty>
<name>derby.stream.error.file</name>
<value>${project.build.directory}/derby.log</value>
</systemProperty>
</systemProperties>
</configuration>
</plugin>
请注意,出于某种原因,我们使用 systemProperty
而不仅仅是属性
,就像在万无一失的解决方案中一样。
你也可以通过以下方式将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文件即可。
<bean id="setDerbyLog" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass"><value>java.lang.System</value></property>
<property name="targetMethod"><value>setProperty</value></property>
<property name="arguments">
<list>
<value>derby.stream.error.file</value>
<value>${derby.stream.error.file}</value>
</list>
</property>
</bean>
这不是您的 derby.log
文件问题的解决方案(许多人已经展示了如何解决),而是 - 一个建议。为什么不使用 derby-maven-plugin 进行测试?它将 derby.log
文件放在 target / derby
下,因此不会留下任何垃圾。
如我的回答,您可以通过我编写的derby-maven-plugin将Derby用作您的数据库,并且可以在 GitHub 和Maven Central。