diff --git a/build.gradle b/build.gradle index a86e153a6..0ea41c7d4 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,6 @@ import org.ajoberstar.grgit.Grgit buildscript { repositories { - mavenLocal() mavenCentral() maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } jcenter() @@ -10,8 +9,6 @@ buildscript { configurations.all { resolutionStrategy { - force 'com.google.guava:guava:21.0' - force 'org.ow2.asm:asm:6.0_BETA' force 'commons-io:commons-io:2.4' } } @@ -27,12 +24,19 @@ plugins { id "org.ajoberstar.grgit" version "3.1.1" } -apply plugin: 'java' +println """ +******************************************* + You are building WorldEdit! -def splashFile = new File('splash.txt') -if (splashFile.exists()) { - print splashFile.text -} + If you encounter trouble: + 1) Read COMPILING.md if you haven't yet + 2) Try running 'build' in a separate Gradle run + 3) Use gradlew and not gradle + 4) If you still need help, ask on Discord! https://discord.gg/ngZCzbU + + Output files will be in /target +******************************************* +""" group = 'com.boydti.fawe' @@ -61,39 +65,56 @@ version = String.format("%s.%s", rootVersion, buildNumber) description = rootProject.name subprojects { + repositories { + mavenCentral() + maven { url "http://maven.sk89q.com/repo/" } + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + maven { url "http://repo.maven.apache.org/maven2" } + // Fawe + maven { url "https://mvnrepository.com/artifact/" } + maven { url "http://repo.dmulloy2.net/content/groups/public/" } + maven { url "https://repo.destroystokyo.com/repository/maven-public//" } + maven { url "http://ci.athion.net/job/PlotSquared-Breaking/ws/mvn/" } + maven { url "https://libraries.minecraft.net" } + mavenLocal() + maven { url "http://empcraft.com/maven2" } + maven { url "https://hub.spigotmc.org/nexus/content/groups/public/" } + maven { url "http://ci.frostcast.net/plugin/repository/everything" } + maven { url "http://maven.sk89q.com/artifactory/repo" } + maven { url "http://repo.spongepowered.org/maven" } + maven { url "http://dl.bintray.com/tastybento/maven-repo" } + maven { url "http://ci.emc.gs/nexus/content/groups/aikar/" } + } + configurations.all { + resolutionStrategy { + cacheChangingModulesFor 5, 'minutes' + } + } +} + +configure(['worldedit-core', 'worldedit-bukkit', 'favs'].collect { project("$it") }) { apply plugin: 'java' apply plugin: 'maven' +// apply plugin: 'checkstyle' apply plugin: 'com.github.johnrengelman.shadow' - //Enable this requires putting license header files in many, many FAWE files - //apply plugin: 'net.minecrell.licenser' +// Enable this requires putting license header files in many, many FAWE files +// apply plugin: 'net.minecrell.licenser' sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 +// checkstyle.configFile = new File(rootProject.projectDir, "config/checkstyle/checkstyle.xml") +// checkstyle.toolVersion = '7.6.1' + clean.doFirst { delete "../target" } - compileJava { options.compilerArgs += ["-parameters"] } - - repositories { - mavenCentral() - maven { url "http://maven.sk89q.com/repo/" } - maven { url "http://repo.maven.apache.org/maven2" } - // Fawe - maven {url "https://mvnrepository.com/artifact/"} - maven {url "http://repo.dmulloy2.net/content/groups/public/"} - maven {url "https://repo.destroystokyo.com/repository/maven-public//"} - maven {url "http://ci.athion.net/job/PlotSquared-Breaking/ws/mvn/"} - maven { url "https://libraries.minecraft.net" } - mavenLocal() - maven {url "http://empcraft.com/maven2"} - maven {url "https://hub.spigotmc.org/nexus/content/groups/public/"} - maven {url "http://ci.frostcast.net/plugin/repository/everything"} - maven {url "http://maven.sk89q.com/artifactory/repo"} - maven {url "http://repo.spongepowered.org/maven"} - maven {url "http://dl.bintray.com/tastybento/maven-repo"} - maven {url "http://ci.emc.gs/nexus/content/groups/aikar/" } + if (JavaVersion.current().isJava8Compatible()) { + // Java 8 turns on doclint which we fail + tasks.withType(Javadoc) { + options.addStringOption('Xdoclint:none', '-quiet') + } } if (!(name.equals('worldedit-forge') || name.equals('worldedit-sponge'))) { @@ -108,46 +129,50 @@ subprojects { build.dependsOn(sourcesJar) } +// build.dependsOn(checkstyleMain) +// build.dependsOn(checkstyleTest) + dependencies { compileOnly 'org.jetbrains:annotations:17.0.0' } - shadowJar { - classifier 'dist' - dependencies { - include(dependency('com.sk89q:jchronic:0.2.4a')) - include(dependency('com.thoughtworks.paranamer:paranamer:2.6')) - include(dependency('com.sk89q.lib:jlibnoise:1.0.0')) - include(dependency('com.github.luben:zstd-jni:1.1.1')) - include(dependency('co.aikar:fastutil-lite:1.0')) - include(dependency('org.jetbrains:annotations:17.0.0')) + configure(['bukkit'].collect { project(":worldedit-$it") }) { + shadowJar { + classifier 'dist' + dependencies { + include(project(":worldedit-libs:core")) + include(project(":worldedit-libs:${project.name.replace("worldedit-", "")}")) + include(project(":worldedit-core")) + } + exclude 'GradleStart**' + exclude '.cache' + exclude 'LICENSE*' } - exclude 'GradleStart**' - exclude '.cache' - exclude 'LICENSE*' + + // Enable this requires putting license header files in many, many FAWE files + //license { + // header = rootProject.file("HEADER.txt") + // include '**/*.java' + //} } + task aggregatedJavadocs(type: Javadoc, description: 'Generate javadocs from all child projects as if it was a single project', group: 'Documentation') { + destinationDir = file("./docs/javadoc") + title = "$project.name $version API" + options.author true + options.links 'http://docs.spring.io/spring/docs/4.3.x/javadoc-api/', 'http://docs.oracle.com/javase/8/docs/api/', 'http://docs.spring.io/spring-ws/docs/2.3.0.RELEASE/api/', 'http://docs.spring.io/spring-security/site/docs/4.0.4.RELEASE/apidocs/' + options.addStringOption('Xdoclint:none', '-quiet') - // Enable this requires putting license header files in many, many FAWE files - //license { - // header = rootProject.file("HEADER.txt") - // include '**/*.java' - //} -} -task aggregatedJavadocs(type: Javadoc, description: 'Generate javadocs from all child projects as if it was a single project', group: 'Documentation') { - destinationDir = file("./docs/javadoc") - title = "$project.name $version API" - options.author true - options.links 'http://docs.spring.io/spring/docs/4.3.x/javadoc-api/', 'http://docs.oracle.com/javase/8/docs/api/', 'http://docs.spring.io/spring-ws/docs/2.3.0.RELEASE/api/', 'http://docs.spring.io/spring-security/site/docs/4.0.4.RELEASE/apidocs/' - options.addStringOption('Xdoclint:none', '-quiet') + delete "./docs" - delete "./docs" - - subprojects.each { proj -> - proj.tasks.withType(Javadoc).each { javadocTask -> - source += javadocTask.source - classpath += javadocTask.classpath - excludes += javadocTask.excludes - includes += javadocTask.includes + subprojects.each { proj -> + proj.tasks.withType(Javadoc).each { javadocTask -> + source += javadocTask.source + classpath += javadocTask.classpath + excludes += javadocTask.excludes + includes += javadocTask.includes + } } } + + } diff --git a/settings.gradle b/settings.gradle index 4c96db613..a9c7e611e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,11 @@ rootProject.name = 'FastAsyncWorldEdit' -include 'worldedit-core', 'worldedit-bukkit', 'favs' \ No newline at end of file +include 'worldedit-libs' + +['bukkit', 'core'].forEach { + include "worldedit-libs:$it" + include "worldedit-$it" +} +include "worldedit-libs:core:ap" + +include 'favs' diff --git a/worldedit-bukkit/build.gradle b/worldedit-bukkit/build.gradle index 3d5e99d23..fb0785413 100644 --- a/worldedit-bukkit/build.gradle +++ b/worldedit-bukkit/build.gradle @@ -1,21 +1,29 @@ apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'maven' +apply plugin: 'java-library' repositories { maven { url "https://hub.spigotmc.org/nexus/content/groups/public" } maven { url "https://repo.codemc.org/repository/maven-public" } - maven { url 'https://papermc.io/repo/repository/maven-public/' } + maven { url "https://papermc.io/repo/repository/maven-public/" } +} + +configurations.all { Configuration it -> + it.resolutionStrategy { ResolutionStrategy rs -> + rs.force("com.google.guava:guava:21.0") + } } dependencies { - compile project(':worldedit-core') - + api project(':worldedit-core') + api project(':worldedit-libs:bukkit') compile 'net.milkbowl.vault:VaultAPI:1.7' - compile 'com.sk89q:dummypermscompat:1.10' compile 'com.destroystokyo.paper:paper-api:1.13.2-R0.1-SNAPSHOT' + implementation 'io.papermc:paperlib:1.0.2' + compileOnly 'com.sk89q:dummypermscompat:1.10' compile 'org.spigotmc:spigot:1.13.2-R0.1-SNAPSHOT' - compile 'org.slf4j:slf4j-jdk14:1.7.26' + implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.1' testCompile 'org.mockito:mockito-core:1.9.0-rc1' compile 'com.massivecraft:factions:2.8.0' compile 'com.drtshock:factions:1.6.9.5' @@ -81,9 +89,13 @@ task copyFiles { shadowJar { dependencies { relocate "org.slf4j", "com.sk89q.worldedit.slf4j" + relocate "org.apache.logging.slf4j", "com.sk89q.worldedit.log4jbridge" include(dependency(':worldedit-core')) include(dependency('org.slf4j:slf4j-api')) - include(dependency("org.slf4j:slf4j-jdk14")) + include(dependency("org.apache.logging.log4j:log4j-slf4j-impl")) + relocate ("io.papermc.lib", "com.sk89q.worldedit.bukkit.paperlib") { + include(dependency("io.papermc:paperlib:1.0.2")) + } } archiveName = "${parent.name}-${project.name.replaceAll("worldedit-", "")}-${parent.version}.jar" destinationDir = file '../target' diff --git a/worldedit-core/build.gradle b/worldedit-core/build.gradle index 612041f71..a06223774 100644 --- a/worldedit-core/build.gradle +++ b/worldedit-core/build.gradle @@ -1,24 +1,38 @@ +apply plugin: 'java-library' apply plugin: 'eclipse' apply plugin: 'idea' repositories { maven {url "http://ci.athion.net/job/PlotSquared-Breaking/ws/mvn/"} } + +configurations.all { Configuration it -> + it.resolutionStrategy { ResolutionStrategy rs -> + rs.force("com.google.guava:guava:21.0") + } +} + dependencies { + compile project(':worldedit-libs:core') compile 'de.schlichtherle:truezip:6.8.3' compile 'rhino:js:1.7R2' + compile 'org.yaml:snakeyaml:1.23' compile 'com.google.guava:guava:21.0' - compile 'com.sk89q:jchronic:0.2.4a' compile 'com.google.code.findbugs:jsr305:1.3.9' compile 'com.thoughtworks.paranamer:paranamer:2.6' compile 'com.google.code.gson:gson:2.8.0' - compile 'com.sk89q.lib:jlibnoise:1.0.0' compile 'com.googlecode.json-simple:json-simple:1.1.1' compile 'org.slf4j:slf4j-api:1.7.26' + + compileOnly project(':worldedit-libs:core:ap') + annotationProcessor project(':worldedit-libs:core:ap') + annotationProcessor "com.google.guava:guava:21.0" + def avVersion = "1.6.5" + compileOnly "com.google.auto.value:auto-value-annotations:$avVersion" + annotationProcessor "com.google.auto.value:auto-value:$avVersion" //compile 'net.sf.trove4j:trove4j:3.0.3' testCompile 'org.mockito:mockito-core:1.9.0-rc1' // Fawe depends - compile 'org.yaml:snakeyaml:1.19' compile 'net.fabiozumbi12:redprotect:1.9.6' compile ("com.github.intellectualsites.plotsquared:PlotSquared-API:latest") { transitive = false @@ -28,6 +42,10 @@ dependencies { compile 'co.aikar:fastutil-lite:1.0' } +tasks.withType(JavaCompile).configureEach { + it.options.compilerArgs.add("-Aarg.name.key.prefix=") +} + sourceSets { main { java { diff --git a/worldedit-libs/build.gradle b/worldedit-libs/build.gradle new file mode 100644 index 000000000..7227c1772 --- /dev/null +++ b/worldedit-libs/build.gradle @@ -0,0 +1,143 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +/* + +This project shades API libraries, i.e. those libraries +whose classes are publicly referenced from `-core` classes. + +This project does not shade implementation libraries, i.e. +those libraries whose classes are internally depended on. + +This is because the main reason for shading those libraries is for +their internal usage in each platform, not because we need them available to +dependents of `-core` to compile and work with WorldEdit's API. + + */ +configure(subprojects + project("core:ap")) { + apply plugin: 'maven' + apply plugin: 'com.github.johnrengelman.shadow' + apply plugin: 'com.jfrog.artifactory' + configurations { + create("shade") + getByName("archives").extendsFrom(getByName("default")) + } + + group = rootProject.group + ".worldedit-libs" + + tasks.register("jar", ShadowJar) { + configurations = [project.configurations.shade] + classifier = "" + + dependencies { + exclude(dependency("com.google.guava:guava")) + exclude(dependency("com.google.code.gson:gson")) + exclude(dependency("org.checkerframework:checker-qual")) + } + + relocate('net.kyori.text', 'com.sk89q.worldedit.util.formatting.text') + } + def altConfigFiles = { String artifactType -> + def deps = configurations.shade.incoming.dependencies + .collect { it.copy() } + .collect { dependency -> + dependency.artifact { artifact -> + artifact.name = dependency.name + artifact.type = artifactType + artifact.extension = 'jar' + artifact.classifier = artifactType + } + dependency + } + + return files(configurations.detachedConfiguration(deps as Dependency[]) + .resolvedConfiguration.lenientConfiguration.getArtifacts() + .findAll { it.classifier == artifactType } + .collect { zipTree(it.file) }) + } + tasks.register("sourcesJar", Jar) { + from { + altConfigFiles('sources') + } + def filePattern = ~'(.*)net/kyori/text((?:/|$).*)' + def textPattern = ~/net\.kyori\.text/ + eachFile { + it.filter { String line -> + line.replaceFirst(textPattern, 'com.sk89q.worldedit.util.formatting.text') + } + it.path = it.path.replaceFirst(filePattern, '$1com/sk89q/worldedit/util/formatting/text$2') + } + classifier = "sources" + } + + artifacts { + add("default", jar) + add("archives", sourcesJar) + } + + tasks.register("install", Upload) { + configuration = configurations.archives + repositories.mavenInstaller { + pom.version = project.version + pom.artifactId = project.name + } + } + + artifactoryPublish { + publishConfigs('default') + } + + build.dependsOn(jar, sourcesJar) +} + +def textExtrasVersion = "3.0.2" +project("core") { + def textVersion = "3.0.1" + def pistonVersion = '0.4.1' + + dependencies { + shade "net.kyori:text-api:$textVersion" + shade "net.kyori:text-serializer-gson:$textVersion" + shade "net.kyori:text-serializer-legacy:$textVersion" + shade "net.kyori:text-serializer-plain:$textVersion" + shade('com.sk89q:jchronic:0.2.4a') { + exclude(group: "junit", module: "junit") + } + shade 'com.thoughtworks.paranamer:paranamer:2.6' + shade 'com.sk89q.lib:jlibnoise:1.0.0' + shade "org.enginehub.piston:core:$pistonVersion" + shade "org.enginehub.piston.core-ap:runtime:$pistonVersion" + shade "org.enginehub.piston:default-impl:$pistonVersion" + } + + project("ap") { + dependencies { + shade "org.enginehub.piston.core-ap:annotations:$pistonVersion" + shade "org.enginehub.piston.core-ap:processor:$pistonVersion" + } + } +} +project("bukkit") { + repositories { + maven { + name = "SpigotMC" + url = "https://hub.spigotmc.org/nexus/content/repositories/snapshots/" + } + } + dependencies { + shade "net.kyori:text-adapter-bukkit:$textExtrasVersion" + } +} +/*project("sponge") { + repositories { + maven { + name = "Sponge" + url = "https://repo.spongepowered.org/maven" + } + } + dependencies { + shade "net.kyori:text-adapter-spongeapi:$textExtrasVersion" + } +}*/ + +tasks.register("build") { + dependsOn(subprojects.collect { it.tasks.named("build") }) +}