diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd1838a8c0..64d5dd04d3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ on: pull_request: env: - build_java_version: 21 + build_java_version: 25 jobs: build: @@ -48,6 +48,7 @@ jobs: - 11 - 17 - 21 + - 25 runs-on: ${{ matrix.os }} steps: - name: Checkout @@ -97,6 +98,7 @@ jobs: - 11 - 17 - 21 + - 25 runs-on: ${{ matrix.os }} steps: - name: Checkout diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 0bf9d7ae7f..162de7b08f 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -15,7 +15,7 @@ jobs: uses: actions/setup-java@v5.2.0 with: distribution: 'zulu' - java-version: 17 + java-version: 25 - name: Update Gradle Wrapper uses: gradle-update/update-gradle-wrapper-action@v2.1.0 diff --git a/archunit/build.gradle b/archunit/build.gradle index 0eda647d7a..38bc20162e 100644 --- a/archunit/build.gradle +++ b/archunit/build.gradle @@ -92,7 +92,7 @@ compileJdk9mainJava { dependsOn(compileJava) ext.minimumJavaVersion = JavaVersion.VERSION_1_9 - destinationDir = compileJava.destinationDir + destinationDirectory.set(compileJava.destinationDirectory.get()) } javadoc.dependsOn(compileJdk9mainJava) spotbugsMain.dependsOn(compileJdk9mainJava) diff --git a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterAccessesTest.java b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterAccessesTest.java index bfd12c55ea..afad7f61bd 100644 --- a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterAccessesTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterAccessesTest.java @@ -459,7 +459,10 @@ String covariantlyOverriddenCausingBridgeMethod() { JavaMethodCall callFromBridgeMethodToOverriddenOne = getOnlyElement( new ClassFileImporter().importClasses(Parent.class, Child.class) .get(Child.class) - .getMethodCallsFromSelf()); + .getMethodCallsFromSelf() + .stream() + .filter(call -> call.getOrigin().isMethod()) + .collect(toSet())); JavaCodeUnit bridgeMethod = callFromBridgeMethodToOverriddenOne.getOrigin(); assertThat(bridgeMethod.getName()).isEqualTo("covariantlyOverriddenCausingBridgeMethod"); @@ -1146,10 +1149,11 @@ void call(Target target) { } } - JavaMethodCall call = getOnlyElement(new ClassFileImporter() - .importClasses(Origin.class, Target.class) - .get(Origin.class) - .getMethodCallsFromSelf()); + JavaMethodCall call = getOnlyElement( + new ClassFileImporter().importClasses(Origin.class, Target.class) + .get(Origin.class) + .getMethod("call", Target.class) + .getMethodCallsFromSelf()); assertThat(call.getTarget().getParameterTypes()) .isEqualTo(call.getTarget().getRawParameterTypes()); @@ -1193,10 +1197,13 @@ void call(Target target) { } } - JavaClass origin = new ClassFileImporter().importClasses(Origin.class, Target.class).get(Origin.class); - - assertThat(origin.getMethodCallsFromSelf()).hasSize(2); - for (JavaMethodCall call : origin.getMethodCallsFromSelf()) { + Set methodCallsFromSelf = + new ClassFileImporter().importClasses(Origin.class, Target.class) + .get(Origin.class) + .getMethod("call", Target.class) + .getMethodCallsFromSelf(); + assertThat(methodCallsFromSelf).hasSize(2); + for (JavaMethodCall call : methodCallsFromSelf) { assertThatCall(call).isTo("callMe"); } } diff --git a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterAutomaticResolutionTest.java b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterAutomaticResolutionTest.java index c394871fb6..83f5320362 100644 --- a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterAutomaticResolutionTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterAutomaticResolutionTest.java @@ -71,6 +71,7 @@ import static com.tngtech.java.junit.dataprovider.DataProviders.$; import static com.tngtech.java.junit.dataprovider.DataProviders.$$; import static com.tngtech.java.junit.dataprovider.DataProviders.testForEach; +import static java.util.stream.Collectors.toSet; @RunWith(DataProviderRunner.class) public class ClassFileImporterAutomaticResolutionTest { @@ -349,9 +350,13 @@ void resolvesMethodCallTargetOwner() { } } - JavaClass javaClass = ImporterWithAdjustedResolutionRuns.disableAllIterationsExcept(MAX_ITERATIONS_FOR_ACCESSES_TO_TYPES_PROPERTY_NAME) - .importClass(Origin.class); - JavaMethodCall call = getOnlyElement(javaClass.getMethodCallsFromSelf()); + JavaMethodCall call = getOnlyElement( + ImporterWithAdjustedResolutionRuns.disableAllIterationsExcept(MAX_ITERATIONS_FOR_ACCESSES_TO_TYPES_PROPERTY_NAME) + .importClass(Origin.class) + .getMethodCallsFromSelf() + .stream() + .filter(c -> c.getOrigin().isMethod()) + .collect(toSet())); assertThat(call.getTargetOwner()).isFullyImported(true); } diff --git a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterLambdaDependenciesTest.java b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterLambdaDependenciesTest.java index 7942fedade..b1c3dd42b4 100644 --- a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterLambdaDependenciesTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterLambdaDependenciesTest.java @@ -67,8 +67,11 @@ Runnable call() { } } - JavaClasses classes = new ClassFileImporter().importClasses(Target.class, Caller.class); - JavaMethodCall call = getOnlyElement(classes.get(Caller.class).getMethodCallsFromSelf()); + JavaMethodCall call = getOnlyElement( + new ClassFileImporter().importClasses(Target.class, Caller.class) + .get(Caller.class) + .getMethod("call") + .getMethodCallsFromSelf()); assertThatCall(call).isFrom("call").isTo(Target.class, "target"); } @@ -171,8 +174,11 @@ Consumer call() { } } - JavaClasses classes = new ClassFileImporter().importClasses(Target.class, Caller.class); - JavaMethodCall call = getOnlyElement(classes.get(Caller.class).getMethodCallsFromSelf()); + JavaMethodCall call = getOnlyElement( + new ClassFileImporter().importClasses(Target.class, Caller.class) + .get(Caller.class) + .getMethod("call") + .getMethodCallsFromSelf()); assertThatCall(call).isFrom("call").isTo(Target.class, "target", String.class); } @@ -195,8 +201,11 @@ Supplier call() { } } - JavaClasses classes = new ClassFileImporter().importClasses(Target.class, Caller.class); - JavaMethodCall call = getOnlyElement(classes.get(Caller.class).getMethodCallsFromSelf()); + JavaMethodCall call = getOnlyElement( + new ClassFileImporter().importClasses(Target.class, Caller.class) + .get(Caller.class) + .getMethod("call") + .getMethodCallsFromSelf()); assertThatCall(call).isFrom("call").isTo(Target.class, "target"); } @@ -251,8 +260,10 @@ Runnable call() { } } - JavaClasses classes = new ClassFileImporter().importClasses(Target.class, Caller.class); - Set calls = classes.get(Caller.class).getMethodCallsFromSelf(); + Set calls = new ClassFileImporter().importClasses(Target.class, Caller.class) + .get(Caller.class) + .getMethod("call") + .getMethodCallsFromSelf(); assertThat(calls).hasSize(2); calls.forEach(call -> assertThatCall(call).isFrom("call").isTo(Target.class, "target")); @@ -284,8 +295,12 @@ Function call2() { } } - JavaClasses classes = new ClassFileImporter().importClasses(Target.class, Caller.class); - Set calls = classes.get(Caller.class).getMethodCallsFromSelf(); + Set calls = new ClassFileImporter().importClasses(Target.class, Caller.class) + .get(Caller.class) + .getMethodCallsFromSelf() + .stream() + .filter(call -> call.getOrigin().isMethod()) + .collect(toSet()); assertThat(calls).hasSize(5); assertThat(filterOriginByName(calls, "call1")) @@ -361,10 +376,14 @@ Supplier call() { JavaClasses classes = new ClassFileImporter().importClasses(Target.class, Caller1.class, Caller2.class); - JavaMethodCall call1 = getOnlyElement(classes.get(Caller1.class).getMethodCallsFromSelf()); + JavaMethodCall call1 = getOnlyElement(classes.get(Caller1.class) + .getMethod("call") + .getMethodCallsFromSelf()); assertThatCall(call1).isFrom("call").isTo(Target.class, "target"); - JavaMethodCall call2 = getOnlyElement(classes.get(Caller2.class).getMethodCallsFromSelf()); + JavaMethodCall call2 = getOnlyElement(classes.get(Caller2.class) + .getMethod("call") + .getMethodCallsFromSelf()); assertThatCall(call2).isFrom("call").isTo(Target.class, "target"); } diff --git a/build.gradle b/build.gradle index e954162853..600563fd78 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ ext { ] minSupportedJavaVersion = JavaVersion.VERSION_1_8 - maxSupportedJavaVersion = JavaVersion.VERSION_21 + maxSupportedJavaVersion = JavaVersion.VERSION_25 isTestBuild = project.hasProperty('testJavaVersion') configuredTestJavaVersion = project.findProperty('testJavaVersion')?.toString()?.with { JavaVersion.toVersion(it) } assert configuredTestJavaVersion <= maxSupportedJavaVersion: diff --git a/buildSrc/src/main/groovy/archunit.java-release-publishing-conventions.gradle b/buildSrc/src/main/groovy/archunit.java-release-publishing-conventions.gradle index 4eba9c9396..9b3cadf2d0 100644 --- a/buildSrc/src/main/groovy/archunit.java-release-publishing-conventions.gradle +++ b/buildSrc/src/main/groovy/archunit.java-release-publishing-conventions.gradle @@ -28,7 +28,7 @@ tasks.withType(AbstractPublishToMaven) { publishing { publications { mavenJava(MavenPublication) { - artifactId = project.archivesBaseName + artifactId = project.name from components.java pom { name = app.name diff --git a/buildSrc/src/main/groovy/archunit.java-version-conventions.gradle b/buildSrc/src/main/groovy/archunit.java-version-conventions.gradle index 4caec4a8d7..f3cd916b52 100644 --- a/buildSrc/src/main/groovy/archunit.java-version-conventions.gradle +++ b/buildSrc/src/main/groovy/archunit.java-version-conventions.gradle @@ -3,7 +3,8 @@ class VersionSpec { JavaVersion.VERSION_1_8, JavaVersion.VERSION_11, JavaVersion.VERSION_17, - JavaVersion.VERSION_21 + JavaVersion.VERSION_21, + JavaVersion.VERSION_25, ] as SortedSet JavaVersion desiredJdkVersion @@ -43,11 +44,10 @@ afterEvaluate { toolchain { languageVersion = versionSpec.desiredJavaLanguageVersion } + sourceCompatibility = versionSpec.desiredSourceCompatibility + targetCompatibility = versionSpec.desiredSourceCompatibility } - sourceCompatibility = versionSpec.desiredSourceCompatibility - targetCompatibility = versionSpec.desiredSourceCompatibility - tasks.withType(JavaCompile) { Task task -> VersionSpec taskVersionSpec = versionSpec.withLowerLtsVersionBoundCompatibleWith(getMinTaskJavaVersion(task)) println "Task ${task.name} configured: ${taskVersionSpec.describe()}" diff --git a/buildSrc/src/main/groovy/archunit.license-conventions.gradle b/buildSrc/src/main/groovy/archunit.license-conventions.gradle index 921f6e71bd..341e0a29f5 100644 --- a/buildSrc/src/main/groovy/archunit.license-conventions.gradle +++ b/buildSrc/src/main/groovy/archunit.license-conventions.gradle @@ -29,7 +29,7 @@ dependencies { def parseLicenseInfoFrom = { config -> def pom = config.resolve().find { it.name.endsWith('.pom') } - def projectNode = new XmlParser().parse(pom) + def projectNode = new groovy.xml.XmlParser().parse(pom) def licenses = projectNode.licenses.license assert licenses.size() == 1: 'Can only handle one declared license at the moment' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55baa..d997cfc60f 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 78cb6e16a4..c61a118f7d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a9367..739907dfd1 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee845..e509b2dd8f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell