parent
2df08bdfbd
commit
b8f408ed5f
14
build.gradle
14
build.gradle
|
@ -753,18 +753,18 @@ configure(rootProject) {
|
|||
apply plugin: "docbook-reference"
|
||||
apply plugin: "groovy"
|
||||
apply from: "${gradleScriptDir}/jdiff.gradle"
|
||||
apply plugin: org.springframework.build.gradle.SplitPackageDetectorPlugin
|
||||
apply plugin: org.springframework.build.gradle.SplitPackageDetectorPlugin
|
||||
|
||||
reference {
|
||||
reference {
|
||||
sourceDir = file("src/reference/docbook")
|
||||
pdfFilename = "spring-framework-reference.pdf"
|
||||
}
|
||||
|
||||
diagnoseSplitPackages {
|
||||
projectsToScan = project.subprojects - project(":spring-instrument-tomcat") // SPR-10150
|
||||
}
|
||||
diagnoseSplitPackages {
|
||||
projectsToScan = project.subprojects - project(":spring-instrument-tomcat") // SPR-10150
|
||||
}
|
||||
|
||||
// don"t publish the default jar for the root project
|
||||
// don"t publish the default jar for the root project
|
||||
configurations.archives.artifacts.clear()
|
||||
|
||||
dependencies { // for integration tests
|
||||
|
@ -788,7 +788,7 @@ configure(rootProject) {
|
|||
testCompile("hsqldb:hsqldb:${hsqldbVersion}")
|
||||
}
|
||||
|
||||
check.dependsOn diagnoseSplitPackages
|
||||
check.dependsOn diagnoseSplitPackages
|
||||
|
||||
task api(type: Javadoc) {
|
||||
group = "Documentation"
|
||||
|
|
|
@ -31,101 +31,101 @@ import org.gradle.plugins.ide.eclipse.model.EclipseClasspath
|
|||
import org.gradle.plugins.ide.idea.IdeaPlugin
|
||||
|
||||
class SplitPackageDetectorPlugin implements Plugin<Project> {
|
||||
public void apply(Project project) {
|
||||
Task diagnoseSplitPackages = project.tasks.add('diagnoseSplitPackages', SplitPackageDetectorTask.class)
|
||||
diagnoseSplitPackages.setDescription('Detects packages which will be split across JARs')
|
||||
}
|
||||
public void apply(Project project) {
|
||||
Task diagnoseSplitPackages = project.tasks.add('diagnoseSplitPackages', SplitPackageDetectorTask.class)
|
||||
diagnoseSplitPackages.setDescription('Detects packages which will be split across JARs')
|
||||
}
|
||||
}
|
||||
|
||||
public class SplitPackageDetectorTask extends DefaultTask {
|
||||
@Input
|
||||
Set<Project> projectsToScan
|
||||
@Input
|
||||
Set<Project> projectsToScan
|
||||
|
||||
@TaskAction
|
||||
public final void diagnoseSplitPackages() {
|
||||
def Map<Project, Project> mergeMap = [:]
|
||||
def projects = projectsToScan.findAll { it.plugins.findPlugin(org.springframework.build.gradle.MergePlugin) }.findAll { it.merge.into }
|
||||
projects.each { p ->
|
||||
mergeMap.put(p, p.merge.into)
|
||||
}
|
||||
def splitFound = new org.springframework.build.gradle.SplitPackageDetector(projectsToScan, mergeMap, project.logger).diagnoseSplitPackages();
|
||||
assert !splitFound // see error log messages for details of split packages
|
||||
}
|
||||
@TaskAction
|
||||
public final void diagnoseSplitPackages() {
|
||||
def Map<Project, Project> mergeMap = [:]
|
||||
def projects = projectsToScan.findAll { it.plugins.findPlugin(org.springframework.build.gradle.MergePlugin) }.findAll { it.merge.into }
|
||||
projects.each { p ->
|
||||
mergeMap.put(p, p.merge.into)
|
||||
}
|
||||
def splitFound = new org.springframework.build.gradle.SplitPackageDetector(projectsToScan, mergeMap, project.logger).diagnoseSplitPackages();
|
||||
assert !splitFound // see error log messages for details of split packages
|
||||
}
|
||||
}
|
||||
|
||||
class SplitPackageDetector {
|
||||
|
||||
private static final String HIDDEN_DIRECTORY_PREFIX = "."
|
||||
private static final String HIDDEN_DIRECTORY_PREFIX = "."
|
||||
|
||||
private static final String JAVA_FILE_SUFFIX = ".java"
|
||||
private static final String JAVA_FILE_SUFFIX = ".java"
|
||||
|
||||
private static final String SRC_MAIN_JAVA = "src" + File.separator + "main" + File.separator + "java"
|
||||
private static final String SRC_MAIN_JAVA = "src" + File.separator + "main" + File.separator + "java"
|
||||
|
||||
private static final String PACKAGE_SEPARATOR = "."
|
||||
private static final String PACKAGE_SEPARATOR = "."
|
||||
|
||||
private final Map<Project, Project> mergeMap
|
||||
private final Map<Project, Project> mergeMap
|
||||
|
||||
private final Map<Project, Set<String>> pkgMap = [:]
|
||||
private final Map<Project, Set<String>> pkgMap = [:]
|
||||
|
||||
private final logger
|
||||
private final logger
|
||||
|
||||
SplitPackageDetector(projectsToScan, mergeMap, logger) {
|
||||
this.mergeMap = mergeMap
|
||||
this.logger = logger
|
||||
projectsToScan.each { Project p ->
|
||||
def dir = p.projectDir
|
||||
def packages = getPackagesInDirectory(dir)
|
||||
if (!packages.isEmpty()) {
|
||||
pkgMap.put(p, packages)
|
||||
}
|
||||
}
|
||||
}
|
||||
SplitPackageDetector(projectsToScan, mergeMap, logger) {
|
||||
this.mergeMap = mergeMap
|
||||
this.logger = logger
|
||||
projectsToScan.each { Project p ->
|
||||
def dir = p.projectDir
|
||||
def packages = getPackagesInDirectory(dir)
|
||||
if (!packages.isEmpty()) {
|
||||
pkgMap.put(p, packages)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private File[] dirList(String dir) {
|
||||
dirList(new File(dir))
|
||||
}
|
||||
private File[] dirList(String dir) {
|
||||
dirList(new File(dir))
|
||||
}
|
||||
|
||||
private File[] dirList(File dir) {
|
||||
dir.listFiles({ file -> file.isDirectory() && !file.getName().startsWith(HIDDEN_DIRECTORY_PREFIX) } as FileFilter)
|
||||
}
|
||||
private File[] dirList(File dir) {
|
||||
dir.listFiles({ file -> file.isDirectory() && !file.getName().startsWith(HIDDEN_DIRECTORY_PREFIX) } as FileFilter)
|
||||
}
|
||||
|
||||
private Set<String> getPackagesInDirectory(File dir) {
|
||||
def pkgs = new HashSet<String>()
|
||||
addPackagesInDirectory(pkgs, new File(dir, SRC_MAIN_JAVA), "")
|
||||
return pkgs;
|
||||
}
|
||||
private Set<String> getPackagesInDirectory(File dir) {
|
||||
def pkgs = new HashSet<String>()
|
||||
addPackagesInDirectory(pkgs, new File(dir, SRC_MAIN_JAVA), "")
|
||||
return pkgs;
|
||||
}
|
||||
|
||||
boolean diagnoseSplitPackages() {
|
||||
def splitFound = false;
|
||||
def projs = pkgMap.keySet().toArray()
|
||||
def numProjects = projs.length
|
||||
for (int i = 0; i < numProjects - 1; i++) {
|
||||
for (int j = i + 1; j < numProjects - 1; j++) {
|
||||
def pi = projs[i]
|
||||
def pkgi = new HashSet(pkgMap.get(pi))
|
||||
def pj = projs[j]
|
||||
def pkgj = pkgMap.get(pj)
|
||||
pkgi.retainAll(pkgj)
|
||||
if (!pkgi.isEmpty() && mergeMap.get(pi) != pj && mergeMap.get(pj) != pi) {
|
||||
pkgi.each { pkg ->
|
||||
def readablePkg = pkg.substring(1).replaceAll(File.separator, PACKAGE_SEPARATOR)
|
||||
logger.error("Package '$readablePkg' is split between $pi and $pj")
|
||||
}
|
||||
splitFound = true
|
||||
}
|
||||
}
|
||||
}
|
||||
return splitFound
|
||||
}
|
||||
boolean diagnoseSplitPackages() {
|
||||
def splitFound = false;
|
||||
def projs = pkgMap.keySet().toArray()
|
||||
def numProjects = projs.length
|
||||
for (int i = 0; i < numProjects - 1; i++) {
|
||||
for (int j = i + 1; j < numProjects - 1; j++) {
|
||||
def pi = projs[i]
|
||||
def pkgi = new HashSet(pkgMap.get(pi))
|
||||
def pj = projs[j]
|
||||
def pkgj = pkgMap.get(pj)
|
||||
pkgi.retainAll(pkgj)
|
||||
if (!pkgi.isEmpty() && mergeMap.get(pi) != pj && mergeMap.get(pj) != pi) {
|
||||
pkgi.each { pkg ->
|
||||
def readablePkg = pkg.substring(1).replaceAll(File.separator, PACKAGE_SEPARATOR)
|
||||
logger.error("Package '$readablePkg' is split between $pi and $pj")
|
||||
}
|
||||
splitFound = true
|
||||
}
|
||||
}
|
||||
}
|
||||
return splitFound
|
||||
}
|
||||
|
||||
private void addPackagesInDirectory(HashSet<String> packages, File dir, String pkg) {
|
||||
def scanDir = new File(dir, pkg)
|
||||
def File[] javaFiles = scanDir.listFiles({ file -> !file.isDirectory() && file.getName().endsWith(JAVA_FILE_SUFFIX) } as FileFilter)
|
||||
if (javaFiles != null && javaFiles.length != 0) {
|
||||
packages.add(pkg)
|
||||
}
|
||||
dirList(scanDir).each { File subDir ->
|
||||
addPackagesInDirectory(packages, dir, pkg + File.separator + subDir.getName())
|
||||
}
|
||||
}
|
||||
}
|
||||
private void addPackagesInDirectory(HashSet<String> packages, File dir, String pkg) {
|
||||
def scanDir = new File(dir, pkg)
|
||||
def File[] javaFiles = scanDir.listFiles({ file -> !file.isDirectory() && file.getName().endsWith(JAVA_FILE_SUFFIX) } as FileFilter)
|
||||
if (javaFiles != null && javaFiles.length != 0) {
|
||||
packages.add(pkg)
|
||||
}
|
||||
dirList(scanDir).each { File subDir ->
|
||||
addPackagesInDirectory(packages, dir, pkg + File.separator + subDir.getName())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue