Как преобразовать проект Java Gradle в динамический веб-проект?
Я следую за этой статьей
https://www.linkedin.com/pulse/building-jax-rs-project-eclipse-gradle-neeraj-malhotra
О том, как построить проект JAX-RS в Eclipse с Gradle
я использую
Eclipse Java EE IDE for Web Developers.
Version: Oxygen.2 Release (4.7.2)
Build id: 20171218-0600
Моя целевая среда выполнения
WildFly Full 11.0.0.Final (WildFly Core 3.0.8.Final)
мой файл сборки gradle
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile "javax.ws.rs:javax.ws.rs-api:2.0.1"
providedCompile "javax.servlet:javax.servlet-api:3.1.0"
}
Я могу выбрать необходимые аспекты и установить целевое время выполнения и т. Д. Отлично.
Грани, которые я выбираю,
cdi 2.0
dynamic web module 3.1
java 1.8
jax-rs 2.1
Как только я нажму на Apply & Close, проект не сообщит о проблемах сборки.
На данный момент мне не нравится, что в проекте есть два файла WEB-INF: один находится на уровне проекта, а другой - в папке WebContent, где я и ожидал.
Существует также файл web.xml, хотя я специально не выбрал создание web.xml.
Реальные проблемы начинаются, когда я обновляю сборку Gradle, щелкнув правой кнопкой мыши файл gradle.build и выбрав gradle> refresh gradle project.
После завершения обновления следующие фасеты были отменены
cdi 2.0
jax-rs 2.1
и мой динамический веб-модуль был понижен до 2.4 с 3.1
В дополнение к этому у меня есть следующие два маркера
CDI Core Validator cannot run on project gradle_jax_rs because Validation Builder precedes CDI (Contexts and Dependency Injection) Builder.
EL Validator cannot run on project gradle_jax_rs because Validation Builder precedes JBoss Knowledge Base Builder.
Как я могу настроить мой динамический веб-проект так, чтобы он поддерживал желаемые аспекты на уровне?
Чего не хватает в моем gradle.build?
ОБНОВИТЬ
Итак, я выследил виновника в Gradle
org.gradle.plugins.ide.eclipse.EclipseWtpPlugin:-
project.getPlugins().withType(WarPlugin.class, new Action<WarPlugin>() {
@Override
public void execute(WarPlugin warPlugin) {
((IConventionAware) task.getFacet()).getConventionMapping().map("facets", new Callable<List<Facet>>() {
@Override
public List<Facet> call() throws Exception {
return Lists.newArrayList(
new Facet(Facet.FacetType.fixed, "jst.java", null),
new Facet(Facet.FacetType.fixed, "jst.web", null),
new Facet(Facet.FacetType.installed, "jst.web", "2.4"),
new Facet(Facet.FacetType.installed, "jst.java", toJavaFacetVersion(project.getConvention().getPlugin(JavaPluginConvention.class).getSourceCompatibility()))
);
}
});
}
});
Это приводит к дублированию jst.web
записи в org.eclipse.wst.common.project.facet.core.xml
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="jst.java"/>
<fixed facet="jst.web"/>
<installed facet="jst.web" version="2.4"/>
<installed facet="jst.java" version="1.8"/>
<installed facet="jst.web" version="3.1"/>
</faceted-project>
Почему Gradle не может работать правильно. Что сложного в построении динамического веб-проекта с выбранными фасетами?
Я обновил buildship
чтобы... http://download.eclipse.org/buildship/updates/e47/releases/2.x/2.2.1.v20180125-1441
даже с этим добавленным в мой gradle.build, он все еще не может правильно построить необходимый динамический веб-проект
eclipse {
wtp {
facet {
facet name: 'java', version: '1.8'
facet name: 'jst.web', version: '3.1'
facet name: 'wst.jsdt.web', version: '1.0'
}
}
}
Обнаружил, что этот неуклюжий взлом исправляет дубликаты версий jst.web
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
eclipse.wtp.facet {
file {
facet name: 'jst.web', version: '3.1'
def oldJstWebFacet = facets.findAll {
it.name == 'jst.web' && it.version == '2.4'
}
facets.removeAll(oldJstWebFacet)
facet name: 'java', version: '1.8'
facet name: 'jst.cdi', version: '2.0'
facet name: 'jst.jaxrs', version: '2.1'
facet name: 'wst.jsdt.web', version: '1.0'
}
}
repositories {
mavenCentral()
}
dependencies {
compile "javax.ws.rs:javax.ws.rs-api:2.0.1"
providedCompile "javax.servlet:javax.servlet-api:3.1.0"
}
Однако теперь у меня есть следующие два маркера ошибок затмения
CDI Core Validator cannot run on project Attempt0002 because Validation Builder precedes CDI (Contexts and Dependency Injection) Builder.
EL Validator cannot run on project Attempt0002 because Validation Builder precedes JBoss Knowledge Base Builder.
Я могу решить эту проблему, изменив порядок компоновки в затмении, однако, как только я строю свой проект с Gradle, проблема появляется снова.
1 ответ
Решение, которое я обнаружил, заключается в следующем:
Взломайте файл сборки Gradle следующим образом:
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
eclipse {
project {
buildCommands.clear();
buildCommand 'org.eclipse.jdt.core.javabuilder'
buildCommand 'org.eclipse.wst.common.project.facet.core.builder'
buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
buildCommand 'org.jboss.tools.jst.web.kb.kbbuilder'
buildCommand 'org.jboss.tools.cdi.core.cdibuilder'
buildCommand 'org.eclipse.wst.validation.validationbuilder'
}
wtp {
facet {
file {
facet name: 'jst.web', version: '3.1'
def oldJstWebFacet = facets.findAll {
it.name == 'jst.web' && it.version == '2.4'
}
facets.removeAll(oldJstWebFacet)
facet name: 'java', version: '1.8'
facet name: 'jst.cdi', version: '2.0'
facet name: 'jst.jaxrs', version: '2.1'
facet name: 'wst.jsdt.web', version: '1.0'
}
}
}
}
repositories {
mavenCentral()
}
dependencies {
compile "javax.ws.rs:javax.ws.rs-api:2.0.1"
providedCompile "javax.servlet:javax.servlet-api:3.1.0"
}
"Ускорение производительности труда разработчиков" действительно????????
Я склонен согласиться, Gradle должен работать как нативная сборка Ant. Даже в Netbeans я могу создать проект Gradle, он отлично работает. Но не смейте обновлять что-либо, связанное с Gradle или Groovy, у вас будет проваленный проект. Ant работал на меня годами, мне никогда не приходилось читать ни одного слова документации, просто он выполняет свою работу правильно.