【发布时间】: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 构建我的项目,问题就会再次出现。
【问题讨论】:
标签: eclipse jax-rs build.gradle gradle-eclipse