This is an automated email from the ASF dual-hosted git repository.

He-Pin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pekko.git


The following commit(s) were added to refs/heads/main by this push:
     new 4ae53394ac feat: add Scala 3.8.4 cross-compilation target (#3295)
4ae53394ac is described below

commit 4ae53394acaa1a302348855d64d3addecd675e13
Author: He-Pin(kerr) <[email protected]>
AuthorDate: Mon Jul 6 19:14:27 2026 +0800

    feat: add Scala 3.8.4 cross-compilation target (#3295)
    
    * feat: add Scala next cross-build coverage
    
    Motivation:\nPrepare the build for the next Scala 3 LTS lane while keeping 
published Scala artifacts on the current 2.13.x and 3.3.x release 
lines.\n\nModification:\nCentralize the next Scala version lookup for CI, keep 
published crossScalaVersions on release lanes, force the next lane only in 
build/test matrices, and fix Scala 3.8.4 compile, MiMa, and formatting 
issues.\n\nResult:\n2.13.x, 3.3.8, and 3.8.4 build/test coverage can run while 
MiMa and publishing remain on published Scal [...]
    
    * fix: address Scala 3.8 Jackson review feedback
    
    Motivation:
    PR #3295 review requested reverting the local Jackson enumeration 
serializer and disabling tests broken by jackson-module-scala on Scala 3.8.
    
    Modification:
    Restore PekkoJacksonModule and the Jackson module order to the upstream 
implementation, and mark the legacy Scala Enumeration serialization round-trip 
test pendingUntilFixed only on Scala 3.8+.
    
    Result:
    The Scala 3.8 cross-build no longer carries a local Jackson workaround 
while affected legacy Enumeration tests are disabled until the upstream Jackson 
issue is fixed.
    
    Tests:
    - sbt -Dpekko.mima.enabled=false ";++ 3.8.4!; serialization-jackson / Test 
/ testOnly org.apache.pekko.serialization.jackson.JacksonJsonSerializerSpec -- 
-z Enumeration; serialization-jackson / Test / testOnly 
org.apache.pekko.serialization.jackson.JacksonCborSerializerSpec -- -z 
Enumeration"
    - sbt -Dpekko.mima.enabled=false ";++ 3.3.8!; serialization-jackson / Test 
/ testOnly org.apache.pekko.serialization.jackson.JacksonJsonSerializerSpec -- 
-z Enumeration; serialization-jackson / Test / testOnly 
org.apache.pekko.serialization.jackson.JacksonCborSerializerSpec -- -z 
Enumeration; ++ 2.13.18!; serialization-jackson / Test / testOnly 
org.apache.pekko.serialization.jackson.JacksonJsonSerializerSpec -- -z 
Enumeration; serialization-jackson / Test / testOnly org.apache.pekko.s [...]
    - scalafmt --mode diff-ref=origin/main
    - scalafmt --list --mode diff-ref=origin/main
    - git diff --check
    
    References:
    Refs #3295
    
    * fix: avoid unnecessary OutputStream alias
    
    Motivation:
    Keep the Scala 3.8 compatibility changes minimal and avoid unnecessary Java 
type aliases in stream internals.
    
    Modification:
    Use java.io.OutputStream directly in OutputStreamSourceStage instead of 
aliasing it as JavaOutputStream.
    
    Result:
    The stream source stage keeps the original OutputStream naming while still 
compiling across the PR Scala versions.
    
    Tests:
    - sbt -Dpekko.mima.enabled=false ";++ 3.8.4!; stream / Compile / compile; 
++ 3.3.8!; stream / Compile / compile; ++ 2.13.18!; stream / Compile / compile"
    - scalafmt --mode diff-ref=origin/main
    - scalafmt --list --mode diff-ref=origin/main
    - git diff --check
    
    References:
    Refs #3295
---
 .github/scripts/resolve-scala-version.sh           | 49 ++++++++++++++++++++++
 .github/workflows/binary-compatibility-checks.yml  |  7 +++-
 .github/workflows/build-test-prValidation.yml      |  8 ++--
 .../typed/scaladsl/BehaviorTestKitSpec.scala       |  6 ++-
 .../apache/pekko/actor/AbstractFSMActorTest.java   |  1 +
 .../apache/pekko/actor/StashJavaAPITestActors.java |  1 +
 .../jdocs/org/apache/pekko/typed/Aggregator.java   |  1 +
 .../jdocs/org/apache/pekko/typed/TailChopping.java |  1 +
 .../pekko/actor/typed/ActorContextSpec.scala       |  3 +-
 .../pekko/actor/typed/javadsl/Behaviors.scala      | 15 ++++---
 .../java/org/apache/pekko/util/OptionalUtil.java   |  4 +-
 build.sbt                                          |  2 +-
 .../cluster/MultiDcHeartbeatTakingOverSpec.scala   |  6 ++-
 .../pekko/cluster/MultiDcSunnyWeatherSpec.scala    |  6 ++-
 docs/src/test/java/jdocs/actor/ActorDocTest.java   |  1 +
 .../LambdaPersistencePluginDocTest.java            |  1 +
 .../persistence/fsm/AbstractPersistentFSMTest.java |  1 +
 project/Dependencies.scala                         |  5 ++-
 project/JdkOptions.scala                           |  5 ++-
 project/PekkoBuild.scala                           | 17 ++++++--
 .../jackson/JacksonSerializerSpec.scala            | 14 ++++++-
 .../org/apache/pekko/stream/javadsl/FlowTest.java  |  2 +-
 .../org/apache/pekko/stream/impl/fusing/Ops.scala  |  6 ++-
 23 files changed, 134 insertions(+), 28 deletions(-)

diff --git a/.github/scripts/resolve-scala-version.sh 
b/.github/scripts/resolve-scala-version.sh
new file mode 100644
index 0000000000..5b23af2518
--- /dev/null
+++ b/.github/scripts/resolve-scala-version.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+set -euo pipefail
+
+scala_version="${1:?scala version is required}"
+repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
+
+resolve_from_build() {
+  local pattern="$1"
+  local resolved
+  resolved="$(sed -n "$pattern" "$repo_root/project/Dependencies.scala")"
+  if [ -z "$resolved" ]; then
+    echo "Unable to resolve Scala version '$scala_version' from 
project/Dependencies.scala" >&2
+    exit 1
+  fi
+  printf '%s\n' "$resolved"
+}
+
+case "$scala_version" in
+  2.13 | 2.13.x | scala213)
+    resolve_from_build 's/.*val scala213Version = "\(.*\)".*/\1/p'
+    ;;
+  3.3 | 3.3.x | scala3)
+    resolve_from_build 's/.*val scala3Version = "\(.*\)".*/\1/p'
+    ;;
+  next)
+    resolve_from_build 's/.*val scala3NextVersion = "\(.*\)".*/\1/p'
+    ;;
+  *)
+    printf '%s\n' "$scala_version"
+    ;;
+esac
diff --git a/.github/workflows/binary-compatibility-checks.yml 
b/.github/workflows/binary-compatibility-checks.yml
index 0c0457dd25..36ba4c2c4c 100644
--- a/.github/workflows/binary-compatibility-checks.yml
+++ b/.github/workflows/binary-compatibility-checks.yml
@@ -66,7 +66,12 @@ jobs:
 
       - name: Report MiMa Binary Issues
         run: |-
