質問

Maven プロジェクトでの単体テストに Apache Derby 組み込みデータベースを使用しています。残念ながら、テストを実行すると必ず次のような結果になります。 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システムプロパティ 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>

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 homeを 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パスを変更し、プロパティファイルの下にあるプロパティの1つに設定したことです。以下のコードを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-maven-plugin を使用してみませんか? target / derby の下に derby.log ファイルを配置するため、ごみが残りません。

こちらの回答、私が書いたderby-maven-plugin経由でデータベースとしてDerbyを使用できます。これは GitHub およびMaven Central経由。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top