If you aren't using a shaded JAR (which merges all JARs into a single JAR), then you'll need more JARs listed on your Java command.
On Wed, Mar 23, 2022 at 12:16 PM Stefan Stegic <stefanste...@gmail.com> wrote: > PS: I'm not using maven-shade (just opened the link you sent) > > On Wed, Mar 23, 2022 at 5: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ć* >> > > > -- > S poštovanjem, > *Stefan Stegić* >