如何将Java Gradle项目转换为Dynamic Web Project?
我正在关注这篇文章
https://www.linkedin .com/pulse/building-jax-rs-project-eclipse-gradle-neeraj-malhotra
关于如何使用Gradle在Eclipse中构建JAX-RS项目
On how to build a JAX-RS project in Eclipse with Gradle
我正在使用
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构建文件
my gradle build file
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"
}
我可以选择所需的方面,并设置目标运行时等.
I can select the required Facets and set target runtimes etc fine.
我选择的方面是
cdi 2.0
dynamic web module 3.1
java 1.8
jax-rs 2.1
一旦我点击应用&关闭该项目,没有任何构建问题的报告.
Once I have click on Apply & Close the project has no build issues reported.
我现在不喜欢该项目有两个WEB-INF文件 一个在项目级别,另一个在我期望的WebContent文件夹中.
What I don't like at this point is that the project has two WEB-INF files one is at the project level, the other is within the WebContent folder where I would expect it.
即使我没有特别选择不生成web.xml,也存在一个web.xml文件.
There is also a web.xml file even though I specifically didn't select to have a web.xml generated.
当我通过右键单击gradle.build文件并选择gradle>更新gradle项目来刷新gradle构建时,真正的问题就开始了.
The real issues start when I refresh my gradle build by right clicking on the gradle.build file and selecting gradle > refresh gradle project.
刷新完成后,以下方面已取消选择
When the refresh is complete the following facets have been deselected
cdi 2.0
jax-rs 2.1
并且我的动态Web模块已从3.1降级为2.4
and my Dynamic Web Module has been downgraded to 2.4 from 3.1
除此之外,我还有以下两个标记
In addition to this I have the following two 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项目,以使其保持所需的构面不变?
How can I configure my Dynamic Web Project so that it keeps my desired Facets at the level?
我的gradle.build缺少什么?
What is my gradle.build missing?
更新
所以我在Gradle中找到了罪魁祸首
So I've tracked down the culprit in 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
<?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项目有什么困难?
Why cant Gradle work correctly. Whats hard about building a Dynamic Web Project with the selected facets?
我已将buildship
升级到...
http://download.eclipse. org/buildship/updates/e47/releases/2.x/2.2.1.v20180125-1441
I have upgraded buildship
to...
http://download.eclipse.org/buildship/updates/e47/releases/2.x/2.2.1.v20180125-1441
即使将此添加到我的gradle.build中,它仍然无法正确构建所需的动态Web项目
even with this added to my gradle.build it still cannot build the required dynamic web project correctly
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版本
Found that this clunky hack fixes the duplicate jst.web versions
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"
}
但是现在我有以下两个月食错误标记
however now I have the following two eclipse error markers
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构建项目时,该问题就会再次出现.
I can resolve this issue by amending the builder order within eclipse, however as soon as I build my project with Gradle the issue reappears.
我发现的解决方案如下:-
The solution I discovered is as follows:-
破解gradle构建文件,如下所示:-
HACK the gradle build file as follows:-
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" really ????????