Have you checked that the MANIFEST.MF looks good? On Tue, Apr 7, 2020, 21:39 Etienne Robinet <erobi...@apache.org> wrote:
> Hi again, > I've been looking at this issue all day, and I am back to the initial > error: > https://i.imgur.com/LLfan8H.png > > The difference is I used and Activator for API and SPI to register the > driver and transports Service, which are then loaded by the custom > blueprint. The error now is caused again because this class is not exported > (I think?) by the SPI, but is used by one of the dependency (io.netty). > Any ideas on how to solve this? > > Etienne > > On 2020/04/07 06:53:54, Etienne Robinet <erobi...@apache.org> wrote: > > 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 > > > >> > > > > > >