gradle 测试因拦截器 class 未找到而失败

gradle test failing due to interceptor class not found

我正在完成 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 目录。 ./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 和所有 class 文件直接来自作者在 GitHub 上的回购协议,并且看起来与上述错误所说的完全一致。 beans.xml声明拦截器,拦截器class注解@Interceptor.

我猜问题出在我的 gradle 构建上。有人知道问题出在哪里吗?

gradle 将测试资源复制到与 Weld Container 期望的文件夹不同的文件夹中。 Gradle 将它放在 build/resources/test/META-INF 中,测试正在使用的焊接容器希望它位于 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

A​​llen,我假设你正在做同样的例子:agoncal-book-javaee7/chapter02/chapter02-putting-together。

当我尝试 "mvn test" 时,它起作用了,并且发现了 Maven 和 gradle 之间的 build/target 目录之间的区别。 Maven 将 classes 和资源组合在一个目录中(就像您在将其打包到 jar 之前所做的那样)但 gradle 将两者分开,一个文件夹用于 classes,另一个文件夹用于资源。用于测试的 WeldContainer 在读取 beans.xml.

时无法拾取 class

这是我的 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