diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 52143650..2b855664 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,20 +3,17 @@ name: Java CI on: push: - branches: - - master pull_request: jobs: test: - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest strategy: matrix: - os: [ubuntu-18.04] - java: [8, 11] + java: [8, 11, 17, 18] fail-fast: false max-parallel: 4 - name: Test JDK ${{ matrix.java }}, ${{ matrix.os }} + name: JDK ${{ matrix.java }} steps: - uses: actions/checkout@v2 @@ -26,7 +23,14 @@ jobs: java-version: ${{ matrix.java }} - name: Grant execute permission for gradlew run: chmod +x gradlew + - name: Build with Gradle - run: ./gradlew build + run: ./gradlew build --warning-mode all + + - name: Run Tests + run: ./gradlew check + + - name: Maven Install + run: ./gradlew clean publishToMavenLocal ... diff --git a/build.gradle b/build.gradle index 3281e433..949e4ade 100644 --- a/build.gradle +++ b/build.gradle @@ -20,23 +20,24 @@ ext { jettison: 'org.codehaus.jettison:jettison:1.4.1', jsonOrg: 'org.json:json:20140107', jsonSmart: 'net.minidev:json-smart:2.4.8', - slf4jApi: 'org.slf4j:slf4j-api:1.7.33', + slf4jApi: 'org.slf4j:slf4j-api:1.7.36', tapestryJson: 'org.apache.tapestry:tapestry-json:5.8.0', jakartaJsonP: 'jakarta.json:jakarta.json-api:2.0.1', jakartaJsonB: 'jakarta.json.bind:jakarta.json.bind-api:2.0.0', test: [ 'commons-io:commons-io:2.11.0', - 'junit:junit:4.13.2', + 'junit:junit:4.13.+', + 'org.junit.vintage:junit-vintage-engine:5.8.+', 'org.assertj:assertj-core:3.22.0', 'org.hamcrest:hamcrest:2.2', 'org.glassfish:jakarta.json:2.0.1', 'org.eclipse:yasson:2.0.4', //'org.apache.johnzon:johnzon-jsonb:1.2.12', - 'org.slf4j:slf4j-simple:1.7.35' + 'org.slf4j:slf4j-simple:1.7.36' ] ] - snapshotVersion = true + snapshotVersion = project.version.contains('SNAPSHOT') } allprojects { @@ -46,15 +47,12 @@ allprojects { group = 'com.jayway.jsonpath' version = '2.8.0' + (snapshotVersion ? "-SNAPSHOT" : "") - if (JavaVersion.current().isJava8Compatible()) { - tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:none', '-quiet') - } - } } subprojects { apply plugin: 'java' + apply plugin: 'java-library' + apply plugin: 'maven-publish' apply plugin: 'signing' apply plugin: 'biz.aQute.bnd.builder' @@ -65,28 +63,78 @@ subprojects { mavenCentral() } - task javadocJar(type: Jar) { - classifier = 'javadoc' - from javadoc + java { + withJavadocJar() + withSourcesJar() } - task sourcesJar(type: Jar) { - classifier = 'sources' - from sourceSets.main.allSource + test { + useJUnitPlatform() + + systemProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager") + + testLogging { + events "passed", "skipped", "failed" + //showStandardStreams = true + } } signing { - required { !snapshotVersion && gradle.taskGraph.hasTask("uploadArchives") } - sign configurations.archives + sign configurations.archives // sign publishing.publications.mavenJava + required { !snapshotVersion && gradle.taskGraph.hasTask("publish") } // uploadArchives is replaced by publish + } + + javadoc { + if (JavaVersion.current().isJava8Compatible()) { + options.addStringOption('Xdoclint:none', '-quiet') + } + + if(JavaVersion.current().isJava9Compatible()) { + options.addBooleanOption('html5', true) + } } - artifacts { - archives jar, javadocJar, sourcesJar + publishing { + publications { + mavenJava(MavenPublication) { + from components.java + + artifactId = jar.baseName + + pom { + name = jar.baseName + description = project.description + url = 'https://github.com/jayway/JsonPath' + + licenses { + license { + name = "The Apache Software License, Version 2.0" + url = "https://www.apache.org/licenses/LICENSE-2.0.txt" + distribution = "repo" + } + } + + scm { + url = 'scm:git:git://github.com/jayway/JsonPath.git' + connection = 'scm:git:git://github.com/jayway/JsonPath.git' + developerConnection = 'scm:git:git://github.com/jayway/JsonPath.git' + } + + developers { + developer { + id = 'kalle.stenflo' + name = 'Kalle Stenflo' + email = 'kalle.stenflo (a) gmail.com' + } + } + } + } + } } } wrapper { - gradleVersion = '5.6.2' + gradleVersion = '7.4.2' } //Task used by Heroku for staging diff --git a/gradle/binaryCompatibility.gradle b/gradle/binaryCompatibility.gradle index 3f02e320..57111001 100644 --- a/gradle/binaryCompatibility.gradle +++ b/gradle/binaryCompatibility.gradle @@ -28,7 +28,7 @@ buildscript { } dependencies { - classpath 'me.champeau.gradle:japicmp-gradle-plugin:0.1.0' + classpath 'me.champeau.gradle:japicmp-gradle-plugin:0.4.0' } } @@ -99,7 +99,8 @@ if (JavaVersion.current().isJava7Compatible()) { subprojects { - task japicmp(type: me.champeau.gradle.ArtifactJapicmpTask) { + tasks.register("japicmp", me.champeau.gradle.japicmp.JapicmpTask) { + //task japicmp(type: me.champeau.gradle.ArtifactJapicmpTask) { dependsOn jar //baseline = "com.jayway.jsonpath:${project.name}:+@jar" //latest release baseline = 'com.jayway.jsonpath:json-path:2.0.0@jar' @@ -129,7 +130,8 @@ if (JavaVersion.current().isJava7Compatible()) { subprojects { check.dependsOn(checkBinaryCompatibility) - tasks.withType(me.champeau.gradle.ArtifactJapicmpTask) { task -> + + tasks.register("checkCompatibility", me.champeau.gradle.japicmp.JapicmpTask) { task -> checkBinaryCompatibility.dependsOn(task) } } diff --git a/gradle/publishMaven.gradle b/gradle/publishMaven.gradle deleted file mode 100644 index 39be8ca2..00000000 --- a/gradle/publishMaven.gradle +++ /dev/null @@ -1,94 +0,0 @@ -apply plugin: "maven" - -def basePom = { - project { - name project.displayName - packaging 'bundle' - description project.description - url 'https://github.com/jayway/JsonPath' - - licenses { - license { - name "The Apache Software License, Version 2.0" - url "http://www.apache.org/licenses/LICENSE-2.0.txt" - distribution "repo" - } - } - - scm { - url 'scm:git:git://github.com/jayway/JsonPath.git' - connection 'scm:git:git://github.com/jayway/JsonPath.git' - developerConnection 'scm:git:git://github.com/jayway/JsonPath.git' - } - - developers { - developer { - id 'kalle.stenflo' - name 'Kalle Stenflo' - email 'kalle.stenflo (a) gmail.com' - } - } - } -} - -def deployers = [] - -project.afterEvaluate { - configure(deployers) { - pom basePom - } -} - -install { - deployers << repositories.mavenInstaller -} - -uploadArchives { - deployers << repositories.mavenDeployer { - if (snapshotVersion) { - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { - if (project.hasProperty("sonatypeOssUsername")) { - authentication(userName: sonatypeOssUsername, password: sonatypeOssPassword) - } - } - } else { - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { - if (project.hasProperty("sonatypeOssUsername")) { - authentication(userName: sonatypeOssUsername, password: sonatypeOssPassword) - } - } - } - } -} - -def poms = deployers*.pom -def optionalDeps = [] -def providedDeps = [] -def internalDeps = [] - -ext { - modifyPom = { Closure modification -> - poms.each { - it.whenConfigured(modification) - } - } - optional = { optionalDeps << it; it } - provided = { providedDeps << it; it } - internal = { internalDeps << it; it } -} - -modifyPom { pom -> - optionalDeps.each { dep -> - pom.dependencies.find { it.artifactId == dep.name }.optional = true - } - providedDeps.each { dep -> - pom.dependencies.find { it.artifactId == dep.name }.scope = "provided" - } - internalDeps.each { dep -> - pom.dependencies.removeAll { it.artifactId == dep.name } - } - // no need to publish test dependencies - pom.dependencies.removeAll { it.scope == "test" } -} - -deployers*.beforeDeployment { signing.signPom(it) } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ec991f9a..aa991fce 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.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/json-path-assert/build.gradle b/json-path-assert/build.gradle index 7e5a6fc3..e0cc9710 100644 --- a/json-path-assert/build.gradle +++ b/json-path-assert/build.gradle @@ -1,4 +1,3 @@ -apply from: "$rootDir/gradle/publishMaven.gradle" description = "Assertions on Json using JsonPath" @@ -10,9 +9,11 @@ jar { } dependencies { - compile project(':json-path') - compile libs.hamcrest - compile libs.slf4jApi + implementation project(':json-path') + implementation libs.hamcrest + implementation libs.slf4jApi - testCompile libs.test + testImplementation libs.jsonSmart + testImplementation libs.test + testRuntimeOnly 'org.junit.vintage:junit-vintage-engine' } diff --git a/json-path-web-test/build.gradle b/json-path-web-test/build.gradle index ced2f534..a708daf6 100644 --- a/json-path-web-test/build.gradle +++ b/json-path-web-test/build.gradle @@ -6,6 +6,7 @@ description = "Web app that compares different JsonPath implementations." mainClassName = 'com.jayway.jsonpath.web.boot.Main' task createBuildInfoFile { + dependsOn compileJava doLast { def buildInfoFile = new File("$buildDir/classes/java/main/build-info.properties") Properties props = new Properties() @@ -27,17 +28,18 @@ jar { dependencies { - compile project(':json-path') - compile 'commons-io:commons-io:2.4' - compile libs.jacksonDatabind - compile libs.jsonSmart - compile 'io.fastjson:boon:0.33' - compile 'com.nebhale.jsonpath:jsonpath:1.2' - compile 'io.gatling:jsonpath_2.10:0.6.4' - compile 'org.eclipse.jetty:jetty-server:9.3.0.M1' - compile 'org.eclipse.jetty:jetty-webapp:9.3.0.M1' - compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.20' - compile('org.glassfish.jersey.media:jersey-media-json-jackson:2.20'){ + implementation project(':json-path') + implementation 'commons-io:commons-io:2.4' + implementation libs.slf4jApi + implementation libs.jacksonDatabind + implementation libs.jsonSmart + implementation 'io.fastjson:boon:0.33' + implementation 'com.nebhale.jsonpath:jsonpath:1.2' + implementation 'io.gatling:jsonpath_2.10:0.6.4' + implementation 'org.eclipse.jetty:jetty-server:9.3.0.M1' + implementation 'org.eclipse.jetty:jetty-webapp:9.3.0.M1' + implementation 'org.glassfish.jersey.containers:jersey-container-servlet:2.20' + implementation('org.glassfish.jersey.media:jersey-media-json-jackson:2.20'){ exclude module: 'jackson-annotations:com.fasterxml.jackson.core' exclude module: 'jackson-core:com.fasterxml.jackson.core' } diff --git a/json-path/build.gradle b/json-path/build.gradle index f13bb551..cc89e17b 100644 --- a/json-path/build.gradle +++ b/json-path/build.gradle @@ -1,4 +1,3 @@ -apply from: "$rootDir/gradle/publishMaven.gradle" description = "Java port of Stefan Goessner JsonPath." @@ -12,17 +11,18 @@ jar { } dependencies { - compile libs.jsonSmart - compile libs.slf4jApi - compile libs.jacksonDatabind, optional - compile libs.gson, optional - compile libs.jsonOrg, optional - compile libs.tapestryJson, optional - compile libs.jettison, optional - compile libs.jakartaJsonP, optional - compile libs.jakartaJsonB, optional + implementation libs.jsonSmart + implementation libs.slf4jApi + implementation libs.jacksonDatabind // , optional + implementation libs.gson// , optional + implementation libs.jsonOrg// , optional + implementation libs.tapestryJson// , optional + implementation libs.jettison// , optional + implementation libs.jakartaJsonP// , optional + implementation libs.jakartaJsonB// , optional - testCompile libs.test + testImplementation libs.test + testRuntimeOnly 'org.junit.vintage:junit-vintage-engine' } task distZip(type: Zip, dependsOn: assemble) { @@ -37,31 +37,31 @@ task distZip(type: Zip, dependsOn: assemble) { from(jar) { into 'lib' } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib' exclude { it.file.name.contains('gson') || it.file.name.contains('jackson') || it.file.name.contains('json-2') || it.file.name.contains('jettison') || it.file.name.contains('tapestry') || it.file.name.contains('jakarta.json') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/jackson' include { it.file.name.contains('jackson') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/gson' include { it.file.name.contains('gson') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/jettison' include { it.file.name.contains('jettison') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/jsonOrg' include { it.file.name.contains('json-2') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/tapestry' include { it.file.name.contains('tapestry') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/jakartaJson' include { it.file.name.contains('jakarta.json') } } @@ -81,31 +81,31 @@ task distTar(type: Tar, dependsOn: assemble) { from(jar) { into 'lib' } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib' exclude { it.file.name.contains('gson') || it.file.name.contains('jackson') || it.file.name.contains('json-2') || it.file.name.contains('jettison') || it.file.name.contains('tapestry') || it.file.name.contains('jakarta.json') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/jackson' include { it.file.name.contains('jackson') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/gson' include { it.file.name.contains('gson') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/jettison' include { it.file.name.contains('jettison') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/jsonOrg' include { it.file.name.contains('json-2') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/tapestry' include { it.file.name.contains('tapestry') } } - from(project.configurations.compile) { + from(project.configurations.implementation) { into 'lib-optional/jakartaJson' include { it.file.name.contains('jakarta.json') } }