-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Open
Labels
Description
This issue is based on the discussion below.
Compiler version
- 3.3.7
- 3.7.2
- 3.7.3
- 3.8.0-RC1-bin-20251022-b325681-NIGHTLY
Minimized code
/src/main/scala/foo/Main.scala
package foo
package internal {
private[foo] def hello(): String = "Hello"
}
inline def greeting(): Unit = {
val msg = internal.hello()
println(msg)
}
@main def main(): Unit = {
greeting()
}build.sbt
name := "foo"
version := "0.1.0-SNAPSHOT"
scalaVersion := "3.7.3"
Output
[info] running foo.main
Exception in thread "sbt-bg-threads-1" java.lang.NoClassDefFoundError: foo/internal
at foo.Main$package$.main(Main.scala:8)
at foo.main.main(Main.scala:12)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at sbt.Run.invokeMain(Run.scala:139)
at sbt.Run.execute$1(Run.scala:85)
at sbt.Run.$anonfun$runWithLoader$5(Run.scala:112)
at sbt.Run$.executeSuccess(Run.scala:227)
at sbt.Run.runWithLoader(Run.scala:112)
at sbt.Defaults$.$anonfun$bgRunTask$6(Defaults.scala:2094)
at sbt.Defaults$.$anonfun$termWrapper$2(Defaults.scala:2033)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
at scala.util.Try$.apply(Try.scala:213)
at sbt.internal.BackgroundThreadPool$BackgroundRunnable.run(DefaultBackgroundJobService.scala:378)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ClassNotFoundException: foo.internal
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
at sbt.internal.ManagedClassLoader.findClass(ManagedClassLoader.java:103)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 17 more
[success] Total time: 7 s, completed 2025/10/22 13:44:35Expectation
The program should run and print Hello.
Workaround
- Import the member inside the greeting method and call it unqualified:
inline def greeting(): Unit = {
import foo.internal.hello
val msg = hello()
println(msg)
}- Remove
private[foo]visibility from the internal method:
package internal {
def hello(): String = "Hello"
}
inline def greeting(): Unit = {
val msg = internal.hello()
println(msg)
}