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

Hec*_*tor 5 eclipse jax-rs gradle-eclipse build.gradle

我正在关注这篇文章

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
Run Code Online (Sandbox Code Playgroud)

我的目标运行时是

WildFly Full 11.0.0.Final (WildFly Core 3.0.8.Final)
Run Code Online (Sandbox Code Playgroud)

我的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" 
}
Run Code Online (Sandbox Code Playgroud)

我可以选择所需的Facets并设置目标运行时等.

我选择的方面是

cdi 2.0
dynamic web module 3.1
java 1.8
jax-rs 2.1
Run Code Online (Sandbox Code Playgroud)

点击"应用并关闭"后,项目没有报告构建问题.

我现在不喜欢的是项目有两个WEB-INF文件,一个是项目级别,另一个是WebContent文件夹,我期望它.

即使我没有选择生成web.xml,也有一个web.xml文件.

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

刷新完成后,已取消选择以下构面

cdi 2.0
jax-rs 2.1
Run Code Online (Sandbox Code Playgroud)

我的动态网络模块已从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.
Run Code Online (Sandbox Code Playgroud)

如何配置我的动态Web项目,以便将我想要的Facets保持在关卡中?

什么是我的gradle.build缺少?

UPDATE

所以我追踪了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()))
                                );
                            }
                        });
                    }

                });
Run Code Online (Sandbox Code Playgroud)

这导致重复的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>
Run Code Online (Sandbox Code Playgroud)

为什么Gradle无法正常工作.有关使用所选方面构建动态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'
                }
            } 
        } 
Run Code Online (Sandbox Code Playgroud)

发现这个笨重的黑客修复了重复的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" 
}
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

我可以通过在eclipse中修改构建器顺序来解决此问题,但是一旦我使用Gradle构建项目,问题就会重新出现.

Hec*_*tor 5

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

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" 
}
Run Code Online (Sandbox Code Playgroud)

“加速开发者生产力”真的吗???????