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

Posted

技术标签:

【中文标题】如何将 Java Gradle 项目转换为动态 Web 项目?【英文标题】:How to convert Java Gradle project to Dynamic Web Project? 【发布时间】:2018-07-27 11:40:40 【问题描述】:

我正在关注这篇文章

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" 

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

我选择的方面是

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 > refresh gradle project 刷新我的 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'
                
             
         

发现这个笨拙的 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" 

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

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 构建我的项目,问题就会再次出现。

【问题讨论】:

【参考方案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" 

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

【讨论】:

以上是关于如何将 Java Gradle 项目转换为动态 Web 项目?的主要内容,如果未能解决你的问题,请参考以下文章

将Java项目从maven迁移到gradle

如何将Gradle工程转换为eclipse工程

在 Intellij 中将 Java 项目转换为 Gradle 项目

如何将 AAR 转换为 JAR

如何将 Maven 构建转换为 Gradle?

如何将 gradle 中的 groovy 任务转换为 Gradle Kotlin DSL 以生成 pom.xml?