2009-06-16 101 views
25

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

任何帮助,非常感谢。

回答

19

您可以通过创建下面的类

public class DerbyUtil { 
    public static final OutputStream DEV_NULL = new OutputStream() { 
     public void write(int b) {} 
    }; 
} 

,并设置JVM系统属性derby.stream.error.field,例如,使用以下JVM命令行参数摆脱derby.log文件:

-Dderby.stream.error.field=DerbyUtil.DEV_NULL 

Credit to whom it is due.

+0

如果我通过Hibernate使用Derby会怎么样?我在哪里放置“derby.stream.error.field”这一行? – pek 2009-09-09 16:30:46

+0

在webapp中,设置系统道具是一件痛苦的事情。任何方式呢? – bmargulies 2009-11-13 14:29:30

+0

我不这么认为,但是您可以在web.xml或spring配置文件中将其设置为在启动时运行并在那里执行。 – stevedbrown 2009-11-13 17:15:55

41

Derby允许您指定错误日志消息使用Java系统属性derby.stream.error.file。默认值是'derby.log'。

要在Maven的万无一失测试阶段摆脱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> 
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> 
7

包括在你derby.properties文件中的以下内容:

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

(或

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

在Windows上)

3

集成测试情况也许会多一点比简单的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而不仅仅是property作为万无一失的解决方案。

2

如果您没有访问配置,你可以在建立连接之前执行此:

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

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

my answer here所述,您可以通过我编写的derby-maven插件将Derby用作数据库,并且可以通过GitHub和Maven Central获得。

2

您还可以通过只设定德比主场target/derbytarget

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

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