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

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

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

我选择的方面是

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

单击“应用并关闭”后,项目就没有报告任何构建问题。

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

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

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

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

cdi 2.0
jax-rs 2.1

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

除此之外,我还有以下两个标记

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 不能正常工作。使用选定的方面构建动态 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" 
}

但是现在我有以下两个 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 构建项目,问题就会再次出现。

最佳答案

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

按如下方式破解 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" 
}

“提高开发人员生产力”真的?????????

关于eclipse - 如何将 Java Gradle 项目转换为 Dynamic Web 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48828869/

相关文章:

c - Eclipse 编辑器中多行 C/C++ 宏的快捷方式

linux - 无法加载 JavaHL 库。- linux/eclipse

eclipse - 如何在Eclipse中最小化代码区域?

java - RESTEasy 404 未找到

git - grgit:在build.gradle脚本中添加标签并将文件推送到远程分支

java - 从异步调用返回一个值到 run 方法

java - JAX-RS 使用 Map<String, Object> 作为 JSON 请求的一部分

java - Java 类 java.util.ArrayList 的消息体编写器

java - 构建多文物以进行Vaadin应用[Gradle]

android - Gradle 插件 : How to convert all images (resources) before APK is packed