0

私はBeginning Java EE 7の演習に取り組んでいますが、Mavenの代わりにGradleを使用するようにそれらを適応させようとしています。第 2 章のインターセプターの演習では、次の build.gradle を作成しました。

apply plugin: 'java'
repositories {
  mavenCentral()
}
dependencies {
    compile 'org.slf4j:slf4j-api:1.7.5', 'org.jboss.weld.se:weld-se-core:2.2.10.Final'
    testCompile "junit:junit:4.11"
}
jar {
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    manifest {
        attributes 'Main-Class': 'org.agoncal.book.javaee7.chapter02.Main'
    }
}

著者の GitHubから直接 src dir を使用しているだけです。 ./gradlew -x test build成功しjava -jar build/libs/gradleTest.jar、期待される出力が得られます (ただし、多くの予期しない警告も吐き出します)。 ./gradlew testただし、次のエラーで失敗します。

org.jboss.weld.exceptions.DeploymentException: WELD-001417: Enabled interceptor class <class>org.agoncal.book.javaee7.chapter02.LoggingInterceptor</class> in file:/home/allen/gradleTest/build/resources/main/META-INF/beans.xml@7 does not match an interceptor bean: the class is not found, or not annotated with @Interceptor and still not registered through a portable extension, or not annotated with @Dependent inside an implicit bean archive

beans.xml とすべてのクラス ファイルは、GitHub の作成者のリポジトリから直接取得したものであり、上記のエラーがそうではないと言っているように見えます。beans.xml はインターセプターを宣言し、インターセプター クラスには @Interceptor のアノテーションが付けられます。

私の推測では、問題は私のgradleビルドにあります。誰が問題が何であるかを見ていますか?

4

2 に答える 2

1

アレン、私はあなたが同じ例をやっていると仮定しています: agoncal-book-javaee7/chapter02/chapter02-putting-together.

「mvn test」を試してみたところ、動作し、maven と gradle のビルド/ターゲット ディレクトリの違いが見つかりました。Maven では、クラスとリソースの両方が 1 つのディレクトリにまとめられますが (jar にパッケージ化する前と同様)、gradle ではクラス用のフォルダとリソース用のフォルダの 2 つが分離されます。テストに使用する WeldContainer は、beans.xml の読み取り時にクラスを取得できませんでした。

これが私のbuild.gradleです:

apply plugin: 'java'
repositories {
    mavenCentral()
}
dependencies {
    compile 'org.slf4j:slf4j-api:1.7.5', 'org.jboss.weld.se:weld-se-core:2.2.10.Final'

        compile 'org.eclipse.persistence:org.eclipse.persistence.jpa:2.5.2'

        compile 'javax:javaee-api:7.0'
        compile 'org.apache.derby:derby:10.10.1.1'
        testCompile "junit:junit:4.11"
}

test.doFirst {
    copy { 
        from 'build/resources/test/META-INF/beans.xml'
        into 'build/classes/main/META-INF'
    }
    copy { 
        from 'build/resources/test/META-INF/beans.xml'
        into 'build/classes/test/META-INF'
    }
}

実行時の結果:

> chapter02-putting-together git:(master) X gradle clean test
:clean
:compileJava
:processResources
:classes
:compileTestJava
:processTestResources
:testClasses
:test

BUILD SUCCESSFUL

Total time: 4.302 secs
于 2015-04-23T17:51:53.797 に答える
0

gradle は、テスト リソースを、Weld コンテナーが想定しているフォルダーとは別のフォルダーにコピーします。Gradle はそれを build/resources/test/META-INF に置きます。テストが使用している Weld Container は、それを build/classes/test/META-INF に置きたいと考えています。手動でコピーできます:

test.doFirst {
 copy { 
   from 'build/resources/test/META-INF/beans.xml'
   into 'build/classes/test/META-INF'
 }
}

Maven は別の方法で行います。mvn テストを実行すると、target/test-classes/META-INF/beans.xml が表示されます。

于 2015-04-23T12:26:34.957 に答える