我正在完成 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构建。有谁看到问题是什么?
答案 0 :(得分:1)
当我尝试&#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