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