Hi all, the faulty ClassLoader is the BundleDelegatingClassLoader(plc4x-test [191]). Which means that the custom bundle can not find the class right?
I'm sorry if it's a silly question but I am pretty new to this. Etienne On 2020/04/06 20:28:17, Łukasz Dywicki <l...@code-house.org> wrote: > I haven't used Camel for a while, but to me it seems to be a problem > caused by caller's classloader. > > See that in stack trace you have a thread which is started by camel, so > there are 3 or even 4 classloaders to be considered: > - plc4x, definitely not a faulty one > - netty, could be troublesome but unlikely to be used > - camel-core, or component itself > - custom bundle which started the route > > Anything beside last one which knows all the dependencies will blow up > whole universe. Here is why - only the custom bundle knows all the > dependencies necessary to run logic and can be used to fix messed up > classpath. In most of the cases, that's the "trick" you have to make in > order to get OSGi happy. > Camel component may not, and should not depend on specific driver, > however in your case it does. Possibly due to new APIs in transport > layer its shouldn't be used for adhoc fixes. > > We can try to turn drivers into services (see here > https://github.com/splatch/plc4x/commit/5ce379cf8d2f5dc91fdfb6d8a8e2c0531906e69f) > in order to cut concrete class dependency and rely on isolated APIs. > This code was done before new abstractions over netty were introduced, > but it should cut in half API and caller side (not sure if we're on > declarative services). > > My tip to you Etienne - please verify which class loader is used in your > polling cycle. You can do that by making breakpoint in faulty method of > S7Driver and evaluating expression > "Thread.currentThread().getContextClassLoader()". > Once you know that you can either fix classloading in the calling class > loader or override classloader for thread to proper one. > > Best, > Łukasz > > > On 03.04.2020 10:27, Etienne Robinet wrote: > > Hi Christian, > > you mean the code used in the Camel route? It is an blueprint: > > > > <?xml version="1.0" encoding="UTF-8"?> > > <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > > xsi:schemaLocation= "http://www.osgi.org/xmlns/blueprint/v1.0.0 > > https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd > > http://camel.apache.org/schema/blueprint > > http://camel.apache.org/schema/blueprint/camel-blueprint-2.24.2.xsd"> > > > > > > <camelContext id="PLC-IoTDB" > > xmlns="http://camel.apache.org/schema/blueprint" streamCache="true" > > > <route id="plc-route" > > > <from uri="timer://plcFetch?fixedRate=true&period=1000"/> > > <pollEnrich> > > > > <simple>plc4x:s7:tcp://192.168.178.10?address=#fields</simple> > > </pollEnrich> > > <log message="${body}"/> > > <to uri="mock:test?retainLast=10"/> > > </route> > > </camelContext> > > > > > > <bean id="fields" class="java.util.ArrayList"> > > <argument> > > <list> > > <bean class="org.apache.plc4x.camel.TagData"> > > <argument index="0" value="IntTest"/> > > <argument index="1" value="%DB1.DBW254:INT"/> > > </bean> > > <bean class="org.apache.plc4x.camel.TagData"> > > <argument index="0" value="StringTest"/> > > <argument index="1" value="%DB1.DBX0:STRING"/> > > </bean> > > </list> > > </argument> > > </bean> > > </blueprint> > > > > This code used to wrok actually, I just wanted to test the new TagData of > > the integration. This is the bundling in the pom, these imports had to be > > there before too > > > > <plugin> > > <groupId>org.apache.felix</groupId> > > <artifactId>maven-bundle-plugin</artifactId> > > <version>4.2.1</version> > > <extensions>true</extensions> > > <configuration> > > <instructions> > > > > <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> > > <Bundle-Version>${project.version}</Bundle-Version> > > <Export-Package> > > *;version=${project.version} > > </Export-Package> > > <Import-Package> > > org.apache.plc4x.java.spi.transport, > > org.apache.plc4x.java.s7.readwrite, > > * > > </Import-Package> > > </instructions> > > </configuration> > > </plugin> > > > > > > Etienne > > > > On 2020/04/03 08:17:45, Christian Schneider <ch...@die-schneider.net> > > wrote: > >> The code in plc4x directly uses the class (not a String of the name). This > >> is good. Normally such a class reference should work fine. > >> > >> Can you show your code as a complete example? > >> > >> Christian > >> > >> > >> Am Fr., 3. Apr. 2020 um 09:58 Uhr schrieb Julian Feinauer < > >> j.feina...@pragmaticminds.de>: > >> > >>> I am off with my knowledge. > >>> You could ask the Karaf friends (#karaf in Slack). They are all OSGi > >>> experts and very friendly and helpful. > >>> Or perhaps Christian has an idea here? > >>> > >>> Best > >>> Julian > >>> > >>> Am 03.04.20, 09:50 schrieb "Etienne Robinet" <erobi...@apache.org>: > >>> > >>> Hi again, > >>> I've been struggling with this issue for 2 days now... I still don't > >>> get it why it can not find classes. here is the current problem: > >>> https://i.imgur.com/LtZMdsu.png > >>> > >>> We can see that the classes are available and exported, I don't know > >>> why the Camel Context can't find it. I even tried to add an Activator to > >>> my > >>> bundle, and load these classes there and it works! But not in the > >>> blueprint. If anyone had any idea on where the problem is... > >>> > >>> Etienne > >>> > >>> On 2020/04/01 01:31:15, Niclas Hedhman <nic...@hedhman.org> wrote: > >>> > It happens that OSGi classloading result in the wrong NCDFE and that > >>> one of > >>> > the classes "used" (i.e. return type, parameter, throws, extends, > >>> > implements) in the reported class is not visible by the classloader. > >>> And > >>> > occasionally, it is a "diamond problem", i.e. that the Constraints > >>> (IIRC, > >>> > see chapter 3.8 in OSGi spec) can't be satisfied. > >>> > > >>> > Sorry that I don't have time to dig into the actual situation here, > >>> but I > >>> > thought I could share some of my past (dark) history.... ;-) > >>> > > >>> > Cheers > >>> > Niclas > >>> > > >>> > On Wed, Apr 1, 2020 at 12:43 AM Christofer Dutz < > >>> christofer.d...@c-ware.de> > >>> > wrote: > >>> > > >>> > > Hi all, > >>> > > > >>> > > But If I search for uses of that class, it's only in the > >>> > > org.apache.plc4x.java.spi.connection.NettyChannelFactory which is > >>> in the > >>> > > SPI module. > >>> > > > >>> > > So I am not sure where this is accessed directly from the outside. > >>> I know > >>> > > every driver would use the NettyChannelFactory, but that shouldn't > >>> be an > >>> > > OSGi type problem as the SPI classes should be able to access > >>> their own > >>> > > classes. > >>> > > > >>> > > Chris > >>> > > > >>> > > > >>> > > > >>> > > Am 31.03.20, 16:07 schrieb "Etienne Robinet" <43...@etu.he2b.be>: > >>> > > > >>> > > Hi, > >>> > > From the log the class is called outside the SPI by the > >>> transport > >>> > > > >>> > > Etienne > >>> > > > >>> > > > Le 31 mars 2020 à 15:24, Julian Feinauer < > >>> > > j.feina...@pragmaticminds.de> a écrit : > >>> > > > > >>> > > > Hi, > >>> > > > > >>> > > > yes, if ist only needed internally its fine.But why does > >>> someone > >>> > > then get a Class Not Found Exception? > >>> > > > This is usually a hint to some class loader issue in OSGi > >>> which is > >>> > > related to exports/ imports. > >>> > > > > >>> > > > J > >>> > > > > >>> > > > Am 31.03.20, 15:23 schrieb "Christofer Dutz" < > >>> > > christofer.d...@c-ware.de>: > >>> > > > > >>> > > > As this package is only referenced from within SPI, > >>> couldn't we > >>> > > just exclude it from the package exports? > >>> > > > > >>> > > > Chris > >>> > > > > >>> > > > Am 31.03.20, 15:17 schrieb "Julian Feinauer" < > >>> > > j.feina...@pragmaticminds.de>: > >>> > > > > >>> > > > Hi, > >>> > > > > >>> > > > the issue is that if we export it, then we break > >>> Nettys OSGi > >>> > > integration as we get a split package situation (two bundles > >>> exporting the > >>> > > same package, which is forbidden in OSGi). > >>> > > > > >>> > > > So I see no easy solution (but had to do the same > >>> once as > >>> > > Netty is pretty... private). > >>> > > > > >>> > > > J > >>> > > > > >>> > > > Am 31.03.20, 15:15 schrieb "Christofer Dutz" < > >>> > > christofer.d...@c-ware.de>: > >>> > > > > >>> > > > Hi all, > >>> > > > > >>> > > > I just discussed this issue with Etienne and I > >>> thought it > >>> > > was important for all, so I asked him to bring it here. > >>> > > > > >>> > > > In my effort to get the EmbeddedChannel working > >>> as a full > >>> > > "transport" module, I had to override the Netty Bootstrap > >>> mechanism. > >>> > > > Unfortunately in order to do so, I need to call > >>> "init" > >>> > > from the derived class. Unfortunately this is package private in > >>> Netty so I > >>> > > had > >>> > > > To add it to the same package. > >>> > > > > >>> > > > Would it help to just not export these packages > >>> to OSGi? > >>> > > > > >>> > > > But I'm also open for alternatives (Please none > >>> involving > >>> > > mega-evil reflection hackery). > >>> > > > > >>> > > > > >>> > > > Chris > >>> > > > > >>> > > > Am 31.03.20, 15:10 schrieb "Etienne Robinet" < > >>> > > erobi...@apache.org>: > >>> > > > > >>> > > > Hi all, > >>> > > > I've been working on the Camel Component and > >>> decided > >>> > > to test it inside Karaf, but I noticed that I've got this error > >>> now: > >>> > > > https://i.imgur.com/kUZPwZ5.png > >>> > > > > >>> > > > Seems like this class is not exported by the > >>> bundle > >>> > > so it can not be found. Anyone has an idea on how we could solve > >>> this? > >>> > > > > >>> > > > Etienne > >>> > > > > >>> > > > > >>> > > > > >>> > > > > >>> > > > > >>> > > > > >>> > > > > >>> > > > > >>> > > > >>> > > > >>> > > > >>> > > >>> > >>> > >>> > >> > >> -- > >> -- > >> Christian Schneider > >> http://www.liquid-reality.de > >> > >> Computer Scientist > >> http://www.adobe.com > >> >