2015-04-23 3 views
0

Я работаю над упражнениями в Начало 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 реж непосредственно из author's 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/[email protected] 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.

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

ответ

1

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

Когда я попробовал «mvn test», он работает и нашел разницу между каталогом build/target между maven и gradle. Maven сочетает в себе как классы, так и ресурсы в одном каталоге (как и перед упаковкой в ​​банке), но 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 
+0

Просто, чтобы закрыть цикл, мне нужны были только теги test.doFirst, а не какие-либо другие. – Allen

+0

Я думаю, что я поместил эти зависимости, когда компилировал другие проекты с JPA. –

+0

Я буду помнить об этом позже. Кроме того, можете ли вы обновить свой ответ, чтобы немного рассказать о том, как вы наблюдали поведение контейнера Weld? Как вы видели, что он смотрит в другой каталог? Что привело ваше расследование к этому пути? и т.п. – Allen

0

gradle копирует тестовые ресурсы в другой папке, чем ожидает контейнер Weld Container. Gradle помещает его в сборку/ресурсы/тест/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 делает это по-другому, если вы запустите тест МВН, вы можете увидеть цель/тест-классы/META-INF/beans.xml

+0

Добавление этого кода в gradle.build производит точно такое же поведение, как я описал ранее. – Allen

Смежные вопросы