如何将 Java Gradle 项目转换为动态 Web 项目?

How to convert Java Gradle project to Dynamic Web Project?

我正在关注这篇文章

https://www.linkedin.com/pulse/building-jax-rs-project-eclipse-gradle-neeraj-malhotra

关于如何使用 Gradle

在 Eclipse 中构建 JAX-RS 项目

我正在使用

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" 
}

我可以 select 所需的 Facets 并设置目标运行时等。

我 select 的方面是

cdi 2.0
dynamic web module 3.1
java 1.8
jax-rs 2.1

单击“应用并关闭”后,项目没有生成问题报告。

目前我不喜欢的是该项目有两个 WEB-INF 文件 一个在项目级别,另一个在我期望的 WebContent 文件夹中。

还有一个 web.xml 文件,尽管我特意没有 select 生成 web.xml 文件。

当我通过右键单击 gradle.build 文件并 selecting gradle > 刷新 gradle 项目来刷新我的 gradle 构建时,真正的问题开始了.

刷新完成后,以下方面已删除selected

cdi 2.0
jax-rs 2.1

我的动态 Web 模块已从 3.1 降级到 2.4

除此之外我还有以下两个MARKERS

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.

如何配置我的动态 Web 项目以使其保持所需的 Facet 级别?

我的 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()))
                                );
                            }
                        });
                    }

                });

这会导致在 org.eclipse.wst.common.project.facet.core.xml

中出现重复的 jst.web 个条目
<?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 无法正常工作。使用 selected 构面构建动态 Web 项目有什么困难?

我已将 buildship 升级到... http://download.eclipse.org/buildship/updates/e47/releases/2.x/2.2.1.v20180125-1441

即使将此添加到我的 gradle.build 它仍然无法正确构建所需的动态 Web 项目

eclipse {
            wtp {
                facet {
                    facet name: 'java', version: '1.8'
                    facet name: 'jst.web', version: '3.1'
                    facet name: 'wst.jsdt.web', version: '1.0'
                }
            } 
        } 

发现这个笨拙的 hack 修复了重复的 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" 
}

但是现在我有以下两个 eclipse 错误标记

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.

我可以通过修改 eclipse 中的构建器顺序来解决这个问题,但是一旦我使用 Gradle 构建我的项目,问题就会再次出现。

我发现的解决方案如下:-

HACK 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" 
}

"Accelerate developer productivity"真的????????