Тест gradle не выполнен из-за отсутствия класса перехватчика

Я работаю над упражнениями в начале 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'
    }
}

Я просто использую src dir прямо из авторского GitHub. ./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

Bean.xml и все файлы классов взяты из репозитория автора на GitHub и выглядят точно так, как указано в приведенной выше ошибке. Beans.xml объявляет перехватчик, а класс перехватчика аннотируется @Interceptor.

Я думаю, что проблема заключается в моей сборке gradle. Кто-нибудь видит в чем проблема?

2 ответа

Решение

Аллен, я предполагаю, что вы делаете тот же пример: agoncal-book-javaee7/chapter02/chapter02-главы-сборка.

Когда я попробовал "mvn test", он работает и обнаружил разницу между каталогом build / target между 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

gradle копирует тестовые ресурсы в папку, отличную от той, которую ожидает сварочный контейнер. 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 test, вы увидите target/test-classes/META-INF/beans.xml

Другие вопросы по тегам