Yup, it's in there:

##################################################################
#   Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
##################################################################

org.apache.cayenne.configuration.server.MainCayenneServerModuleProvider

On Wed, Mar 23, 2022 at 5:47 PM Andrus Adamchik <aadamc...@gmail.com> wrote:

> Ok, shading can be tricky. Do you have this file inside the shaded jar:
>
> >>
> "META-INF/services/org.apache.cayenne.configuration.server.CayenneServerModuleProvider"
>
> And if you do, can you check the contents of it? It is a simple text file,
> so once you extract it form the  jar, you can check it in any text editor.
>
> Andrus
>
>
>
> > On Mar 23, 2022, at 5:26 PM, Stefan Stegic <stefanste...@gmail.com>
> wrote:
> >
> > Ok, just tried maven-shade-plugin, but no luck - still the same error...
> It
> > seems that the shading is working as expected: when I run maven package,
> > the output jar really has cayenne's stuff in there, but DI is still
> failing
> > when I copy the plugin into the server and start it.
> >
> > Michael, in response to your question:
> >
> >> Have you tried updating your "java -cp myPlugin.jar path.to.Main"
> command
> >> to have more classpaths?
> >
> >
> > When I run Main, it works, so that's not the problem. The problem arises
> > when my plugin is called by Spigot, the custom Minecraft server I'm
> writing
> > the plugin for.
> >
> > On Wed, Mar 23, 2022 at 5:20 PM Stefan Stegic <stefanste...@gmail.com>
> > wrote:
> >
> >> Hi Michael,
> >>
> >> Oh, I wasn't aware, thanks. Here's the screenshot from my last e-mail:
> >> https://imgur.com/QJoBGAV .
> >> Right, I'll give maven-shade-plugin a try now and check if it works that
> >> way, thanks.
> >>
> >> On Wed, Mar 23, 2022 at 5:18 PM Michael Gentry <blackn...@gmail.com>
> >> wrote:
> >>
> >>> 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ć*
> >>>>
> >>>
> >>
> >>
> >> --
> >> S poštovanjem,
> >> *Stefan Stegić*
> >>
> >
> >
> > --
> > S poštovanjem,
> > *Stefan Stegić*
>
>

-- 
S poštovanjem,
*Stefan Stegić*

Reply via email to