3

我将 Gradle 和 Eclipse 与 Buildship 插件一起使用。

Buildship 创建.classpath文件供 Eclipse 使用。出于类加载的原因,我需要一个类路径条目 ( com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER) 出现在条目之后。org.eclipse.buildship.core.gradleclasspathcontainer

所以我的文件的相关部分.classpath应该是这样GWT_CONTAINER的(底部有)。

<classpath>
 <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
 <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer" />
 <classpathentry kind="con" path="com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER"/>
</classpath>

Buildship 始终gradleclasspathcontainer处于最后一个位置。所以我试图在我的build.gradle(摘录)中改变这样的排序:

eclipse {
    classpath { 
        file {
            beforeMerged { classpath ->
                def gwtClasspath = classpath.entries.find { entry -> entry.path == 'com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER' }
                classpath.entries.remove gwtClasspath
                classpath.entries << gwtClasspath
            }
        }
    }

使用./gradlew eclipseClasspath时,.classpath文件被正确创建。但是一旦 Buildship 运行,文件就会再次被错误的顺序覆盖。

我也尝试过使用whenMerged而不是beforeMerged,但这并没有改变任何东西。

这是由 Buildship 启动时 Gradle 的输出(例如,通过单击 Eclipse 项目属性上的 Gradle -> Refresh):

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.5/userguide/command_line_interface.html#sec:command_line_warnings

CONFIGURE SUCCESSFUL in 0s
:cleanEclipseWtpComponent
:cleanEclipseWtpFacet
:cleanEclipseWtp
:eclipseWtpComponent
:eclipseWtpFacet
:eclipseWtp

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.5/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 0s
4 actionable tasks: 4 executed

似乎 Buildship 甚至不执行eclipseClasspath任务,而是.classpath通过其他方式创建文件。

我怎样才能让 Buildship 兑现我的愿望,让类路径按我的方式排序?

4

2 回答 2

2

在 Gradle 论坛上找到了解决方案

Buildship 不使用eclipseClasspath任务,而是读取配置并.classpath通过自己的方式创建。如果尚未定义 Gradle 类路径,则将其附加到类路径的末尾。这发生在执行该whenMerged部分之后。所以解决方法是手动添加 Gradle 类路径:

eclipse {
   classpath {
        containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
   }
}
于 2018-03-19T17:55:54.523 回答
0

Perhaps the withXml hook would work differently

eclipse.classpath.file {
    withXml { provider ->
        def entry = provider.asNode().classpath.classpathentry.find { it.path == 'com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER' }
        println "Found $entry"
        def parent = entry.parent()
        parent.remove(entry)
        parent.append(entry)
    }
}
于 2018-03-02T13:26:30.857 回答