2009-06-16 9 views
25

Używam wbudowanej bazy danych Apache Derby do testowania jednostek w projekcie Maven. Niestety za każdym razem, gdy przeprowadzę test, otrzymuję plik derby.log w katalogu głównym projektu. Sama baza danych jest tworzona w katalogu target (jdbc:derby:target/unittest-db;create=true), więc nie stanowi to problemu. Po zapoznaniu się z reference guide próbowałem ustawić parametr logDevice na adresie URL JDBC (jdbc:derby:target/unittest-db;create=true;logDevice=/mylogs), ale wydaje się, że jest on dla innego dziennika, dlatego też nadal pojawia się derby.log.Pozbycie się derby.log

Każda pomoc jest doceniana.

Odpowiedz

19

można pozbyć derby.log pliku tworząc następujące klasy

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

i konfiguracji systemu JVM własność derby.stream.error.field, na przykład, stosując następujący JVM wiersza polecenia argument:

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

Credit to whom it is due.

+0

Co jeśli używam Derby przez Hibernate? Gdzie umieścić linię "derby.stream.error.field"? – pek

+0

W webappie trudno jest ustawić rekwizyty systemowe. Jakikolwiek sposób obejścia tego? – bmargulies

+0

Nie sądzę, ale możesz skonfigurować ustawienia w konfiguracji web.xml lub spring, aby uruchomić przy starcie i tam to zrobić. – stevedbrown

41

Derby pozwala określić nazwę pliku, do którego zapisywane są komunikaty o błędach Właściwość systemu Java derby.stream.error.file. Wartością domyślną jest "derby.log".

Aby pozbyć derby.log podczas Maven Surefire fazie testów, po prostu dodać definicję nieruchomości w konfiguracji wtyczki następująco:

<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

you shoudl prepend target/with $ {basedir} lub nie możesz wykonać maven z innego katalogu. – user1050755

+1

Działa to doskonale w przypadku testów jednostkowych, ale generalnie nie będzie produkować tego, co jest potrzebne do testów integracyjnych. Powodem jest to, że baza danych znajduje się zwykle na serwerze (np. Pomost), który nie dziedziczy środowiska z pewnego ognia/zabezpieczenia. – Fabian

+0

Powinieneś rozważyć użycie zmiennej $ {project.build.directory} zamiast twardego kodowania folderu docelowego. $ {project.build.directory} /derby.log fl0w

2

ja wymyślił innego rozwiązania. Wypróbuj to; to zadziałało dla mnie. Zmieniam ścieżkę System.stream.error.file i ustawię ją na jedną z właściwości obecnych w moim pliku właściwości. Wystarczy dodać poniższy kod do pliku 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 za zły wiosenny hack! :) – carlspring

7

obejmują następujące w pliku derby.properties:

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

(lub

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

Windows)

+0

\\ Urządzenie \\ Null rzucił wyjątek FileNotFoundException, jednak użycie NUL-a spowodowało powstanie problemu. Dzięki. –

+0

Użyłem derby.stream.error.file =./NUL – RockyMM

3

Do integracji testuje sytuacja może być nieco bardziej podstępna niż prosta właściwość surefire. Określenie właściwości derby.stream.error.file w maven-failsafe-plugin nie będzie działać, ponieważ środowisko serwerowe nie dziedziczy po tej wtyczce (oczywiście używanie maven-surefire-plugin nie powoduje żadnych różnic).

Zamiast tego należy zmodyfikować rzeczywistą wtyczkę startową serwera. Poniższy przykład jest dla 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> 

Należy zauważyć, że z jakiegoś powodu używamy systemProperty i nie tylko property jak w murowany rozwiązania.

+0

Przepraszamy, to jest dokładnie to, czego potrzebowałem, TO powinno być zaakceptowaną odpowiedzią :) – RockyMM

2

Jeśli nie masz dostępu do konfiguracji można wykonać to przed dokonaniem połączenia:

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

To jest również to, co zrobiłem w metodzie z adnotacjami z '@ BeforeClass' adnotacja – Stefan

0

To nie jest rozwiązanie problemu plików derby.log (co wiele osób już pokazano, jak rozwiązać), ale raczej - sugestię. Dlaczego nie użyć testu derby-maven-plugin? Umieszcza plik derby.log pod target/derby, nie pozostawiając żadnych śmieci.

Zgodnie z opisem w my answer here, możesz użyć Derby jako bazy danych za pomocą dodatku do derby-maven, który napisałem i jest dostępny pod adresem GitHub i przez Maven Central.

2

Można też po prostu ustawić domu Derby target/derby lub target poprzez:

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

a następnie użyć adresu URL JDBC jdbc:derby:unittest-db;create=true. Następnie w prawym folderze pojawi się plik derby.log.

Powiązane problemy