diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2272a299..ff937bed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: matrix: # Must upgrade Gradle before we can go past Java 15 here. # https://docs.gradle.org/current/userguide/compatibility.html - java: [ 8, 11 ] + java: [ 11, 17 ] steps: - uses: actions/checkout@v4 @@ -60,7 +60,7 @@ jobs: echo ANDROID_SDK_ROOT: ${ANDROID_SDK_ROOT} - name: Build - run: ./gradlew clean build + run: ./gradlew clean build --no-daemon - name: Upload build reports if: always() @@ -70,6 +70,37 @@ jobs: path: | **/build/reports/* + build-android: + runs-on: ubuntu-22.04 + name: Build Android module with Java 17 + needs: [ validation ] + steps: + - uses: actions/checkout@v4 + - name: Fetch git tags + run: ./.github/scripts/fetch_to_tag.sh + + - name: Set up Java 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: 'zulu' + cache: 'gradle' + + - name: Install Android SDK + run: | + ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "platforms;android-33" "build-tools;34.0.0" + + - name: Build Android module + run: ./gradlew :rollbar-android:build + + - name: Upload Android build reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: android-java17-build-reports + path: | + **/build/reports/* + release: runs-on: ubuntu-22.04 name: Release @@ -77,27 +108,21 @@ jobs: # faster and have less duplicated Yaml, it would not be possible to check # for all matrix results before publishing if this were just another step # in that job. - needs: [ build ] + needs: [ build, build-android ] steps: - uses: actions/checkout@v4 - - name: Set up Java 11 for the Android SDK Manager - uses: actions/setup-java@v1 - with: - java-version: 11 - - - name: Install Android SDK - run: | - echo "Android SDK Manager version: `${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --version`" - ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "platforms;android-27" "build-tools;28.0.3" - - - name: Set up Java 8 for the build + - name: Set up Java 17 for Android uses: actions/setup-java@v4 with: - java-version: 8 + java-version: 17 distribution: 'zulu' cache: 'gradle' + - name: Install Android SDK + run: | + ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "platforms;android-33" "build-tools;34.0.0" + - name: Release env: RELEASE_GPG_PRIVATE_KEY: ${{ secrets.RELEASE_GPG_PRIVATE_KEY }} diff --git a/build-logic/conventions/build.gradle.kts b/build-logic/conventions/build.gradle.kts new file mode 100644 index 00000000..f0034f1b --- /dev/null +++ b/build-logic/conventions/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + `kotlin-dsl` +} + +group = "com.rollbar.buildlogic" + +repositories { + gradlePluginPortal() + mavenCentral() +} + +dependencies { + implementation("com.vanniktech:gradle-maven-publish-plugin:0.34.0") +} + +gradlePlugin { + plugins { + create("rollbar-release-plugin") { + id = "com.rollbar.conventions.release" + implementationClass = "RollbarPublishPlugin" + } + } +} diff --git a/build-logic/conventions/src/main/kotlin/RollbarPublishPlugin.kt b/build-logic/conventions/src/main/kotlin/RollbarPublishPlugin.kt new file mode 100644 index 00000000..f36eee98 --- /dev/null +++ b/build-logic/conventions/src/main/kotlin/RollbarPublishPlugin.kt @@ -0,0 +1,61 @@ +import com.vanniktech.maven.publish.MavenPublishBaseExtension +import org.gradle.api.Plugin +import org.gradle.api.Project + +class RollbarPublishPlugin : Plugin { + override fun apply(project: Project) { + + project.pluginManager.withPlugin("com.android.library") { + applyPlugin(project) + } + + project.plugins.withId("java-library") { + applyPlugin(project) + } + + } + + private fun applyPlugin(project: Project) { + project.plugins.apply("com.vanniktech.maven.publish") + + project.extensions.configure(MavenPublishBaseExtension::class.java) { + pom { + name.set(project.findProperty("POM_NAME") as String) + description.set(project.findProperty("POM_DESCRIPTION") as String) + url.set(project.findProperty("POM_URL") as String) + + licenses { + license { + name.set(project.findProperty("POM_LICENCE_NAME") as String) + url.set(project.findProperty("POM_LICENCE_URL") as String) + distribution.set(project.findProperty("POM_LICENCE_DIST") as String) + } + } + + developers { + developer { + id.set("rokob") + name.set("Andrew Weiss") + } + developer { + id.set("basoko") + name.set("David Basoco") + } + developer { + id.set("diegov") + name.set("Diego Veralli") + } + } + + scm { + url.set(project.findProperty("POM_SCM_URL") as String) + connection.set(project.findProperty("POM_SCM_CONNECTION") as String) + developerConnection.set(project.findProperty("POM_SCM_DEV_CONNECTION") as String) + } + } + + publishToMavenCentral() + signAllPublications() + } + } +} diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 00000000..a2069735 --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,10 @@ +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "build-logic" + +include(":conventions") diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 0e5e4a53..00000000 --- a/build.gradle +++ /dev/null @@ -1,84 +0,0 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "de.marcphilipp.gradle:nexus-publish-plugin:0.4.0" - classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.21.2" - classpath "com.github.spotbugs.snom:spotbugs-gradle-plugin:4.8.0" - classpath "com.palantir.gradle.revapi:gradle-revapi:1.4.4" - } -} - -apply plugin: 'io.codearte.nexus-staging' -nexusStaging { - packageGroup = GROUP - username = System.getenv('NEXUS_USERNAME') - password = System.getenv('NEXUS_PASSWORD') - numberOfRetries = 180 - delayBetweenRetriesInMillis = 3000 -} - -allprojects { - version VERSION_NAME - - repositories { - google() - mavenCentral() - } -} - -subprojects { project -> - if (!project.name.contains('android') && !project.parent.name.equals("examples") && !project.name.contains('examples')) { - apply plugin: 'java-library' - - apply from: "$rootDir/gradle/release.gradle" - - apply from: "$rootDir/gradle/quality.gradle" - - apply from: "$rootDir/gradle/compatibility.gradle" - - repositories { - mavenCentral() - } - - jar { - manifest { - attributes( - "Implementation-Title": project.name, - "Implementation-Version": VERSION_NAME - ) - } - } - - dependencies { - testImplementation group: 'junit', name: 'junit', version: '4.13.2' - testImplementation group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3' - testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.8.0' - } - - compileJava { - if (JavaVersion.current().isJava9Compatible()) { - options.release = 8 - } else { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - } - - compileTestJava { - if (JavaVersion.current().isJava9Compatible()) { - options.release = 8 - } else { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - } - } -} - -wrapper { - gradleVersion = '6.9.4' -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..e96d3320 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,62 @@ +plugins { + alias(rollbarlibs.plugins.androidLibrary) apply false + alias(rollbarlibs.plugins.vanniktech) apply false + alias(rollbarlibs.plugins.spotbugs) apply false + alias(rollbarlibs.plugins.revapi) apply false + id("com.rollbar.conventions.release") apply false +} + +val versionName = rootProject.extra["VERSION_NAME"] as String + +allprojects { + version = versionName + + repositories { + google() + mavenCentral() + } +} + +subprojects { + val isExample = name.contains("examples") || parent?.name == "examples" + val isAndroid = name.contains("android") + + if (isExample || isAndroid) { + return@subprojects + } + + apply(plugin = "java-library") + apply(plugin = "com.rollbar.conventions.release") + apply(from = "$rootDir/gradle/quality.gradle") + apply(from = "$rootDir/gradle/compatibility.gradle") + + repositories { + mavenCentral() + } + + tasks.withType().configureEach { + manifest { + attributes( + mapOf( + "Implementation-Title" to project.name, + "Implementation-Version" to versionName + ) + ) + } + } + + dependencies { + add("testImplementation", "junit:junit:4.13.2") + add("testImplementation", "org.hamcrest:hamcrest-all:1.3") + add("testImplementation", "org.mockito:mockito-core:5.18.0") + } + + tasks.withType().configureEach { + if (JavaVersion.current().isJava9Compatible) { + options.release.set(8) + } else { + sourceCompatibility = JavaVersion.VERSION_1_8.toString() + targetCompatibility = JavaVersion.VERSION_1_8.toString() + } + } +} \ No newline at end of file diff --git a/examples/rollbar-android/build.gradle b/examples/rollbar-android/build.gradle index 9eb389f4..d81db593 100644 --- a/examples/rollbar-android/build.gradle +++ b/examples/rollbar-android/build.gradle @@ -4,15 +4,15 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:8.6.0' } } apply plugin: 'com.android.application' android { - compileSdkVersion 33 - buildToolsVersion "30.0.3" + namespace 'com.rollbar.examples.android' + compileSdkVersion = 33 defaultConfig { applicationId "com.rollbar.example.android" minSdkVersion 21 diff --git a/examples/rollbar-scala/build.gradle b/examples/rollbar-scala/build.gradle index 4a4c1818..89f2d281 100644 --- a/examples/rollbar-scala/build.gradle +++ b/examples/rollbar-scala/build.gradle @@ -20,5 +20,5 @@ applicationDefaultJvmArgs = [ dependencies { implementation project(":rollbar-java") - implementation "org.scala-lang:scala-library:2.12.4" + implementation "org.scala-lang:scala-library:2.13.14" } diff --git a/examples/rollbar-spring-boot-webmvc/build.gradle b/examples/rollbar-spring-boot-webmvc/build.gradle index 7a9ed4c3..81a9ac1d 100644 --- a/examples/rollbar-spring-boot-webmvc/build.gradle +++ b/examples/rollbar-spring-boot-webmvc/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.0.0.RELEASE' - id 'io.spring.dependency-management' version '1.0.9.RELEASE' + id 'org.springframework.boot' version '2.7.12' + id 'io.spring.dependency-management' version '1.0.15.RELEASE' id 'java' } diff --git a/gradle/android.quality.gradle b/gradle/android.quality.gradle index bb696379..9f61977f 100644 --- a/gradle/android.quality.gradle +++ b/gradle/android.quality.gradle @@ -1,3 +1,5 @@ +import com.github.spotbugs.snom.SpotBugsTask + buildscript { repositories { maven { @@ -14,11 +16,11 @@ apply plugin: "com.github.spotbugs-base" apply plugin: 'jacoco' checkstyle { - toolVersion "8.2" - configFile file("$rootDir/tools/checkstyle/google_checks.xml") + toolVersion = "8.2" + configFile = file("$rootDir/tools/checkstyle/google_checks.xml") } -task checkstyleMain(type: Checkstyle) { +tasks.register("checkstyleMain", Checkstyle) { source 'src' include '**/*.java' exclude '**/gen/**' @@ -26,11 +28,11 @@ task checkstyleMain(type: Checkstyle) { exclude '**/annotation/*.java' classpath = files() reports { - xml.enabled false - html.enabled true + xml.required.set(false) + html.required.set(true) } // Set this to true until we fix our current errors. - ignoreFailures true + ignoreFailures = true } spotbugs { @@ -38,54 +40,43 @@ spotbugs { includeFilter = file("$rootDir/tools/findbugs/findbugs.xml") } -task spotbugsMain(type: com.github.spotbugs.snom.SpotBugsTask) { - dependsOn 'assemble' +tasks.register("spotbugsMain", SpotBugsTask) { + dependsOn tasks.matching { it.name.startsWith("assemble") } // Set this to true until we fix our current errors. ignoreFailures = true effort = "max" reportLevel = "medium" - classes = fileTree("$project.buildDir/intermediates/javac/debug/classes/") - sourceDirs = fileTree('src/main/java') - auxClassPaths = files() + classes.setFrom(fileTree("build/intermediates/javac/debug/classes/")) + source.setFrom(fileTree("src/main/java")) + classpath.setFrom(files()) projectName = project.name release = VERSION_NAME - reports { - html { - enabled = true - destination = file("$buildDir/reports/spotbugs/main/spotbugs.html") - stylesheet = 'fancy-hist.xsl' - } - } + reports.html.required = true + reports.html.outputLocation = project.layout.buildDirectory.file("reports/spotbugs/main/spotbugs.html").get().asFile + reports.html.stylesheet = 'fancy-hist.xsl' } jacoco { toolVersion = '0.8.6' } -android.testOptions { - unitTests.all { - jacoco { - destinationFile = file("$buildDir/jacoco/jacocoTest.exec") - classDumpDir = file("$buildDir/jacoco/classpathdumps") - } - } -} +tasks.register("jacocoTestReport", JacocoReport) { + dependsOn "test" -task jacocoTestReport(type: JacocoReport, dependsOn: 'test') { reports { - xml.enabled false - csv.enabled false - html.enabled true - html.destination file("${buildDir}/jacocoHtml") + xml.required.set(false) + csv.required.set(false) + html.required.set(true) + html.outputLocation.set(project.layout.buildDirectory.dir("jacocoHtml")) } } // adds checkstyle task to existing check task afterEvaluate { - if (project.tasks.getByName("check")) { - check.dependsOn('checkstyleMain') - check.dependsOn('spotbugsMain') + if (tasks.named("check")) { + check.dependsOn("checkstyleMain") + check.dependsOn("spotbugsMain") } -} +} \ No newline at end of file diff --git a/gradle/quality.gradle b/gradle/quality.gradle index a91b5a9c..1136c9d2 100644 --- a/gradle/quality.gradle +++ b/gradle/quality.gradle @@ -14,28 +14,27 @@ spotbugs { includeFilter = file("$rootDir/tools/findbugs/findbugs.xml") } -tasks.withType(Checkstyle) { +tasks.withType(Checkstyle).configureEach { reports { - xml.enabled false - html.enabled true + xml.required.set(false) + html.required.set(true) } } -spotbugsMain { - reports { - html { - enabled = true - destination = file("$buildDir/reports/spotbugs/main/spotbugs.html") - stylesheet = 'fancy-hist.xsl' +afterEvaluate { + tasks.matching { it.class.name == "com.github.spotbugs.snom.SpotBugsTask" }.configureEach { + reports { + html.required.set(true) + html.stylesheet = 'fancy-hist.xsl' + html.outputLocation.set(file("$buildDir/reports/spotbugs/${name}/spotbugs.html")) } } -} -spotbugsTest { - enabled = false -} -afterEvaluate { - if (project.tasks.findByPath("spotbugsIntegTest") != null) { + spotbugsTest{ + enabled = false + } + + if (tasks.findByName("spotbugsIntegTest") != null) { spotbugsIntegTest { enabled = false } diff --git a/gradle/release.gradle b/gradle/release.gradle deleted file mode 100644 index aef0d97d..00000000 --- a/gradle/release.gradle +++ /dev/null @@ -1,179 +0,0 @@ -apply plugin: 'signing' -apply plugin: 'maven-publish' -apply plugin: "de.marcphilipp.nexus-publish" - -nexusPublishing { - repositories { - sonatype { - clientTimeout = Duration.ofMinutes(5) - connectTimeout = Duration.ofMinutes(5) - } - } -} - -afterEvaluate { - if (project.parent != null && !project.parent.name.equals("examples") && !project.name.contains('examples')) { - if (!project.hasProperty('android')) { - publishing { - task sourcesJar(type: Jar, dependsOn: classes) { - archiveClassifier.set('sources') - from sourceSets.main.allSource - } - - task javadocJar(type: Jar, dependsOn: javadoc) { - archiveClassifier.set('javadoc') - from javadoc.destinationDir - } - - publications { - maven(MavenPublication) { - // Applies the component for the release build variant. - from components.java - - groupId GROUP - version VERSION_NAME - - artifact sourcesJar - artifact javadocJar - - pom { - versionMapping { - usage('api') { - fromResolutionOf('runtimeClasspath') - } - usage('java-runtime') { - fromResolutionResult() - } - } - name = POM_NAME - description = POM_DESCRIPTION - url = POM_URL - - scm { - url = POM_SCM_URL - connection = POM_SCM_CONNECTION - developerConnection = POM_SCM_DEV_CONNECTION - } - licenses { - license { - name = POM_LICENCE_NAME - url = POM_LICENCE_URL - distribution = POM_LICENCE_DIST - } - } - developers { - developer { - id = 'rokob' - name = 'Andrew Weiss' - } - developer { - id = 'basoko' - name = 'David Basoco' - } - developer { - id = 'diegov' - name = 'Diego Veralli' - } - } - } - } - } - } - - signing { - required true - useInMemoryPgpKeys( - findProperty("signingKey") ?: System.getenv("RELEASE_GPG_PRIVATE_KEY"), - findProperty("signingPassword") ?: System.getenv("RELEASE_GPG_PRIVATE_KEY_PASSPHRASE")) - sign publishing.publications.maven - } - } - - if (project.hasProperty("android")) { - publishing { - task androidSourcesJar(type: Jar) { - archiveClassifier.set('sources') - from android.sourceSets.main.java.srcDirs - } - - task androidJavadocs(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - android.libraryVariants.all { variant -> - if (variant.name == 'release') { - owner.classpath += variant.javaCompileProvider.get().classpath - } - } - exclude '**/R.html', '**/R.*.html', '**/index.html' - } - - task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) { - archiveClassifier.set('javadoc') - from androidJavadocs.destinationDir - } - - task androidClassJar(type: Jar) { - from 'build/intermediates/classes/release/' - } - - publications { - release(MavenPublication) { - from components.release - - groupId GROUP - version VERSION_NAME - - artifact androidSourcesJar - artifact androidJavadocsJar - - pom { - versionMapping { - usage('api') { - fromResolutionOf('runtimeClasspath') - } - usage('java-runtime') { - fromResolutionResult() - } - } - - name = POM_NAME - description = POM_DESCRIPTION - url = POM_URL - - scm { - url = POM_SCM_URL - connection = POM_SCM_CONNECTION - developerConnection = POM_SCM_DEV_CONNECTION - } - licenses { - license { - name = POM_LICENCE_NAME - url = POM_LICENCE_URL - distribution = POM_LICENCE_DIST - } - } - developers { - developer { - id = 'rokob' - name = 'Andrew Weiss' - } - developer { - id = 'basoko' - name = 'David Basoco' - } - } - } - } - } - signing { - required true - useInMemoryPgpKeys( - findProperty("signingKey") ?: System.getenv("RELEASE_GPG_PRIVATE_KEY"), - findProperty("signingPassword") ?: System.getenv("RELEASE_GPG_PRIVATE_KEY_PASSPHRASE")) - sign publishing.publications.release - } - } - } - } -} - diff --git a/gradle/rollbarlibs.versions.toml b/gradle/rollbarlibs.versions.toml new file mode 100644 index 00000000..24558484 --- /dev/null +++ b/gradle/rollbarlibs.versions.toml @@ -0,0 +1,19 @@ +[versions] +kotlin = "1.9.22" +agp = "8.6.0" +vanniktech = "0.34.0" +spotbugs = "4.8.0" +revapi = "1.8.0" + +[plugins] +kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +vanniktech = { id = "com.vanniktech.maven.publish", version.ref = "vanniktech" } +spotbugs = { id = "com.github.spotbugs", version.ref = "spotbugs" } +revapi = { id = "com.palantir.revapi", version.ref = "revapi" } +androidLibrary = { id = "com.android.library", version.ref = "agp" } +javaLibrary = { id = "java-library" } + +[libraries] +junit = { group = "junit", name = "junit", version = "4.13.2" } +hamcrest = { group = "org.hamcrest", name = "hamcrest-all", version = "1.3" } +mockito = { group = "org.mockito", name = "mockito-core", version = "3.8.0" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 53b9e380..3ae1e2f1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/rollbar-android/build.gradle b/rollbar-android/build.gradle deleted file mode 100644 index 786d82fd..00000000 --- a/rollbar-android/build.gradle +++ /dev/null @@ -1,55 +0,0 @@ -buildscript { - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' - } -} - -repositories { - google() - mavenCentral() -} - -apply plugin: 'com.android.library' -apply from: "$rootDir/gradle/release.gradle" -apply from: "$rootDir/gradle/android.quality.gradle" - -android { - compileSdkVersion 33 - buildToolsVersion '30.0.3' // Going above here requires bumping the AGP to version 4+ - - defaultConfig { - minSdkVersion 21 - // FIXME: Pending further discussion - //noinspection ExpiredTargetSdkVersion - targetSdkVersion 33 - consumerProguardFiles 'proguard-rules.pro' - manifestPlaceholders = [notifierVersion: VERSION_NAME] - } - - buildTypes { - release { - testCoverageEnabled false - } - debug { - testCoverageEnabled true - } - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -} - -dependencies { - api project(':rollbar-java') - - testImplementation group: 'junit', name: 'junit', version: '4.12' - testImplementation group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3' - testImplementation group: 'org.mockito', name: 'mockito-core', version: '2.28.2' - androidTestImplementation "org.mockito:mockito-android:+" -} diff --git a/rollbar-android/build.gradle.kts b/rollbar-android/build.gradle.kts new file mode 100644 index 00000000..9bab73b0 --- /dev/null +++ b/rollbar-android/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("com.android.library") + id("com.rollbar.conventions.release") +} + +//apply(from = "$rootDir/gradle/android.quality.gradle") //TODO: Update as convention plugin + +android { + namespace = "com.rollbar.android" + compileSdk = 33 + + defaultConfig { + minSdk = 21 + targetSdk = 33 + consumerProguardFiles("proguard-rules.pro") + manifestPlaceholders["notifierVersion"] = project.property("VERSION_NAME") as String + } + + buildTypes { + getByName("release") { + enableUnitTestCoverage = false + enableAndroidTestCoverage = false + } + getByName("debug") { + enableUnitTestCoverage = true + enableAndroidTestCoverage = true + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +dependencies { + api(project(":rollbar-java")) + + testImplementation("junit:junit:4.13.1") + testImplementation("org.hamcrest:hamcrest-all:1.3") + testImplementation("org.mockito:mockito-core:5.18.0") + androidTestImplementation("org.mockito:mockito-android:5.18.0") +} \ No newline at end of file diff --git a/rollbar-java/build.gradle b/rollbar-java/build.gradle deleted file mode 100644 index 40c7cada..00000000 --- a/rollbar-java/build.gradle +++ /dev/null @@ -1,95 +0,0 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "com.netflix.nebula:nebula-project-plugin:3.4.0" - } - configurations.classpath { - resolutionStrategy.force 'com.netflix.nebula:nebula-gradle-interop:2.3.0' - } -} - -apply plugin: "nebula.integtest" - -configurations { - integTestArtifacts -} - -dependencies { - api project(':rollbar-api') - - api group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' - - compileOnly 'com.google.code.findbugs:jsr305:3.0.2' - - testImplementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6' - - integTestImplementation group: 'com.github.tomakehurst', name: 'wiremock', version: '2.27.0' - integTestImplementation group: 'com.google.code.gson', name: 'gson', version: '2.8.2' -} - -/** - * This task will create a version property that is statically referenced when populating the - * `notifier` section of the payload. It helps when users shade and / or relocate the - * `rollbar-java` classes, since in those cases we no longer have access to our jar manifest. - * The task creates a Java class instead of a text resource, since dynamically loaded resources - * are not as reliable under relocation as a strongly typed bytecode reference to a compiled class. - */ -task createVersionClass() { - ext.set("OUTPUT_DIR", [buildDir.getAbsolutePath(), 'src', 'generated', 'main'].join(File.separator)) - - outputs.dir(ext.OUTPUT_DIR) - - doLast { - def pkg = ["com", "rollbar", "notifier", "provider", "notifier"]; - - def pkgName = pkg.join("."); - def pkgPath = "${ext.OUTPUT_DIR}${File.separator}${pkg.join(File.separator)}" - def escapedVersion = VERSION_NAME.replace('\\', '\\\\').replace('"', '\\"'); - - def classText = """package ${pkgName}; - -class VersionHelperResources { - static String getVersion() { - return "${escapedVersion}"; - } -} -""" - - new File(pkgPath).mkdirs() - def classFile = new File(pkgPath, 'VersionHelperResources.java').newWriter() - try { - classFile << classText - } finally { - classFile.close() - } - } -} - -sourceSets { - main { - java.srcDirs += project.tasks.createVersionClass.ext.OUTPUT_DIR - } -} - -project.tasks.compileJava.dependsOn(project.tasks.createVersionClass); -project.tasks.checkstyleMain.dependsOn(project.tasks.createVersionClass); - -test { - // This helps us test the VersionHelper class since there's no jar manifest available when - // running tests. - systemProperty 'ROLLBAR_IMPLEMENTATION_VERSION', VERSION_NAME -} - -// The 'java-test-fixtures' plugin is not getting along with 'nebula.integtest', so we'll use this instead -task integTestJar(type: Jar, dependsOn: project.tasks.integTestClasses) { - archiveClassifier.set('integtest') - from sourceSets.integTest.output -} - -artifacts { - integTestArtifacts integTestJar -} diff --git a/rollbar-java/build.gradle.kts b/rollbar-java/build.gradle.kts new file mode 100644 index 00000000..364c8c20 --- /dev/null +++ b/rollbar-java/build.gradle.kts @@ -0,0 +1,99 @@ +import java.io.File +import org.gradle.api.tasks.testing.Test + +plugins { + id("com.netflix.nebula.integtest") version "10.0.1" +} + +val integTestArtifacts by configurations.creating +val integTestRuntime by configurations.creating { + extendsFrom(configurations["integTestImplementation"]) + isCanBeConsumed = true + isCanBeResolved = true +} + +dependencies { + api(project(":rollbar-api")) + api("org.slf4j:slf4j-api:1.7.25") + + compileOnly("com.google.code.findbugs:jsr305:3.0.2") + + testImplementation("com.google.code.gson:gson:2.8.6") + + "integTestImplementation"("com.github.tomakehurst:wiremock:2.27.0") + "integTestImplementation"("com.google.code.gson:gson:2.8.2") +} + +val versionName = project.version.toString().ifEmpty { "unspecified" } + +/** + * This task will create a version property that is statically referenced when populating the + * `notifier` section of the payload. It helps when users shade and / or relocate the + * `rollbar-java` classes, since in those cases we no longer have access to our jar manifest. + * The task creates a Java class instead of a text resource, since dynamically loaded resources + * are not as reliable under relocation as a strongly typed bytecode reference to a compiled class. + */ +val createVersionClass by tasks.registering { + val outputDir = layout.buildDirectory.dir("generated/sources/version/java/main") + outputs.dir(outputDir) + + inputs.property("versionName", versionName) + + doLast { + val pkg = listOf("com", "rollbar", "notifier", "provider", "notifier") + val pkgName = pkg.joinToString(".") + val pkgPath = outputDir.get().asFile.resolve(pkg.joinToString(File.separator)) + val escapedVersion = versionName.replace("\\", "\\\\").replace("\"", "\\\"") + + val classText = """ + package $pkgName; + + class VersionHelperResources { + static String getVersion() { + return "$escapedVersion"; + } + } + """.trimIndent() + + pkgPath.mkdirs() + pkgPath.resolve("VersionHelperResources.java").writeText(classText) + } +} + +sourceSets { + named("main") { + java.srcDir(createVersionClass.map { it.outputs.files.singleFile }) + } +} + +tasks.named("compileJava") { + dependsOn(createVersionClass) +} + +tasks.named("checkstyleMain") { + dependsOn(createVersionClass) +} + +tasks.withType().configureEach { + if (name == "sourcesJar") { + dependsOn(createVersionClass) + } +} + +tasks.named("test") { + dependsOn(createVersionClass) + // This helps us test the VersionHelper class since there's no jar manifest available when + // running tests. + systemProperty("ROLLBAR_IMPLEMENTATION_VERSION", versionName) +} + +// The 'java-test-fixtures' plugin is not getting along with 'nebula.integtest', so we'll use this instead +val integTestJar by tasks.registering(Jar::class) { + archiveClassifier.set("integtest") + from(sourceSets["integTest"].output) + dependsOn(tasks.named("integTestClasses")) +} + +artifacts { + add("integTestArtifacts", integTestJar) +} diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/filter/FilterPipelineTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/filter/FilterPipelineTest.java index 975713be..960792a3 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/filter/FilterPipelineTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/filter/FilterPipelineTest.java @@ -22,7 +22,7 @@ public class FilterPipelineTest { @Rule - public MockitoRule rule = new MockitoJUnit().rule(); + public MockitoRule rule = MockitoJUnit.rule(); @Test public void shouldCallFiltersInOrderForPreProcess() { diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/transformer/TransformerPipelineTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/transformer/TransformerPipelineTest.java index add8205e..1065581b 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/transformer/TransformerPipelineTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/transformer/TransformerPipelineTest.java @@ -17,7 +17,7 @@ public class TransformerPipelineTest { @Rule - public MockitoRule rule = new MockitoJUnit().rule(); + public MockitoRule rule = MockitoJUnit.rule(); @Test public void shouldCallTransformerInOrder() { diff --git a/rollbar-reactive-streams/build.gradle b/rollbar-reactive-streams/build.gradle index 716ab256..3e588465 100644 --- a/rollbar-reactive-streams/build.gradle +++ b/rollbar-reactive-streams/build.gradle @@ -1,18 +1,18 @@ buildscript { repositories { - maven { - url "https://plugins.gradle.org/m2/" - } + gradlePluginPortal() + mavenCentral() } dependencies { - classpath "com.netflix.nebula:nebula-project-plugin:3.4.0" - } - configurations.classpath { - resolutionStrategy.force 'com.netflix.nebula:nebula-gradle-interop:2.3.0' + classpath 'com.netflix.nebula:nebula-project-plugin:10.0.1' } } -apply plugin: "nebula.integtest" +apply plugin: 'com.netflix.nebula.integtest' + +repositories { + mavenCentral() +} dependencies { api project(':rollbar-java') @@ -33,17 +33,17 @@ dependencies { testImplementation(project(path: ':rollbar-java', configuration: 'integTestRuntime')) testImplementation(project(path: ':rollbar-java', configuration: 'integTestArtifacts')) - integTestImplementation group: 'com.github.tomakehurst', name: 'wiremock-jre8', version: '2.27.2' - integTestImplementation group: 'com.google.code.gson', name: 'gson', version: '2.8.2' + integTestImplementation 'com.github.tomakehurst:wiremock-jre8:2.27.2' + integTestImplementation 'com.google.code.gson:gson:2.8.2' } // The reactive streams TCK tests use TestNG -task tckTest(type: Test) { +tasks.register("tckTest", Test) { useTestNG() } -project.tasks.check.dependsOn(tckTest) +check.dependsOn("tckTest") -integrationTest { - dependsOn project(':rollbar-java').tasks.integTestJar +tasks.named("integrationTest").configure { + dependsOn project(':rollbar-java').tasks.named("integTestJar") } diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index adfeeca4..00000000 --- a/settings.gradle +++ /dev/null @@ -1,35 +0,0 @@ -rootProject.name="rollbar-java-sdk" - -include ":rollbar-api", - ":rollbar-java", - ":rollbar-web", - ":rollbar-jakarta-web", - ":rollbar-log4j2", - ":rollbar-logback", - ":rollbar-spring-webmvc", - ":rollbar-spring6-webmvc", - ":rollbar-spring-boot-webmvc", - ":rollbar-spring-boot3-webmvc", - ":rollbar-struts2", - ":rollbar-reactive-streams", - ":rollbar-reactive-streams-reactor", - ":examples:rollbar-java", - ":examples:rollbar-web", - ":examples:rollbar-scala", - ":examples:rollbar-log4j2", - ":examples:rollbar-logback", - ":examples:rollbar-spring-webmvc", - ":examples:rollbar-spring-boot-webmvc", - ":examples:rollbar-struts2", - ":examples:rollbar-struts2-spring", - ":examples:rollbar-reactive-streams-reactor" - -def isJava8 = JavaVersion.current() == JavaVersion.VERSION_1_8 - -if (isJava8) { - println "Java 8 detected: excluding :rollbar-android and :examples:rollbar-android" -} else { - println "Java ${JavaVersion.current()} detected: including Android modules" - include ":rollbar-android", - ":examples:rollbar-android" -} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..b56b7aee --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,68 @@ +rootProject.name="rollbar-java-sdk" + + +pluginManagement { + includeBuild("build-logic") + + plugins { + id("com.android.library") version "8.6.0" + } + + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} + +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } + + versionCatalogs { + create("rollbarlibs") { + from(files("gradle/rollbarlibs.versions.toml")) + } + } +} + + +include( + ":rollbar-api", + ":rollbar-java", + ":rollbar-web", + ":rollbar-jakarta-web", + ":rollbar-log4j2", + ":rollbar-logback", + ":rollbar-spring-webmvc", + ":rollbar-spring6-webmvc", + ":rollbar-spring-boot-webmvc", + ":rollbar-spring-boot3-webmvc", + ":rollbar-struts2", + ":rollbar-reactive-streams", + ":rollbar-reactive-streams-reactor", + ":examples:rollbar-java", + ":examples:rollbar-web", + ":examples:rollbar-scala", + ":examples:rollbar-log4j2", + ":examples:rollbar-logback", + ":examples:rollbar-spring-webmvc", + ":examples:rollbar-spring-boot-webmvc", + ":examples:rollbar-struts2", + ":examples:rollbar-struts2-spring", + ":examples:rollbar-reactive-streams-reactor" +) + +val isJava8 = JavaVersion.current() == JavaVersion.VERSION_1_8 +val isJava11 = JavaVersion.current() == JavaVersion.VERSION_11 + +if (isJava8 || isJava11) { + println("Java 8 or 11 detected: excluding :rollbar-android and :examples:rollbar-android") +} else { + println("Java ${JavaVersion.current()} detected: including Android modules") + include(":rollbar-android", ":examples:rollbar-android") +}