import java.util.ServiceLoader
interface A
data object B : A {
@JvmStatic
fun provider(): A = this
}
fun main() {
println(ServiceLoader.load(A::class.java).toList())
}
эта программа отлично работает в автономном режиме:
java.exe -p ; -m testJARSPI/my.program.MainKt
но выдает ошибку при запуске в jar-файле:
java -jar
сообщение:
Exception in thread "main" java.util.ServiceConfigurationError: my.program.A: my.program.B Unable to get public no-arg constructor
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:586)
at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:679)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1240)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
at kotlin.collections.CollectionsKt___CollectionsKt.toCollection(_Collections.kt:1295)
at kotlin.collections.CollectionsKt___CollectionsKt.toMutableList(_Collections.kt:1328)
at kotlin.collections.CollectionsKt___CollectionsKt.toList(_Collections.kt:1319)
at my.program.MainKt.main(Main.kt:15)
at my.program.MainKt.main(Main.kt)
Caused by: java.lang.NoSuchMethodException: my.program.B.()
at java.base/java.lang.Class.getConstructor0(Class.java:3641)
at java.base/java.lang.Class.getConstructor(Class.java:2324)
at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:666)
at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:663)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:674)
... 9 more
Я не могу найти, какое изменение нарушается внутри файла jar
Примечание: файл MANIFEST.MF, службы
code> и модуль-info.java настроен правильно.
Собран с использованием IntelliJ: создать JAR из модуля -> извлечь в целевой JAR
протестировано с помощью jdk:
- open-jdk 22
- open-jdk 19 (показано трассировка стека)
- исправление 22
data object B : A {
@JvmStatic
@Suppress("NON_FINAL_MEMBER_IN_OBJECT")
open // remove final modifier
fun provider(): A = this
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... a-jar-file