2009-06-16 4 views
25

Maven 프로젝트에서 단위 테스트를 위해 Apache Derby 내장 데이터베이스를 사용하고 있습니다. 불행히도 테스트를 실행할 때마다 프로젝트의 루트에 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
다음 JVM 명령 줄 인수를 사용하여, 예를 들어, 다음 클래스

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

를 만들고 JVM 시스템을 특성 derby.stream.error.field을 설정하여 derby.log 파일을 제거 할 수

:

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

Credit to whom it is due.

+0

최대 절전 모드에서 Derby를 사용한다면 어떻게 될까요? 어디에서 "derby.stream.error.field"라는 줄을 써야합니까? – pek

+0

webapp에서는 시스템 소품을 설정하는 것이 쉽지 않습니다. 주위에? – bmargulies

+0

필자는 그렇게 생각하지 않지만 web.xml 또는 spring config에서 시작할 때 실행할 수 있도록 설정하고 할 수 있습니다. – stevedbrown

41

Derby를 사용하면 오류 로그 메시지가 기록되는 파일의 이름을 지정할 수 있습니다. Java 시스템 특성 derby.stream.error.file. 기본값은 'derby.log'입니다. 다음과 같이

은 메이븐 확실한 테스트 단계에서 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> 
+0

당신은 $ {basedir}로 target /를 앞에 추가해야합니다. 그렇지 않으면 다른 dir에서 maven을 실행할 수 없습니다. – user1050755

+1

이것은 단위 테스트에서 완벽하게 작동하지만 일반적으로 통합 테스트를 위해 원하는 것을 생성하지 않습니다. 그 이유는 확실한/실패로부터 환경을 상속받지 않는 서버 (예 : 부두)에 데이터베이스가 존재하기 때문입니다. – Fabian

+0

대상 폴더를 하드 코딩하는 대신 $ {project.build.directory} 변수를 사용해보십시오. $ {project.build.directory} /derby.log fl0w

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> 
+1

나쁜 봄 엉덩이 +1! :) – carlspring

7

은 당신의 derby.properties 파일에 다음을 포함한다 :

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

(또는

Windows에서
derby.stream.error.file=\\Device\\Null 

) 통합을위한

+0

\\ Device \\ Null은 FileNotFoundException을 던졌습니다. 대신 NUL을 사용하여 트릭을 수행했습니다. 감사. –

+0

derby.stream.error.file =./NUL – RockyMM

3

상황이있을 수 있습니다 테스트를 좀 더 단순한 surefire 속성보다 까다 롭습니다. derby.stream.error.filemaven-failsafe-plugin에 지정하면 서버 환경이 해당 플러그인을 상속하지 않으므로 (분명히 maven-surefire-plugin을 사용하면 차이가 없습니다).

대신 실제 서버 시작 플러그인을 수정해야합니다. 다음은 maven-jetty-plugin입니다 : 어떤 이유로 우리가 확실한 솔루션으로 단지 propertysystemProperty하지를 사용

<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> 

하는 것으로.이 구성에 액세스 할 수없는 경우

+0

죄송합니다, 이것은 정확히 내가 필요로하는 것입니다.이 대답은 받아 들여야합니다 :) – RockyMM

2

, 당신은 연결하기 전에이 작업을 실행할 수 있습니다 : 이것은 많은 사람들이 이미 보여 주었다 당신의 derby.log 파일 문제에 대한 해결책, (하지

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

이것은 또한 주석이 달린 테스트 메소드에서 '@ BeforeClass' 주석 – Stefan

0

어떻게 해결하기 위해), 오히려 - 제안. 시험에 derby-maven-plugin을 사용하지 않으시겠습니까? derby.log 파일은 target/derby에 저장되므로 깔짚이 남지 않습니다.

my answer here에서 설명한대로 derby-maven-plugin을 통해 Derby를 데이터베이스로 사용할 수 있으며 GitHub 및 Maven Central을 통해 사용할 수 있습니다.

2

또한 단지를 통해 target/derby 또는 target에 더비 홈을 설정할 수 있습니다

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

다음 JDBC의 URL jdbc:derby:unittest-db;create=true를 사용합니다. 그러면 derby.log가 오른쪽 폴더에 나타납니다.