-          sbt +mimaReportBinaryIssues
+          # MiMa checks published binary compatibility. The next-Scala lane is
+          # compile/test only and can produce different synthetic signatures 
from
+          # the current published Scala 3 LTS artifacts.
+          scala_2_13="$(sed -n 's/.*val scala213Version = "\(.*\)".*/\1/p' 
project/Dependencies.scala)"
+          scala_3="$(sed -n 's/.*val scala3Version = "\(.*\)".*/\1/p' 
project/Dependencies.scala)"
+          sbt "++${scala_2_13}!" mimaReportBinaryIssues "++${scala_3}!" 
mimaReportBinaryIssues
 
       - name: Check correct MiMa filter directories
         run: |
diff --git a/.github/workflows/build-test-prValidation.yml 
b/.github/workflows/build-test-prValidation.yml
index 77babd0204..357d9576ce 100644
--- a/.github/workflows/build-test-prValidation.yml
+++ b/.github/workflows/build-test-prValidation.yml
@@ -59,7 +59,7 @@ jobs:
       DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
     strategy:
       matrix:
-        scalaVersion: ["2.13.x", "3.3.x"]
+        scalaVersion: ["scala213", "scala3", "next"]
     steps:
       - name: Checkout
         uses: actions/[email protected]
@@ -86,6 +86,7 @@ jobs:
 
       - name: sbt validateCompile
         run: |-
