As for the META-INF/services, that is a standard JDK feature, known as the
ServiceLoader, unrelated to OSGi.

@Component is a sign of the Declarative Services that Łukasz asked about,
but it requires compile-time support to work as expected. Under the hood,
DS is still doing the normal song and dance of OSGi core services.

// Niclas

On Tue, Apr 7, 2020 at 11:56 AM Robinet, Etienne <43...@etu.he2b.be> wrote:

> Hi Lukasz,
> thank you very much for your help, I will look into this today.
> For the drivers as services, isn't that already the case? I know that for
> S7 and EIP at least,
>  the yhave the osgi.cmpn dependency and the @Component annotation for the
> class, as well as a file with the implemented Driver class (with the Driver
> interface file name) under main/resources/META-INF/services (
>
> https://github.com/apache/plc4x/blob/develop/plc4j/drivers/eip/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
> )
> . Is that something else?
> Etienne
>
> Le lun. 6 avr. 2020 à 22:28, Łukasz Dywicki <l...@code-house.org> a écrit
> :
>
> > 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&amp;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
> > >>
> >
>

Reply via email to