This commit is a backport of SPR-11836. Prior to this commit, the ordering of classpath entries in the generated Eclipse .classpath files did not align with the intended dependency management configured in the Gradle build. Specifically, project dependencies often came before dependencies on third-party libraries required for the given project, causing the project not to compile in Eclipse. This commit fixes this issue by introducing new functionality in the ide.gradle script that moves all project dependencies to the end of the generated classpath. Issue: SPR-12947, SPR-11836
111 lines
3.7 KiB
Groovy
111 lines
3.7 KiB
Groovy
import org.gradle.plugins.ide.eclipse.model.ProjectDependency
|
|
import org.gradle.plugins.ide.eclipse.model.SourceFolder
|
|
|
|
|
|
apply plugin: "propdeps-eclipse"
|
|
apply plugin: "propdeps-idea"
|
|
|
|
// Replace classpath entries with project dependencies (GRADLE-1116)
|
|
eclipse.classpath.file.whenMerged { classpath ->
|
|
def regexp = /.*?\/([^\/]+)\/build\/[^\/]+\/(?:main|test)/ // only match those that end in main or test (avoids removing necessary entries like build/classes/jaxb)
|
|
def projectOutputDependencies = classpath.entries.findAll { entry -> entry.path =~ regexp }
|
|
projectOutputDependencies.each { entry ->
|
|
def matcher = (entry.path =~ regexp)
|
|
if(matcher) {
|
|
def projectName = matcher[0][1]
|
|
def path = "/${projectName}"
|
|
if(!classpath.entries.find { e -> e instanceof ProjectDependency && e.path == path }) {
|
|
def dependency = new ProjectDependency(path, project(":${projectName}").path)
|
|
dependency.exported = true
|
|
classpath.entries.add(dependency)
|
|
}
|
|
classpath.entries.remove(entry)
|
|
}
|
|
}
|
|
classpath.entries.removeAll { entry -> (entry.path =~ /(?!.*?repack.*\.jar).*?\/([^\/]+)\/build\/libs\/[^\/]+\.jar/) }
|
|
}
|
|
|
|
|
|
// Use separate main/test outputs (prevents WTP from packaging test classes)
|
|
eclipse.classpath.defaultOutputDir = file(project.name+"/bin/eclipse")
|
|
eclipse.classpath.file.beforeMerged { classpath ->
|
|
classpath.entries.findAll{ it instanceof SourceFolder }.each {
|
|
if(it.output.startsWith("bin/")) {
|
|
it.output = null
|
|
}
|
|
}
|
|
}
|
|
eclipse.classpath.file.whenMerged { classpath ->
|
|
classpath.entries.findAll{ it instanceof SourceFolder }.each {
|
|
it.output = "bin/" + it.path.split("/")[1]
|
|
}
|
|
}
|
|
|
|
// Ensure project dependencies come after 3rd-party libs (SPR-11836)
|
|
// https://jira.spring.io/browse/SPR-11836
|
|
eclipse.classpath.file.whenMerged { classpath ->
|
|
classpath.entries.findAll { it instanceof ProjectDependency }.each {
|
|
// delete from original position
|
|
classpath.entries.remove(it)
|
|
// append to end of classpath
|
|
classpath.entries.add(it)
|
|
}
|
|
}
|
|
|
|
// Allow projects to be used as WPT modules
|
|
eclipse.project.natures "org.eclipse.wst.common.project.facet.core.nature"
|
|
|
|
|
|
// Include project specific settings
|
|
task eclipseSettings(type: Copy) {
|
|
from rootProject.files(
|
|
"src/eclipse/org.eclipse.jdt.ui.prefs",
|
|
"src/eclipse/org.eclipse.wst.common.project.facet.core.xml")
|
|
into project.file('.settings/')
|
|
outputs.upToDateWhen { false }
|
|
}
|
|
|
|
task eclipseWstComponent(type: Copy) {
|
|
from rootProject.files(
|
|
"src/eclipse/org.eclipse.wst.common.component")
|
|
into project.file('.settings/')
|
|
expand(deployname: project.name)
|
|
outputs.upToDateWhen { false }
|
|
}
|
|
|
|
task eclipseJdtPrepare(type: Copy) {
|
|
from rootProject.file("src/eclipse/org.eclipse.jdt.core.prefs")
|
|
into project.file(".settings/")
|
|
outputs.upToDateWhen { false }
|
|
}
|
|
|
|
task cleanEclipseJdtUi(type: Delete) {
|
|
delete project.file(".settings/org.eclipse.jdt.ui.prefs")
|
|
delete project.file("org.eclipse.jdt.core.prefs")
|
|
delete project.file(".settings/org.eclipse.wst.common.component")
|
|
delete project.file(".settings/org.eclipse.wst.common.project.facet.core.xml")
|
|
}
|
|
|
|
tasks["eclipseJdt"].dependsOn(eclipseJdtPrepare)
|
|
tasks["cleanEclipse"].dependsOn(cleanEclipseJdtUi)
|
|
tasks["eclipse"].dependsOn(eclipseSettings, eclipseWstComponent)
|
|
|
|
|
|
// Filter 'build' folder
|
|
|
|
eclipse.project.file.withXml {
|
|
def node = it.asNode()
|
|
|
|
def filteredResources = node.get("filteredResources")
|
|
if(filteredResources) {
|
|
node.remove(filteredResources)
|
|
}
|
|
def filterNode = node.appendNode("filteredResources").appendNode("filter")
|
|
filterNode.appendNode("id", "1359048889071")
|
|
filterNode.appendNode("name", "")
|
|
filterNode.appendNode("type", "30")
|
|
def matcherNode = filterNode.appendNode("matcher")
|
|
matcherNode.appendNode("id", "org.eclipse.ui.ide.multiFilter")
|
|
matcherNode.appendNode("arguments", "1.0-projectRelativePath-matches-false-false-build")
|
|
}
|