摆脱derby.log

时间:2009-06-16 22:54:36

标签: java maven-2 derby

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

非常感谢任何帮助。

8 个答案:

答案 0 :(得分:45)

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>

答案 1 :(得分:21)

您可以通过创建以下类

来删除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

Credit to whom it is due.

答案 2 :(得分:8)

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

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

(或

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

在Windows上)

答案 3 :(得分:3)

对于集成测试,情况可能比简单surefire属性更棘手。 在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,就像在万无一失的解决方案中一样。

答案 4 :(得分:3)

您也可以通过以下方式将德比主页设置为target/derbytarget

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

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

答案 5 :(得分: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>

答案 6 :(得分:2)

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

System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");

答案 7 :(得分:0)

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

my answer here中所述,您可以通过我编写的derby-maven-plugin将Derby用作您的数据库,可以在GitHub和Maven Central上使用。