Hi all,
With the change of Christofer this problem got solved. Nonetheless, I kept
the work I did (inspired by the work of Lukasz) to make an Activator for
API (Driver Services) and SPI (Transport Services). I also tested it, but
as I am pretty new to this, if anyone could just give me a feedback on the
code:

API Activator:
https://github.com/apache/plc4x/blob/feature/osgi/plc4j/api/src/main/java/org/apache/plc4x/java/osgi/ApiActivator.java
SPI Activator:
https://github.com/apache/plc4x/blob/feature/osgi/plc4j/spi/src/main/java/org/apache/plc4x/java/osgi/SpiActivator.java

If everything is alright, I could merge this today.

Etienne

Le mar. 7 avr. 2020 à 17:52, Christofer Dutz <[email protected]> a
écrit :

> Hi folks,
>
> I just pushed a change that might get rid of this error.
>
> I added the Plc4xBootstrap in an attempt to get the TestTransport working.
> For some reasons the netty folks created the EmbeddedChannel differently
> than the rest.
> However as the TestTransport is the only one needing this change, I moved
> these classes to the test-transport module
> and extended NettyChannelFactory with a createBootstrap method which is
> simply overridden in TestTransport.
>
> So please give everything a try if it now works as planned.
>
> Chris
>
>
>
> Am 07.04.20, 17:36 schrieb "Etienne Robinet" <[email protected]>:
>
>     Hi all,
>     I’ve checked the Manifest. If I put the Embed-Dependency to the
> plc4j-spi artifact  it does not find the Transport Service. And if I dont
> it does not find the Plc4xBootstrap.
>
>     Etienne ROBINET
>
>     > Le 7 avr. 2020 à 16:48, Łukasz Dywicki <[email protected]> a
> écrit :
>     >
>     > I was updating my local checkout yesterday. Can't promise if I will
> be
>     > able to help, but will give a try with 0.7 snapshot.
>     >
>     > Best,
>     > Łukasz
>     >
>     >
>     >> On 07.04.2020 15:39, Etienne Robinet 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 <[email protected]>
> 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 <[email protected]>
> 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 <
> [email protected]> 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 <
>     >>>>>> [email protected]>:
>     >>>>>>
>     >>>>>>> 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" <
> [email protected]>:
>     >>>>>>>
>     >>>>>>>    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 <[email protected]>
> 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 <
>     >>>>>>> [email protected]>
>     >>>>>>>> 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" <
> [email protected]>:
>     >>>>>>>>>
>     >>>>>>>>>    Hi,
>     >>>>>>>>>    From the log the class is called outside the SPI by the
>     >>>>>>> transport
>     >>>>>>>>>
>     >>>>>>>>>    Etienne
>     >>>>>>>>>
>     >>>>>>>>>> Le 31 mars 2020 à 15:24, Julian Feinauer <
>     >>>>>>>>> [email protected]> 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" <
>     >>>>>>>>> [email protected]>:
>     >>>>>>>>>>
>     >>>>>>>>>>   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" <
>     >>>>>>>>> [email protected]>:
>     >>>>>>>>>>
>     >>>>>>>>>>       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" <
>     >>>>>>>>> [email protected]>:
>     >>>>>>>>>>
>     >>>>>>>>>>           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" <
>     >>>>>>>>> [email protected]>:
>     >>>>>>>>>>
>     >>>>>>>>>>               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