+          scala_version="$(bash .github/scripts/resolve-scala-version.sh "${{ 
matrix.scalaVersion }}")"
           sbt \
           -Dpekko.mima.enabled=false \
           -Dpekko.test.multi-in-test=false \
@@ -97,10 +98,11 @@ jobs:
           -Dpekko.test.multi-node=false \
           -Dsbt.log.noformat=false \
           -Dpekko.log.timestamps=true \
-          "++ ${{ matrix.scalaVersion }} validateCompile"
+          "++ ${scala_version}! validateCompile"
 
       - name: sbt validatePullRequest
         run: |-
+          scala_version="$(bash .github/scripts/resolve-scala-version.sh "${{ 
matrix.scalaVersion }}")"
           sbt \
           -Dpekko.mima.enabled=false \
           -Dpekko.test.multi-in-test=false \
@@ -113,7 +115,7 @@ jobs:
           -Dsbt.log.noformat=false \
           -Dpekko.log.timestamps=true \
           -Dio.netty.leakDetection.level=PARANOID \
-          "++ ${{ matrix.scalaVersion }} validatePullRequest"
+          "++ ${scala_version}! validatePullRequest"
 
   pekko-classic-remoting-tests:
     name: Pekko Classic Remoting Tests
diff --git 
a/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
 
