Hi Stefan, Attachments, such as images, don't work on the mailing list. You can try uploading to imgur.com or similar and send the link to it.
Have you tried updating your "java -cp myPlugin.jar path.to.Main" command to have more classpaths? mrg On Wed, Mar 23, 2022 at 12:10 PM Stefan Stegic <stefanste...@gmail.com> wrote: > My knowledge of Java is not so deep, so excuse stupid questions - if any. > I believe I am using shading because I'm exporting dependencies into my > JAR. IntelliJ does this for me in the build process by publishing the JAR > as an artifact. All I did was specify which dependencies I want to package > in there like this: > > [image: image.png] > > So, I build the project, grab the published JAR artifact and put the file > in the plugins folder of the Spigot server. I then run the Server and it > tries to load each plugin JAR that's in there. That's when each of the > onEnable methods are called, including that of my plugin > (FirstSpigotPlugin). The example code that creates the CayenneRuntime is in > my onEnable method. > > Should I be packaging these dependencies differently then? > > On Wed, Mar 23, 2022 at 4:56 PM Andrus Adamchik <aadamc...@gmail.com> > wrote: > >> This is not a common problem with Cayenne. In fact this is the first time >> I see it happen in any environment. So Spigot is special in this respect. I >> found this link: >> https://bukkit.fandom.com/wiki/Using_External_Libraries_with_Plugins < >> https://bukkit.fandom.com/wiki/Using_External_Libraries_with_Plugins> >> It doesn't answer the question, but provides some hints. So how do you >> package your own code and third-party dependencies like Cayenne for >> Spigot/Bukkit? Do you use "shading"? >> >> Andrus >> >> > On Mar 23, 2022, at 4:51 PM, Stefan Stegic <stefanste...@gmail.com> >> wrote: >> > >> > Hi, >> > >> > Thanks for your quick responses! I'm using version 4.1.1. >> > Right, so you're saying Spigot is somehow blocking the execution of said >> > code, or it's circumventing it somehow so that those steps of >> > initialization are never actually executed? Also, you mean that it's a >> > common problem with Cayenne or with Spigot and other jars? >> > >> > How would we go about understanding how the Spigot classpath works? It >> > might help to know that the plugin API is called Bukkit, so Spigot is >> kind >> > of the parent entity (it's a customized Minecraft server, while Bukkit >> is >> > the interface for plugins, as I've come to understand). It's source code >> > should be here: >> > https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/browse . >> > >> > On Wed, Mar 23, 2022 at 4:33 PM Andrus Adamchik <aadamc...@gmail.com> >> wrote: >> > >> >> The bootstrap code is as vanilla as it can get: >> >> >> >>>> ServerRuntime cayenneRuntime = ServerRuntime.builder() >> >>>> .addConfig("cayenne-project.xml") >> >>>> .build(); >> >> >> >> Missing ObjectContextFactory means ServerModule is not loaded in the >> >> environment. Since 4.1 (BTW, which version of Cayenne are we talking >> >> about?), ServerModule is loaded by processing >> >> >> "META-INF/services/org.apache.cayenne.configuration.server.CayenneServerModuleProvider" >> >> files from the classpath jars. So there's something about Spigot's >> >> classpath that prevents this code in ModuleLoader from returning proper >> >> resources: >> >> >> >> for (ModuleProvider provider : ServiceLoader.load(providerClass)) { >> ... } >> >> >> >> We need to understand how Spigot classpath works. Cursory Googling >> shows >> >> that this is a common problem, just don't immediately see a solution. >> >> >> >> Andrus >> >> >> >> >> >>> On Mar 23, 2022, at 4:03 PM, Andrus Adamchik <aadamc...@gmail.com> >> >> wrote: >> >>> >> >>> Actually the stack shows that there's already an instance of Cayenne >> >> runtime available to the code, but the runtime is in a bad state (not >> clear >> >> why). So thread binding should not be required. >> >>> >> >>> Andrus >> >>> >> >>> >> >>>> On Mar 23, 2022, at 4:00 PM, John Huss <johnth...@gmail.com> wrote: >> >>>> >> >>>> You have to bind the DI injector to the thread (and unbind it later): >> >>>> >> >>>> CayenneRuntime.*bindThreadInjector*(cayenneRuntime.getInjector()); >> >>>> >> >>>> If you are using servlets, then CayenneFilter will do this for you. >> >>>> Otherwise you can bind it at the start of a request and unbind it at >> the >> >>>> end. >> >>>> >> >>>> On Wed, Mar 23, 2022 at 9:10 AM Stefan Stegic < >> stefanste...@gmail.com> >> >>>> wrote: >> >>>> >> >>>>> Hi Andrus, >> >>>>> >> >>>>> Of course: >> >>>>> >> >>>>> org.apache.cayenne.di.DIRuntimeException: DI container has no >> binding >> >> for >> >>>>> key <BindingKey: >> org.apache.cayenne.configuration.ObjectContextFactory> >> >>>>> at >> >>>>> >> >>>>> >> >> >> org.apache.cayenne.di.spi.DefaultInjector.getProvider(DefaultInjector.java:158) >> >>>>> ~[?:?] >> >>>>> at >> >>>>> >> >>>>> >> >> >> org.apache.cayenne.di.spi.DefaultInjector.getProvider(DefaultInjector.java:144) >> >>>>> ~[?:?] >> >>>>> at >> >>>>> >> >>>>> >> >> >> org.apache.cayenne.di.spi.DefaultInjector.getInstance(DefaultInjector.java:134) >> >>>>> ~[?:?] >> >>>>> at >> >>>>> >> >>>>> >> >> >> org.apache.cayenne.configuration.CayenneRuntime.newContext(CayenneRuntime.java:124) >> >>>>> ~[?:?] >> >>>>> at >> >>>>> >> >>>>> >> >> >> io.github.phuskus.firstspigotplugin.StatisticsController.reportPlayerConnectionEvent(StatisticsController.java:20) >> >>>>> ~[?:?] >> >>>>> at >> >>>>> >> >>>>> >> >> >> io.github.phuskus.firstspigotplugin.FirstSpigotPlugin.onEnable(FirstSpigotPlugin.java:29) >> >>>>> ~[?:?] >> >>>>> at >> >>>>> org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) >> >>>>> ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?] >> >>>>> at >> >>>>> >> >>>>> >> >> >> org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:342) >> >>>>> ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?] >> >>>>> at >> >>>>> >> >>>>> >> >> >> org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:480) >> >>>>> ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?] >> >>>>> at >> >>>>> >> >>>>> >> >> >> org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugin(CraftServer.java:521) >> >>>>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499] >> >>>>> at >> >>>>> >> >>>>> >> >> >> org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugins(CraftServer.java:435) >> >>>>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499] >> >>>>> at >> >>>>> >> >> >> net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:612) >> >>>>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499] >> >>>>> at >> >>>>> >> >> >> net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:414) >> >>>>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499] >> >>>>> at >> >>>>> >> >> >> net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:262) >> >>>>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499] >> >>>>> at >> >> net.minecraft.server.MinecraftServer.w(MinecraftServer.java:994) >> >>>>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499] >> >>>>> at >> >>>>> >> net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:304) >> >>>>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499] >> >>>>> at java.lang.Thread.run(Thread.java:833) [?:?] >> >>>>> >> >>>>> On Wed, Mar 23, 2022 at 11:49 AM Andrus Adamchik < >> aadamc...@gmail.com> >> >>>>> wrote: >> >>>>> >> >>>>>> Hi Stefan, >> >>>>>> >> >>>>>> Could you include a full stack trace please? >> >>>>>> >> >>>>>> Thanks, >> >>>>>> Andrus >> >>>>>> >> >>>>>>> On Mar 23, 2022, at 1:04 AM, Stefan Stegic < >> stefanste...@gmail.com> >> >>>>>> wrote: >> >>>>>>> >> >>>>>>> Hi, >> >>>>>>> >> >>>>>>> >> >>>>>>> First some context: I'm working on a custom Minecraft server >> (Spigot) >> >>>>>>> plugin. It's just a JAR that you export and place somewhere in the >> >>>>>> server's >> >>>>>>> folder structure. >> >>>>>>> >> >>>>>>> I wrote a simple insert query via Cayenne's API. It works when I >> run >> >>>>> the >> >>>>>>> example JAR directly via executing Main from the command line >> (java >> >> -cp >> >>>>>>> myPlugin.jar path.to.Main), but it fails with the following error >> >> when >> >>>>>>> executed by the server in my plugin's OnEnable lifecycle hook: >> >>>>>>> >> >>>>>>> org.apache.cayenne.di.DIRuntimeException: DI container has no >> binding >> >>>>> for >> >>>>>>> key <BindingKey: >> >> org.apache.cayenne.configuration.ObjectContextFactory> >> >>>>>>> >> >>>>>>> >> >>>>>>> My initial theory was that it's being executed from a different >> >> thread, >> >>>>>> so >> >>>>>>> the DI system might not have access to that dependency for some >> >> reason, >> >>>>>> but >> >>>>>>> it seems like the server executes this lifecycle hook from the >> main >> >>>>>> thread >> >>>>>>> as well (though they've named the thread "Server thread", and I >> don't >> >>>>>> know >> >>>>>>> how to check if it's the main thread for sure). Not sure if this >> is a >> >>>>>>> promising direction to pursue, but I got the hunch by looking at >> the >> >>>>>>> threadInjector bits of Cayenne's DI container docs. >> >>>>>>> >> >>>>>>> My example looks like this: >> >>>>>>> >> >>>>>>> ServerRuntime cayenneRuntime = ServerRuntime.builder() >> >>>>>>> .addConfig("cayenne-project.xml") >> >>>>>>> .build();ObjectContext ctx = >> >>>>> cayenneRuntime.newContext(); >> >>>>>>> PlayerConnectionEvent newEvent = >> >>>>>>> ctx.newObject(PlayerConnectionEvent.class); >> >>>>>>> newEvent.setEventType(eType); >> >>>>>>> newEvent.setPlayerName(playerName); >> >>>>>>> newEvent.setIpAddress(ipAddress); >> >>>>>>> newEvent.setTimestampUnixSeconds(unixSeconds); >> >>>>>>> >> >>>>>>> ctx.commitChanges(); >> >>>>>>> >> >>>>>>> Some help would be greatly appreciated, thanks in advance! >> >>>>>>> -- >> >>>>>>> S poštovanjem, >> >>>>>>> *Stefan Stegić* >> >>>>>> >> >>>>>> >> >>>>> >> >>>>> -- >> >>>>> S poštovanjem, >> >>>>> *Stefan Stegić* >> >>>>> >> >>> >> >> >> >> >> > >> > -- >> > S poštovanjem, >> > *Stefan Stegić* >> >> > > -- > S poštovanjem, > *Stefan Stegić* >