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ć*
>

Reply via email to