Buildship继续覆盖.classpath

时间:2018-03-02 12:09:40

标签: eclipse gradle buildship eclipse-classpath

我正在使用Gradle和Eclipse以及Buildship插件。

Buildship为Eclipse创建.classpath文件以供使用。出于类加载的原因,我需要在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,但这并没有改变任何内容。

这是Graship在Buildship启动时的输出(例如,点击Gradle - &gt;刷新Eclipse项目的属性):

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以表达我希望让类路径按照我的方式排序的愿望?

2 个答案:

答案 0 :(得分:1)

我找到了solution on Gradle forums

Buildship不使用eclipseClasspath任务,但会读取配置并通过自己的方式创建.classpath。 Gradle类路径附加到类路径的末尾(如果尚未定义)。执行whenMerged部分后会发生这种情况。所以解决方案是手动添加Gradle类路径:

eclipse {
   classpath {
        containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
   }
}

答案 1 :(得分:0)

也许withXml挂钩的工作方式不同

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)
    }
}