b/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
index b49ab7c3bb..dd88f16c83 100644
--- 
a/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
+++ 
b/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
@@ -128,7 +128,11 @@ object BehaviorTestKitSpec {
               replyTo ! Done
               Behaviors.same
             case CreateMessageAdapter(messageClass, f, replyTo) =>
-              val adaptor = context.messageAdapter(f)(ClassTag(messageClass))
+              def createAdapter[U](messageClass: Class[U], f: U => Command): 
ActorRef[U] = {
+                implicit val classTag: ClassTag[U] = ClassTag(messageClass)
+                context.messageAdapter(f)
+              }
+              val adaptor = createAdapter(messageClass, f)
               replyTo.foreach(_ ! adaptor.unsafeUpcast)
               Behaviors.same
             case Log(what) =>
diff --git 
a/actor-tests/src/test/java/org/apache/pekko/actor/AbstractFSMActorTest.java 
b/actor-tests/src/test/java/org/apache/pekko/actor/AbstractFSMActorTest.java
index 332ea5bd00..323c68e11a 100644
--- a/actor-tests/src/test/java/org/apache/pekko/actor/AbstractFSMActorTest.java
+++ b/actor-tests/src/test/java/org/apache/pekko/actor/AbstractFSMActorTest.java
@@ -19,6 +19,7 @@ import org.apache.pekko.testkit.TestProbe;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
+@SuppressWarnings("unchecked")
 public class AbstractFSMActorTest {
 
   // javac produces an `unchecked` warning about 
`akka$actor$FSM$$transitionEvent`
diff --git 
a/actor-tests/src/test/java/org/apache/pekko/actor/StashJavaAPITestActors.java 
b/actor-tests/src/test/java/org/apache/pekko/actor/StashJavaAPITestActors.java
index 3fc9df6f08..75bdc5ffe1 100644
--- 
a/actor-tests/src/test/java/org/apache/pekko/actor/StashJavaAPITestActors.java
+++ 
b/actor-tests/src/test/java/org/apache/pekko/actor/StashJavaAPITestActors.java
@@ -15,6 +15,7 @@ package org.apache.pekko.actor;
 
 import static org.junit.jupiter.api.Assertions.*;
 
+@SuppressWarnings("unchecked")
 public class StashJavaAPITestActors {
 
   /*
diff --git 
a/actor-typed-tests/src/test/java/jdocs/org/apache/pekko/typed/Aggregator.java 
b/actor-typed-tests/src/test/java/jdocs/org/apache/pekko/typed/Aggregator.java
index 309444fd5c..4026783ab3 100644
--- 
a/actor-typed-tests/src/test/java/jdocs/org/apache/pekko/typed/Aggregator.java
+++ 
b/actor-typed-tests/src/test/java/jdocs/org/apache/pekko/typed/Aggregator.java
@@ -26,6 +26,7 @@ import org.apache.pekko.actor.typed.javadsl.ActorContext;
 import org.apache.pekko.actor.typed.javadsl.Behaviors;
 import org.apache.pekko.actor.typed.javadsl.Receive;
 
+@SuppressWarnings("unchecked")
 public class Aggregator<Reply, Aggregate> extends 
AbstractBehavior<Aggregator.Command> {
 
   interface Command {}
diff --git 
a/actor-typed-tests/src/test/java/jdocs/org/apache/pekko/typed/TailChopping.java
 
b/actor-typed-tests/src/test/java/jdocs/org/apache/pekko/typed/TailChopping.java
index d6a2b56840..f0213d7de6 100644
--- 
a/actor-typed-tests/src/test/java/jdocs/org/apache/pekko/typed/TailChopping.java
+++ 
b/actor-typed-tests/src/test/java/jdocs/org/apache/pekko/typed/TailChopping.java
@@ -24,6 +24,7 @@ import org.apache.pekko.actor.typed.javadsl.Behaviors;
 import org.apache.pekko.actor.typed.javadsl.Receive;
 import org.apache.pekko.actor.typed.javadsl.TimerScheduler;
 
+@SuppressWarnings("unchecked")
 public class TailChopping<Reply> extends 
AbstractBehavior<TailChopping.Command> {
 
   interface Command {}
diff --git 
a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ActorContextSpec.scala
 
b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ActorContextSpec.scala
index a445723e75..05c2a56f45 100644
--- 
a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ActorContextSpec.scala
+++ 
b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ActorContextSpec.scala
@@ -661,7 +661,8 @@ abstract class ActorContextSpec extends 
ScalaTestWithActorTestKit with AnyWordSp
 
     "not allow null messages" in {
       // Scala 3 doesn't generate an implicit `ClassTag[Null]` 
(https://github.com/lampepfl/dotty/issues/9586)
-      val actor = 
spawn(decoration[Null](ClassTag.Null).apply(Behaviors.empty[Null]))
+      implicit val classTag: ClassTag[Null] = ClassTag.Null
+      val actor = spawn(decoration[Null].apply(Behaviors.empty[Null]))
       intercept[InvalidMessageException] {
         actor ! null
       }
diff --git 
a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/Behaviors.scala
 
b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/Behaviors.scala
index bc3ee7b8a0..41e8a8b678 100644
--- 
a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/Behaviors.scala
+++ 
b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/Behaviors.scala
@@ -234,8 +234,10 @@ object Behaviors {
    * @param monitor The messages will also be sent to this `ActorRef`
    * @param behavior The inner behavior that is decorated
    */
-  def monitor[T](interceptMessageClass: Class[T], monitor: ActorRef[T], 
behavior: Behavior[T]): Behavior[T] =
-    scaladsl.Behaviors.monitor(monitor, 
behavior)(ClassTag(interceptMessageClass))
+  def monitor[T](interceptMessageClass: Class[T], monitor: ActorRef[T], 
behavior: Behavior[T]): Behavior[T] = {
+    implicit val classTag: ClassTag[T] = ClassTag(interceptMessageClass)
+    scaladsl.Behaviors.monitor(monitor, behavior)
+  }
 
   /**
    * Behavior decorator that logs all messages to the 
[[pekko.actor.typed.Behavior]] using the provided
@@ -332,8 +334,10 @@ object Behaviors {
   def transformMessages[Outer, Inner](
       interceptMessageClass: Class[Outer],
       behavior: Behavior[Inner],
-      selector: JFunction[PFBuilder[Outer, Inner], PFBuilder[Outer, Inner]]): 
Behavior[Outer] =
-    BehaviorImpl.transformMessages(behavior, selector.apply(new 
PFBuilder).build())(ClassTag(interceptMessageClass))
+      selector: JFunction[PFBuilder[Outer, Inner], PFBuilder[Outer, Inner]]): 
Behavior[Outer] = {
+    implicit val classTag: ClassTag[Outer] = ClassTag(interceptMessageClass)
+    BehaviorImpl.transformMessages(behavior, selector.apply(new 
PFBuilder).build())
+  }
 
   /**
    * Support for scheduled `self` messages in an actor.
@@ -413,7 +417,8 @@ object Behaviors {
         asScalaMap(mdcForMessage.apply(message))
       }
 
-    WithMdcBehaviorInterceptor[T](asScalaMap(staticMdc), mdcForMessageFun, 
behavior)(ClassTag(interceptMessageClass))
+    implicit val classTag: ClassTag[T] = ClassTag(interceptMessageClass)
+    WithMdcBehaviorInterceptor[T](asScalaMap(staticMdc), mdcForMessageFun, 
behavior)
   }
 
 }
diff --git a/actor/src/main/java/org/apache/pekko/util/OptionalUtil.java 
b/actor/src/main/java/org/apache/pekko/util/OptionalUtil.java
index 9041299ba4..a459e61148 100644
--- a/actor/src/main/java/org/apache/pekko/util/OptionalUtil.java
+++ b/actor/src/main/java/org/apache/pekko/util/OptionalUtil.java
@@ -47,7 +47,7 @@ public final class OptionalUtil {
   // since an implicit cast from java.lang.Long to scala.Long is not available 
in Java source
   public static scala.Option<Object> convertOptionalToScala(OptionalLong o) {
     if (o.isPresent()) {
-      return new scala.Some(o.getAsLong());
+      return new scala.Some<Object>(o.getAsLong());
     } else {
       return scala.Option.empty();
     }
@@ -57,7 +57,7 @@ public final class OptionalUtil {
   // since an implicit cast from java.lang.Int to scala.Int is not available 
in Java source
   public static scala.Option<Object> convertOptionalToScala(OptionalInt o) {
     if (o.isPresent()) {
-      return new scala.Some(o.getAsInt());
+      return new scala.Some<Object>(o.getAsInt());
     } else {
       return scala.Option.empty();
     }
diff --git a/build.sbt b/build.sbt
index b2fc153f84..4af38b5c57 100644
--- a/build.sbt
+++ b/build.sbt
@@ -9,7 +9,7 @@
 
 import 
net.bzzt.reproduciblebuilds.ReproducibleBuildsPlugin.reproducibleBuildsCheckResolver
 
-scalaVersion := Dependencies.allScalaVersions.head
+scalaVersion := Dependencies.publishedScalaVersions.head
 
 ThisBuild / versionScheme := Some(VersionScheme.SemVerSpec)
 // Add  (Jupiter) test runtime to all modules for sbt-jupiter-interface 
discovery
diff --git 
a/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/MultiDcHeartbeatTakingOverSpec.scala
 
b/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/MultiDcHeartbeatTakingOverSpec.scala
index 3a61ef4643..558b6f5d27 100644
--- 
a/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/MultiDcHeartbeatTakingOverSpec.scala
+++ 
b/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/MultiDcHeartbeatTakingOverSpec.scala
@@ -196,13 +196,15 @@ abstract class MultiDcHeartbeatTakingOverSpec extends 
MultiNodeClusterSpec(Multi
    * strongly guarantee the order of "oldest" members, as they're linearized 
by the order in which they become Up
    * (since marking that transition is a Leader action).
    */
-  private def membersByAge(dataCenter: ClusterSettings.DataCenter): 
immutable.SortedSet[Member] =
+  private def membersByAge(dataCenter: ClusterSettings.DataCenter): 
immutable.SortedSet[Member] = {
+    implicit val memberOrdering: Ordering[Member] = Member.ageOrdering
     SortedSet
-      .empty(Member.ageOrdering)
+      .empty[Member]
       .union(
         cluster.state.members.filter(m =>
           m.dataCenter == dataCenter &&
           m.status != MemberStatus.Joining && m.status != 
MemberStatus.WeaklyUp))
+  }
 
   /** INTERNAL API */
   @InternalApi
diff --git 
a/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/MultiDcSunnyWeatherSpec.scala
 
b/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/MultiDcSunnyWeatherSpec.scala
index dece03ecdd..03e344007a 100644
--- 
a/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/MultiDcSunnyWeatherSpec.scala
+++ 
b/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/MultiDcSunnyWeatherSpec.scala
@@ -157,13 +157,15 @@ abstract class MultiDcSunnyWeatherSpec extends 
MultiNodeClusterSpec(MultiDcSunny
    * strongly guarantee the order of "oldest" members, as they're linearized 
by the order in which they become Up
    * (since marking that transition is a Leader action).
    */
-  private def membersByAge(dataCenter: ClusterSettings.DataCenter): 
immutable.SortedSet[Member] =
+  private def membersByAge(dataCenter: ClusterSettings.DataCenter): 
immutable.SortedSet[Member] = {
+    implicit val memberOrdering: Ordering[Member] = Member.ageOrdering
     SortedSet
-      .empty(Member.ageOrdering)
+      .empty[Member]
       .union(
         cluster.state.members.filter(m =>
           m.dataCenter == dataCenter &&
           m.status != MemberStatus.Joining && m.status != 
MemberStatus.WeaklyUp))
+  }
 
   /** INTERNAL API */
   @InternalApi
diff --git a/docs/src/test/java/jdocs/actor/ActorDocTest.java 
b/docs/src/test/java/jdocs/actor/ActorDocTest.java
index e5e919947e..af44e71b1f 100644
--- a/docs/src/test/java/jdocs/actor/ActorDocTest.java
+++ b/docs/src/test/java/jdocs/actor/ActorDocTest.java
@@ -61,6 +61,7 @@ import org.apache.pekko.actor.Terminated;
 
 // #import-terminated
 
+@SuppressWarnings("unchecked")
 public class ActorDocTest extends AbstractJavaTest {
 
   public static Config config =
diff --git 
a/docs/src/test/java/jdocs/persistence/LambdaPersistencePluginDocTest.java 
b/docs/src/test/java/jdocs/persistence/LambdaPersistencePluginDocTest.java
index 0035109ba1..5fbc407e20 100644
--- a/docs/src/test/java/jdocs/persistence/LambdaPersistencePluginDocTest.java
+++ b/docs/src/test/java/jdocs/persistence/LambdaPersistencePluginDocTest.java
@@ -35,6 +35,7 @@ import org.apache.pekko.persistence.snapshot.japi.*;
 // #plugin-imports
 import org.iq80.leveldb.util.FileUtils;
 
+@SuppressWarnings({"deprecation", "unchecked"})
 public class LambdaPersistencePluginDocTest {
 
   static Object o1 =
diff --git 
a/persistence/src/test/java/org/apache/pekko/persistence/fsm/AbstractPersistentFSMTest.java
 
b/persistence/src/test/java/org/apache/pekko/persistence/fsm/AbstractPersistentFSMTest.java
index 447d5277c4..32d2cf1f71 100644
--- 
a/persistence/src/test/java/org/apache/pekko/persistence/fsm/AbstractPersistentFSMTest.java
+++ 
b/persistence/src/test/java/org/apache/pekko/persistence/fsm/AbstractPersistentFSMTest.java
@@ -20,6 +20,7 @@ import java.util.List;
 import org.apache.pekko.actor.*;
 
 @Deprecated
+@SuppressWarnings("unchecked")
 public class AbstractPersistentFSMTest {
   // tests have been removed because of flaky test failures, see PR
   // https://github.com/akka/akka/pull/31128
diff --git a/project/Dependencies.scala b/project/Dependencies.scala
index cdea158aab..9ac27fe370 100644
--- a/project/Dependencies.scala
+++ b/project/Dependencies.scala
@@ -44,7 +44,8 @@ object Dependencies {
 
   val scala213Version = "2.13.18"
   val scala3Version = "3.3.8"
-  val allScalaVersions = Seq(scala213Version, scala3Version)
+  val scala3NextVersion = "3.8.4"
+  val publishedScalaVersions = Seq(scala213Version, scala3Version)
 
   val reactiveStreamsVersion = "1.0.4"
 
@@ -52,7 +53,7 @@ object Dependencies {
   val scalaTestScalaCheckVersion = "1-19"
   val scalaCheckVersion = "1.19.0"
 
-  val Versions = Seq(crossScalaVersions := allScalaVersions, scalaVersion := 
allScalaVersions.head)
+  val Versions = Seq(crossScalaVersions := publishedScalaVersions, 
scalaVersion := publishedScalaVersions.head)
 
   object Compile {
     // Compile
diff --git a/project/JdkOptions.scala b/project/JdkOptions.scala
index 99291c99e1..931d3fa86e 100644
--- a/project/JdkOptions.scala
+++ b/project/JdkOptions.scala
@@ -37,7 +37,10 @@ object JdkOptions extends AutoPlugin {
 
   def targetJdkScalacOptions(scalaVersion: String): Seq[String] =
     Seq("-release", JdkOptions.targetJavaVersion) ++ {
-      if (scalaVersion.startsWith("3.")) Seq(s"-Xtarget:${targetJavaVersion}") 
else Seq.empty
+      CrossVersion.partialVersion(scalaVersion) match {
+        case Some((3, minor)) if minor < 8 => 
Seq(s"-Xtarget:${targetJavaVersion}")
+        case _                             => Seq.empty
+      }
     }
 
   val targetJdkJavacOptions = Seq("--release", targetJavaVersion)
diff --git a/project/PekkoBuild.scala b/project/PekkoBuild.scala
index 887a7fda1e..20d4ef4f88 100644
--- a/project/PekkoBuild.scala
+++ b/project/PekkoBuild.scala
@@ -89,6 +89,16 @@ object PekkoBuild {
 
   private def allWarnings: Boolean = System.getProperty("pekko.allwarnings", 
"false").toBoolean
 
+  private def isScala38OrLater(scalaVersion: String): Boolean =
+    CrossVersion.partialVersion(scalaVersion).exists {
+      case (3, minor) if minor >= 8 => true
+      case _                        => false
+    }
+
+  private def testJavacOptions(scalaVersion: String): Seq[String] =
+    if (isScala38OrLater(scalaVersion)) Seq("-encoding", "UTF-8", "-nowarn", 
"-Xlint:none")
+    else DefaultJavacOptions
+
   final val DefaultScalacOptions = Def.setting {
     if (scalaVersion.value.startsWith("3.")) {
       Seq(
@@ -97,8 +107,9 @@ object PekkoBuild {
         "-feature",
         "-unchecked",
         // 'blessed' since 2.13.1
-        "-language:higherKinds",
-        "-Yfuture-lazy-vals")
+        "-language:higherKinds") ++
+      (if (isScala38OrLater(scalaVersion.value)) Seq("-Wconf:any:s") else 
Seq.empty) ++
+      (if (scalaVersion.value.startsWith("3.3.")) Seq("-Yfuture-lazy-vals") 
else Seq.empty)
     } else {
       Seq(
         "-encoding",
@@ -127,7 +138,7 @@ object PekkoBuild {
     Test / scalacOptions := (Test / scalacOptions).value.filterNot(opt =>
       opt == "-Xlog-reflective-calls" || opt.contains("genjavadoc")),
     Compile / javacOptions ++= JdkOptions.targetJdkJavacOptions,
-    Test / javacOptions ++= DefaultJavacOptions ++ 
JdkOptions.targetJdkJavacOptions,
+    Test / javacOptions ++= testJavacOptions(scalaVersion.value) ++ 
JdkOptions.targetJdkJavacOptions,
     Compile / javacOptions ++= (if (allWarnings) Seq("-Xlint:deprecation") 
else Nil),
     doc / javacOptions := Seq(),
     crossVersion := CrossVersion.binary,
diff --git 
a/serialization-jackson/src/test/scala/org/apache/pekko/serialization/jackson/JacksonSerializerSpec.scala
 
b/serialization-jackson/src/test/scala/org/apache/pekko/serialization/jackson/JacksonSerializerSpec.scala
index e4c15686d4..242a866440 100644
--- 
a/serialization-jackson/src/test/scala/org/apache/pekko/serialization/jackson/JacksonSerializerSpec.scala
+++ 
b/serialization-jackson/src/test/scala/org/apache/pekko/serialization/jackson/JacksonSerializerSpec.scala
@@ -732,6 +732,12 @@ class JacksonJsonSerializerSpec extends 
JacksonSerializerSpec("jackson-json") {
 }
 
 object JacksonSerializerSpec {
+  private[jackson] def isScala38OrLater: Boolean =
+    scala.util.Properties.versionNumberString.split("[.-]").toList match {
+      case "3" :: minor :: _ => minor.toIntOption.exists(_ >= 8)
+      case _                 => false
+    }
+
   def baseConfig(serializerName: String): String = s"""
     pekko.actor {
       serialization-bindings {
@@ -1044,7 +1050,13 @@ abstract class JacksonSerializerSpec(serializerName: 
String)
     }
 
     "serialize message with Enumeration property (using Jackson legacy 
format)" in {
-      checkSerialization(Alien("E.T.", Planet.Mars))
+      // jackson-module-scala issue #795: Scala 3.8+ blocks the legacy 
serializer's reflective owner lookup.
+      if (JacksonSerializerSpec.isScala38OrLater)
+        pendingUntilFixed {
+          checkSerialization(Alien("E.T.", Planet.Mars))
+        }
+      else
+        checkSerialization(Alien("E.T.", Planet.Mars))
     }
 
     "serialize message with Enumeration property as a String" in {
diff --git 
a/stream-tests/src/test/java/org/apache/pekko/stream/javadsl/FlowTest.java 
b/stream-tests/src/test/java/org/apache/pekko/stream/javadsl/FlowTest.java
index 8737c6d27d..bccd9c0ce3 100644
--- a/stream-tests/src/test/java/org/apache/pekko/stream/javadsl/FlowTest.java
+++ b/stream-tests/src/test/java/org/apache/pekko/stream/javadsl/FlowTest.java
@@ -53,7 +53,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.reactivestreams.Publisher;
 
-@SuppressWarnings("serial")
+@SuppressWarnings({"serial", "unchecked"})
 public class FlowTest extends StreamTestJupiter {
   public FlowTest() {
     super(actorSystemResource);
diff --git 
a/stream/src/main/scala/org/apache/pekko/stream/impl/fusing/Ops.scala 
b/stream/src/main/scala/org/apache/pekko/stream/impl/fusing/Ops.scala
index 4c0bf7bb93..ecf9bd4670 100644
--- a/stream/src/main/scala/org/apache/pekko/stream/impl/fusing/Ops.scala
+++ b/stream/src/main/scala/org/apache/pekko/stream/impl/fusing/Ops.scala
@@ -1658,7 +1658,8 @@ private[stream] object Collect {
         log = logAdapter match {
           case Some(l) => l
           case _       =>
-            Logging(materializer.system, materializer)(fromMaterializer)
+            implicit val logSource: LogSource[Materializer] = 
Log.fromMaterializer
+            Logging(materializer.system, materializer)
         }
       }
 
@@ -1778,7 +1779,8 @@ private[stream] object Collect {
         log = logAdapter match {
           case Some(l) => l
           case _       =>
-            Logging.withMarker(materializer.system, 
materializer)(fromMaterializer)
+            implicit val logSource: LogSource[Materializer] = 
LogWithMarker.fromMaterializer
+            Logging.withMarker(materializer.system, materializer)
         }
       }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to