문제
Maven 프로젝트에서 단위 테스트를 위해 Apache Derby Embedded Database를 사용하고 있습니다. 불행히도 테스트를 실행할 때마다 derby.log
프로젝트의 루트에 파일. 데이터베이스 자체는 target
디렉토리 (jdbc:derby:target/unittest-db;create=true
) 그래서 그것은 문제가 아닙니다. 상담 후 참조 안내서 나는 설정을 시도했다 logDevice
JDBC URL의 매개 변수 (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 System 속성을 사용하여 오류 로그 메시지가 작성된 파일의 이름을 지정할 수 있습니다. derby.stream.error.file
. 기본값은 'derby.log'입니다.
제거하기 위해 derby.log
Maven SureFire 테스트 단계에서는 플러그인 구성에 다음과 같이 속성 정의를 추가합니다.
<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에서)
통합 테스트의 경우 상황이 단순보다 조금 더 까다로울 수 있습니다. 확실한 재산. 속성을 지정합니다 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
확실한 솔루션에서와 같이.
Derby를 집으로 설정할 수도 있습니다 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.log
아래에 파일 target/derby
, 따라서 쓰레기를 남기지 않습니다.
설명대로 내 대답, 당신은 내가 쓴 Derby-Maven-Plugin을 통해 Derby를 데이터베이스로 사용할 수 있습니다. github 그리고 Maven Central을 통해.