由于未找到拦截器类,gradle测试失败

时间:2015-04-23 04:43:54

标签: java-ee gradle weld weld-se

我正在完成 Beginning Java EE 7 中的练习,除了我试图让它们适应Gradle而不是Maven。对于第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'
    }
}

我只是直接从author's 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构建。有谁看到问题是什么?

2 个答案:

答案 0 :(得分:1)

艾伦,我假设你做的是同样的例子:agoncal-book-javaee7 / chapter02 / chapter02-put-together。

当我尝试&#34; mvn test&#34;它工作,并发现maven和gradle之间的构建/目标目录之间的差异。 Maven将类和资源组合在一个目录中(就像在将它打包到jar中之前一样),但是gradle将两个文件夹分隔为类,另一个文件夹分隔资源。用于测试的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

答案 1 :(得分:0)

gradle将测试资源复制到一个不同于焊接容器所期望的文件夹中。 Gradle将它放在build / resources / test / META-INF中,测试使用的Weld容器希望它在build / classes / test / META-INF中。您可以手动复制它:

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

Maven做的不同,如果你运行mvn test,你可以看到target / test-classes / META-INF / beans.xml