28

我正在使用 Apache Derby 嵌入式数据库在 Maven 项目中进行单元测试。不幸的是,每当我运行测试时,我都会derby.log在项目的根目录中找到该文件。数据库本身是在target目录 ( jdbc:derby:target/unittest-db;create=true) 中创建的,因此这不是问题。在查阅参考指南后, 我尝试logDevice在 JDBC url ( jdbc:derby:target/unittest-db;create=true;logDevice=/mylogs) 上设置参数,但这似乎是针对不同的日志,因此derby.log仍然出现。

任何帮助深表感谢。

4

8 回答 8

50

Derby 允许您使用 Java 系统属性指定将错误日志消息写入其中的文件的名称derby.stream.error.file。默认值为“derby.log”。

为了摆脱derby.logMaven 万无一失的测试阶段,我只需在插件配置中添加属性定义,如下所示:

<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>
于 2009-12-19T16:16:26.970 回答
23

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

应归功于谁。

于 2009-06-17T01:34:11.437 回答
8

在 derby.properties 文件中包含以下内容:

derby.stream.error.file=/dev/null

( 或者

derby.stream.error.file=\\Device\\Null

在 Windows 上)

于 2012-08-02T14:09:48.517 回答
3

对于集成测试,情况可能比简单的肯定性属性更棘手。derby.stream.error.file在 中指定属性maven-failsafe-plugin将不起作用,因为服务器环境不会从该插件继承(显然使用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而不是property像在万无一失的解决方案中那样。

于 2014-05-25T17:53:01.633 回答
3

您也可以将 derby home 设置为target/derbytarget通过:

System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());

然后使用 JDBC URL jdbc:derby:unittest-db;create=true。然后 derby.log 出现在正确的文件夹中。

于 2016-07-27T12:13:20.110 回答
2

我想出了另一个解决方案。试试这个;它对我有用。我在这里所做的是我更改了 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>
于 2010-07-06T12:58:59.900 回答
2

如果您无权访问配置,则可以在建立连接之前执行此操作:

System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");
于 2015-08-31T10:35:08.613 回答
0

这不是您的derby.log文件问题的解决方案(许多人已经展示了如何解决),而是一个建议。为什么不使用derby-maven-plugin进行测试?它将derby.log文件放在 下target/derby,因此不会留下任何垃圾。

我在此处的回答中所述,您可以通过我编写的 derby-maven-plugin 将 Derby 用作您的数据库,该插件可在GitHub和 Maven Central 上获得。

于 2015-12-07T17:06:17.413 回答