Buildship 不断覆盖 .classpath
Buildship keeps overwriting .classpath
我正在使用 Gradle 和带有 Buildship 插件的 Eclipse。
Buildship 创建供 Eclipse 使用的 .classpath
文件。出于 class 加载原因,我需要一个 class 路径条目 (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 的输出(例如,通过单击 Gradle -> 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 实现我的愿望,让 class 路径按照我的方式排序?
也许 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)
}
}
我找到了 solution on Gradle forums:
Buildship 不使用 eclipseClasspath
任务,而是读取配置并通过自己的方式创建 .classpath
。 Gradle 类路径附加到类路径的末尾(如果尚未定义)。这发生在执行 whenMerged
部分之后。所以解决方案是手动添加 Gradle 类路径:
eclipse {
classpath {
containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
}
}
我正在使用 Gradle 和带有 Buildship 插件的 Eclipse。
Buildship 创建供 Eclipse 使用的 .classpath
文件。出于 class 加载原因,我需要一个 class 路径条目 (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 的输出(例如,通过单击 Gradle -> 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 实现我的愿望,让 class 路径按照我的方式排序?
也许 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)
}
}
我找到了 solution on Gradle forums:
Buildship 不使用 eclipseClasspath
任务,而是读取配置并通过自己的方式创建 .classpath
。 Gradle 类路径附加到类路径的末尾(如果尚未定义)。这发生在执行 whenMerged
部分之后。所以解决方案是手动添加 Gradle 类路径:
eclipse {
classpath {
containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
}
}