mirror of https://github.com/sbt/sbt.git
fix runMain task. support JEP-512
This commit is contained in:
parent
b536847ff0
commit
152fe61ced
|
|
@ -10,7 +10,7 @@ package sbt
|
|||
|
||||
import java.io.File
|
||||
import java.lang.reflect.Method
|
||||
import java.lang.reflect.Modifier.{ isPublic, isStatic }
|
||||
import java.lang.reflect.Modifier.{ isPrivate, isPublic, isStatic }
|
||||
import sbt.internal.inc.ScalaInstance
|
||||
import sbt.internal.inc.classpath.{ ClasspathFilter, ClasspathUtil }
|
||||
import sbt.internal.util.MessageOnlyException
|
||||
|
|
@ -133,10 +133,17 @@ class Run(private[sbt] val newLoader: Seq[File] => ClassLoader, trapExit: Boolea
|
|||
currentThread.setContextClassLoader(loader)
|
||||
try {
|
||||
if (main.isStatic) {
|
||||
if (Run.isJava25Plus) {
|
||||
main.method.setAccessible(true)
|
||||
}
|
||||
if (main.parameterCount > 0) main.method.invoke(null, options.toArray[String])
|
||||
else main.method.invoke(null)
|
||||
} else {
|
||||
val ref = main.mainClass.getDeclaredConstructor().newInstance().asInstanceOf[AnyRef]
|
||||
val constructor = main.mainClass.getDeclaredConstructor()
|
||||
if (Run.isJava25Plus) {
|
||||
constructor.setAccessible(true)
|
||||
}
|
||||
val ref = constructor.newInstance().asInstanceOf[AnyRef]
|
||||
if (main.parameterCount > 0) main.method.invoke(ref, options.toArray[String])
|
||||
else main.method.invoke(ref)
|
||||
}
|
||||
|
|
@ -165,10 +172,24 @@ class Run(private[sbt] val newLoader: Seq[File] => ClassLoader, trapExit: Boolea
|
|||
val method = try {
|
||||
mainClass.getMethod("main", classOf[Array[String]])
|
||||
} catch {
|
||||
case _: NoSuchMethodException => mainClass.getMethod("main")
|
||||
case _: NoSuchMethodException =>
|
||||
try {
|
||||
mainClass.getMethod("main")
|
||||
} catch {
|
||||
case _: NoSuchMethodException =>
|
||||
try {
|
||||
mainClass.getDeclaredMethod("main", classOf[Array[String]])
|
||||
} catch {
|
||||
case _: NoSuchMethodException =>
|
||||
mainClass.getDeclaredMethod("main")
|
||||
}
|
||||
}
|
||||
}
|
||||
val modifiers = method.getModifiers
|
||||
if (isPrivate(modifiers)) {
|
||||
throw new NoSuchMethodException(s"${mainClassName}.main is private")
|
||||
}
|
||||
method.setAccessible(true)
|
||||
val modifiers = method.getModifiers
|
||||
DetectedMain(mainClass, method, isStatic(modifiers), method.getParameterCount())
|
||||
} else {
|
||||
val method = mainClass.getMethod("main", classOf[Array[String]])
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
package example;
|
||||
|
||||
class A {
|
||||
void main() {
|
||||
System.out.println("package private no args");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package example;
|
||||
|
||||
class A {
|
||||
protected void main() {
|
||||
System.out.println("protected no args");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package example;
|
||||
|
||||
class A {
|
||||
void main(String[] args) {
|
||||
System.out.println("package private with args");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package example;
|
||||
|
||||
class A {
|
||||
private void main(String[] args) {
|
||||
System.out.println("private");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
void main() {
|
||||
IO.println("compact source file with java.lang.IO");
|
||||
}
|
||||
|
|
@ -1,11 +1,54 @@
|
|||
// 2.12.x uses Zinc's compiler bridge
|
||||
ThisBuild / scalaVersion := "2.12.20"
|
||||
|
||||
@transient
|
||||
lazy val check = taskKey[Unit]("")
|
||||
|
||||
check := {
|
||||
if (scala.util.Properties.isJavaAtLeast("25"))
|
||||
(Compile / run).toTask(" ").value
|
||||
else ()
|
||||
}
|
||||
lazy val common = Def.settings(
|
||||
// 2.12.x uses Zinc's compiler bridge
|
||||
scalaVersion := "2.12.20",
|
||||
)
|
||||
|
||||
// use `runMain` instead of `run` because discoveredMainClasses return empty
|
||||
// if JEP-512 java main method
|
||||
// TODO fix zinc
|
||||
// https://github.com/sbt/sbt/issues/7384#issuecomment-3361020003
|
||||
lazy val commonRunMainCheck = Def.settings(
|
||||
check := {
|
||||
if (scala.util.Properties.isJavaAtLeast("25")) {
|
||||
(Compile / runMain).toTask(" example.A").value
|
||||
} else ()
|
||||
}
|
||||
)
|
||||
|
||||
lazy val a1 = project
|
||||
.settings(common)
|
||||
.settings(
|
||||
check := {
|
||||
if (scala.util.Properties.isJavaAtLeast("25")) {
|
||||
assert((Compile / discoveredMainClasses).value.size == 1)
|
||||
(Compile / run).toTask(" ").value
|
||||
} else ()
|
||||
}
|
||||
)
|
||||
|
||||
lazy val a2 = project.settings(common, commonRunMainCheck)
|
||||
lazy val a3 = project.settings(common, commonRunMainCheck)
|
||||
lazy val a4 = project.settings(common, commonRunMainCheck)
|
||||
|
||||
lazy val a5 = project.settings(
|
||||
common,
|
||||
check := {
|
||||
if (scala.util.Properties.isJavaAtLeast("25")) {
|
||||
(Compile / runMain).toTask(" example.A").value
|
||||
} else {
|
||||
sys.error("not jdk 25")
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
lazy val a6 = project.settings(
|
||||
common,
|
||||
check := {
|
||||
if (scala.util.Properties.isJavaAtLeast("25")) {
|
||||
(Compile / runMain).toTask(" A").value
|
||||
} else ()
|
||||
}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,2 +1,7 @@
|
|||
# > run
|
||||
> check
|
||||
> a1/check
|
||||
> a2/check
|
||||
> a3/check
|
||||
> a4/check
|
||||
-> a5/check
|
||||
> a6/check
|
||||
|
|
|
|||
Loading…
Reference in New Issue