Given the following class and its companion object:
class B extends A
object B extends B
Where A is an abstract class in another file:
abstract class A {
def main(args: Array[String]): Unit = println("hey")
}
The above code is packaged into an uber-jar using the sbt assembly plugin, where the entry point is object B main method inherited from class B.
The above works fine. It runs. No problem at all.
Hoewver, sbt keeps warning:
[warn] B has the main method with parameter type Array[String], but B will not be a runnable program.
[warn] Reason: companion contains its own main method, which means no static forwarder can be generated.
[warn] object B extends B
- Do you know the meaning of this warning?
- And why sbt assurance that
object Bwon't run, doesn't happen?
Thank you.
CodePudding user response:
For a class to be runnable in java, main needs to be static. Yours isn't, so, the object isn't runnable. That's what compiler is telling you.
Just rename main in A to something else, and then add a main in the object, that calls it.
CodePudding user response:
It does not run for me.
I have this file B.scala.
package foo.bar
abstract class A {
def main(args: Array[String]): Unit = println("hey")
}
class B extends A
object B extends B
When I try to run foo.bar.B I get an error:
sbt> runMain foo.bar.B
[info] running foo.bar.B
[error] (run-main-0) java.lang.NoSuchMethodException: foo.bar.B.main is not static
And the reason is exactly as the warning says. Class B contains a non-static main method which it inherited from class A. You can't have 2 methods with exactly the same name and type signature in one class, even if one is static and another in non-static. This means that the compiler cannot generate a static main method in class B that forwards to the non-static main method in object B.
Why it does run correctly for you I don't know.
