Сторонние библиотеки

Версия Minecraft
1.20+
API
Forge
342
33
54
Hi

Подключаю библиотеку не являющуюся модом используя shadow(8.1.1).
build.gradle:
dependencies {
    //...
    implementation "org.luaj:luaj-jse:${luaj}"
    shadow "org.luaj:luaj-jse:${luaj}"
    //...
}

Джарник(Всё есть):
изображение_2025-03-20_202541805.png

Но запустить в среде не могу т.к.:
Caused by: java.lang.ClassNotFoundException: org.luaj.vm2.lib.jse.JsePlatform

Не помогло запихивание в runtimeClasspath подобным способом
Java:
jar { ...
    from {
        configurations.runtimeClasspath.collect {
            if(it.name.equalsIgnoreCase("zstd-jni-1.5.5-9-universal.jar")) {
                zipTree(it) //библиотека, которую нужно включить в мод ^^
            }
        }
    }
}

Ругается на самое первое упоминание "неизвестного класса"
Например:
Java:
public static final Globals LUA_G = JsePlatform.standardGlobals();
 
Краш-лог
java.lang.NoClassDefFoundError: org/luaj/vm2/lib/jse/JsePlatform
at com.mr_toad.core.Main.<clinit>(Main.java:97) ~[%23196!/:?] {re:mixin,re:classloading}
at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?] {}
at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[?:?] {}
at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?] {}
at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?] {}
at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[?:?] {}
at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:68) ~[javafmllanguage-1.20.1-47.1.0.jar%23192!/:?] {}
at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$10(ModContainer.java:123) ~[fmlcore-1.20.1-47.1.0.jar%23195!/:?] {}
at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] {}
at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] {}
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] {}
at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[?:?] {}
at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[?:?] {}
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[?:?] {}
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[?:?] {}
Caused by: java.lang.ClassNotFoundException: org.luaj.vm2.lib.jse.JsePlatform
at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[?:?] {}
at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?] {}
at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:137) ~[securejarhandler-2.1.10.jar:?] {}
at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?] {}
at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:137) ~[securejarhandler-2.1.10.jar:?] {}
at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?] {}
... 15 more
Краш-лог:
java.lang.NoClassDefFoundError: org/luaj/vm2/lib/jse/JsePlatform
	at com.mr_toad.core.Main.<clinit>(Main.java:97) ~[%23196!/:?] {re:mixin,re:classloading}
	at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?] {}
	at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[?:?] {}
	at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?] {}
	at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?] {}
	at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[?:?] {}
	at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:68) ~[javafmllanguage-1.20.1-47.1.0.jar%23192!/:?] {}
	at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$10(ModContainer.java:123) ~[fmlcore-1.20.1-47.1.0.jar%23195!/:?] {}
	at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] {}
	at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] {}
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] {}
	at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[?:?] {}
	at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[?:?] {}
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[?:?] {}
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[?:?] {}
Caused by: java.lang.ClassNotFoundException: org.luaj.vm2.lib.jse.JsePlatform
	at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[?:?] {}
	at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?] {}
	at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:137) ~[securejarhandler-2.1.10.jar:?] {}
	at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?] {}
	at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:137) ~[securejarhandler-2.1.10.jar:?] {}
	at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?] {}
	... 15 more
Последнее редактирование:
Решение
Кароч, покопавшись в доках forge нашел решение:
Gradle (Groovy):
minecraftLibrary("org.luaj:luaj-jse:${luaj}") //тот же lua для примера

Тот же implementation, но с добавлением в runtime.
Для запихивания в jar продолжу использовать Shadow.

думаю, никаких проблем не возникнет.
Единственная реализация Lua которую я нашёл вот, но на данный момент она недоступна, так что придётся использовать luaj(его же использует Axiom и вроде никаких проблем нет)
Hi

Подключаю библиотеку не являющуюся модом используя shadow(8.1.1).
build.gradle:
dependencies {
    //...
    implementation "org.luaj:luaj-jse:${luaj}"
    shadow "org.luaj:luaj-jse:${luaj}"
    //...
}

Джарник(Всё есть):
Посмотреть вложение 18588

Но запустить в среде не могу т.к.:
Caused by: java.lang.ClassNotFoundException: org.luaj.vm2.lib.jse.JsePlatform

Не помогло запихивание в runtimeClasspath подобным способом


Ругается на самое первое упоминание "неизвестного класса"
Например:
Java:
public static final Globals LUA_G = JsePlatform.standardGlobals();
Тот фрагмент моего скрипта, который ты переслал - принудительно упаковывает нужный артефакт в билд мода (по крайне мере должен)
Если нет shadow-а или лень его тащить по н-ным причнам

А либы сами подключаются тем же implementation
Выбери нужный артефакт и тупо скопируй

А вообще - не рекомендую подключать скриптовые языки (технология устарела) - если есть возможность перелезай на GraalVM Polyglot
 
Последнее редактирование:
Тот фрагмент моего скрипта, который ты переслал - принудительно упаковывает нужный артефакт в билд мода (по крайне мере должен)
Не shadow, не сей скрипт не помогают, ему пофик...
Выбери нужный артефакт и тупо скопируй
https://mvnrepository.com/artifact/org.luaj/luaj-jse
Со второй библиотекой так и сделал

А для Lua буду использовать Polyglot, думаю, никаких проблем не возникнет.
 
Не shadow, не сей скрипт не помогают, ему пофик...
Запусти отладчик, посмотри почему условие не выполняется

Может вместо equals использовать contains и сделать "более не четким"
 
Кароч, покопавшись в доках forge нашел решение:
Gradle (Groovy):
minecraftLibrary("org.luaj:luaj-jse:${luaj}") //тот же lua для примера

Тот же implementation, но с добавлением в runtime.
Для запихивания в jar продолжу использовать Shadow.

думаю, никаких проблем не возникнет.
Единственная реализация Lua которую я нашёл вот, но на данный момент она недоступна, так что придётся использовать luaj(его же использует Axiom и вроде никаких проблем нет)
 
Назад
Сверху