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]