如何将Java Gradle项目转换为Dynamic Web Project?

时间:2018-02-16 14:27:13

标签: eclipse jax-rs build.gradle gradle-eclipse

我正在关注这篇文章

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

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

我选择的Facets是

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

点击Apply&关闭项目没有报告构建问题。

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

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

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

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

cdi 2.0
jax-rs 2.1

我的动态网络模块已从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项目,以便将我想要的Facets保持在关卡状态?

我的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无法正常工作。有关使用所选方面构建动态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'
                }
            } 
        } 

发现这个笨重的黑客修复了重复的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.

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

2 个答案:

答案 0 :(得分:1)

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

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

&#34;提高开发人员的工作效率&#34;真的?????????

答案 1 :(得分:-1)

我倾向于同意,Gradle需要像原生版本Ant一样工作。即使在Netbeans中,我也可以创建一个Gradle项目,运行完美。但是,不敢更新涉及Gradle或Groovy的任何东西,您将有一个烂掉的项目。蚂蚁已经为我工作了多年,我从来没有读过文档中的任何一个单词,这确实是对的。