I meant RMIClassLoaderSPI below. And note that this mechanism is currently a VM Wide implementation detail, instead of being a service proxy specific mechanism. That’s where we need to be able to allow for something specific to plugin for a specific service to use a specific platform for resolving proxy and serviceUI components.
Gregg > On Feb 3, 2017, at 9:52 AM, Gregg Wonderly <ge...@cox.net> wrote: > > I was merely speaking of a ClassLoader which might composite several > ClassLoaders using something like the codebase annotation. If we want to > make it possible to load service proxies and serviceUI codebases from > “anywhere” in Jini, we should be prepared to utilize whatever “compositing” > technique that platform provides/uses, while still trying to provide a > concrete view of ClassLoader passed around as TCCL so that specific isolation > that will occur, is maintained in code that is shared across all of these > codesource types. > > There may need to be some kind of factory involved at some level that is > parameterized by platform type, as is implied by the RMIClassLoaderAPI > mechanisms use of the codebase annotation. > > Gregg > >> On Feb 3, 2017, at 12:52 AM, Peter <j...@zeus.net.au> wrote: >> >> Just in case I've misunderstood. Was your reference to composite ClassLoader >> is a reference to Bharath's earlier posted link? >> >> http://blog.osgi.org/2008/08/classy-solutions-to-tricky-proxies.html?m=1 >> >> Regards, >> >> Peter. >> >> Sent from my Samsung device. >> >> Include original message >> ---- Original message ---- >> From: Peter <j...@zeus.net.au> >> Sent: 03/02/2017 02:23:25 pm >> To: dev@river.apache.org <d...@riverapache.org> >> Subject: Re: OSGi >> >> Thanks Gregg, >> >> I realise that Jini may have been a lot more successful had your experiences >> with desktop applications been given greater consideration. >> >> Any thoughts on JavaFX, fxml for serviceui? >> >> Criticism had also in the past, been levelled at the lookup service's >> inability to perform boolean logic comparisons of Entry fields. Delayed >> unmarshalling allows local Entry comparisons, improved security and a more >> responsive ui. >> >> I understand why you wouldn't want to "download the internet" (which really >> means download transitive dependencies at startup) when a user first opens >> their desktop application, quick start up is important on the desktop. Less >> so on the server where run time performance is more important. >> >> I get that you're not prepared to take a backwards step with desktop start >> up performance. >> >> OSGi support is targeted towards Iot and growing our developer base, it's a >> convenient time for me to work on that now, as I'm working on a modular >> maven build, but it's still my understanding that we (River) also intend to >> continue supporting other developers who don't utilise OSGi or Maven (Rio >> users). >> >> Maven pulls in a lot of unnecessary transitive dependencies (which isn't a >> problem for a server or build env), OSGi reduces them by using package >> dependencies at runtime. Classdep can reduce the number further to only the >> class files necessary, but it doesn't support versioning. >> >> Jigsaw is a modular framework that doesn't use ClassLoaders to manage module >> visibility but it has no versioning support either >> >> Containers and modularity are developer concerns, but we need to ensure this >> is as easy as possible for developers to implement their chosen design and >> environment. Right now OSGi is difficult because no one has written >> serialization that takes its ClassLoader visibility into account. >> >> OSGi and Maven provide some good tools for automating and simplifying the >> build process. Bnd generates manifests automatically with package imports >> and exports for OSGi and also reads annotations. Modules certainly make the >> code easier to read and understand for the maintainer and allows components >> that don't change to be released on different timeframes. The qa test suite >> is still an ant build, which I'm currently working on running with the new >> jar names on the class path (affects test policy file grants). Clearly >> tests will need to be written for OSGi. >> >> The TCCL classloader will continue to work as it always has, when an OSGi >> framework is not detected. >> >> At the end of the day though, no framework is mandatory and developers can >> use classdepandjar to package only the classes needed for a client app or >> proxy into a single jar. >> >> The classdepend library (rewritten internals of classdep that uses asm) >> could be utilised to create a runtime dependency graph as you suggest (which >> could be serialized) and Jigsaw may yet have a role to play (and I've done >> some work already to support java 9). The risk with Classdep is, it may not >> pick up all dependencies in modern bytecode, its only written with >> consideration for java 6 class files. Jdk 1.9 provides a new tool, jdeps to >> discover dependencies and this might be utilised to replace Classdep or its >> internal implementation in the long term, if someone steps up and takes that >> on. Classdep has developed a bug in recent times that affects the build >> (occassionally drops deps) and there has been little maintenance on it >> recently. >> >> OSGi could also determine dependency graphs, however would be OSGi specific >> (package deps) and I'm not yet certain it's necessary. I also think that >> dependency graphs will tend to be a framework concern, whether they are >> class, package or module based dependencies they are specific. >> >> At this time, choosing a specific container or framework for developers to >> utilise is a non goal, we're just working on better support for >> deserialization in an OSGi framework, because there are visibility problems >> that the TCCL can't completely solve for OSGi. >> >> No serialization or Remote method invocation framework currently supports >> OSGi very well, one that works well and can provide security might gain a >> lot of new interest from that user base. >> >> A modular River also reduces the api users need to learn to get started, >> which makes River easier to learn for Maven or OSGi developers. In this >> case they already understand their build tools and probably want to continue >> using them. >> >> It's a non goal to chose any particular modular ity framework for developers >> to use at this time. >> >> Regards, >> >> Peter. >> >> Sent from my Samsung device . >> >> Include original message >> ---- Original message ---- >> From: Gregg Wonderly <ge...@cox.net> >> Sent: 03/02/2017 01:25:35 am >> To: dev@river.apache.org >> Subject: Re: OSGi >> >> I am a fan of “one jar” because I get real tired of spending time >> “packaging” when the class loading mechanisms already provide “segregation”. >> I understand how “pretty” packaging is and how everyone can be completely >> excited about a clean view of dependencies. However, when I package >> something that works, I don’t want to hand someone 5 things. The “jar” file >> has been “click to run” file type for a long time. That, for me means that >> you should be able to get everything you need from that jar. The problem >> that clickable jar files suffer from, is that lack of use of Java for >> desktop apps. Instead, the server mentality of 10s of jars from 10s of >> places, integration, versioning, etc., have created the “lots of pieces is >> fine” viewpoint and tooling around that has made it pretty much impossible >> to easily create one jar, without “custom” packaging. >> >> I like to solve problems once, not over and over again. We need to make >> sure and think about “tools” that make whatever packaging is decided on, >> trivial to create. Think about using annotations to segregate pieces into >> the packages that you want them to be in. Think about runtime dependency >> graphs being expressible in annotations as well, so that we might be able to >> utilize a composite class loader to “get” dependent jars from an appropriate >> source. This would allow great, dynamic binding to occur in the class >> loader, and still provide a single class loader view of the context so that >> TCCL and other parts of the Java runtime will still work in non-jini >> packages. >> >> Gregg >> >>> On Feb 1, 2017, at 7:44 PM, Peter <j...@zeus.net.au> wrote: >>> >>> Thanks Gregg, >>> >>> I think it's necessary to continue supporting preferred class loading for >>> those who don't use osgi or maven. Rio already has a maven class resolver >>> RMIClassLoaderSPI implementation. But we also need to ensure we can still >>> solve the same problems that preferred class loading addresses in modular >>> environments. >>> >>> We also need to consider how existing implementations can transition to a >>> modular framework, should developers want to. >>> >>> River / Jini's classdepandjar duplicates classes in jar files. Maven or >>> OSGi modules usually don't. >>> >>> In a modular version of Gregg's use case scenario, the shared Entries >>> wouldn't be included in the proxy codebase but instead be imported from >>> another module / bundle / package. >>> >>> The Entry's would be imported by the client and proxy modules / bundles, >>> avoiding unnecessary downloads and ensuring shared visibility. The client >>> and proxy will need to have an overlapping import package version range and >>> the currently utilised package at the client will need to be within the >>> proxy's imported version range, so it will be wired / resolved correctly. >>> >>> We should look at implementing a modular test case of what your doing, to >>> test our OSGiClassProvider. >>> >>> Supporting OSGi is likely to require delayed unmarshalling. Logical >>> comparisons of Package version Entry's will be required before proxy's can >>> be downloaded/ unmarshalled. >>> >>> The lookup service only provides exact matching. However it would be >>> possible to perform a limited range of version matching with wild cards >>> without delayed unmarshalling. >>> >>> Modular frameworks reduce downloads by utilising already downloaded code >>> when compatible. >>> >>> Regards, >>> >>> Peter >>> >>> Sent from my Samsung device. >>> >>> Include original message >>> ---- Original message ---- >>> From: Gregg Wonderly <ge...@cox.net> >>> Sent: 02/02/2017 06:56:43 am >>> To: dev@river.apache.org >>> Subject: Re: OSGi >>> >>> Part of the “preferred” is to keep downloads from happening. But the other >>> is the fact that the UI is already using/linked to specific sources of the >>> Entry classes that it uses for finding the name of the service, the icon >>> and other details. There are serviceUI classes which are also already >>> bound at the time of service discovery and the serviceUI for that service >>> needs to resolve to those classes, not any in the codebase jars for the >>> service. >>> >>> Gregg >>> >>>> On Feb 1, 2017, at 5:52 AM, Peter <j...@zeus.net.au> wrote: >>>> >>>> Gregg, >>>> >>>> Have you got some more detail on your Entry classes that need to be >>>> preferred? >>>> >>>> Thanks, >>>> >>>> Peter. >>>> >>>> Sent from my Samsung device. >>>> >>>> Include original message >>>> ---- Original message ---- >>>> From: Gregg Wonderly <ge...@cox.net> >>>> Sent: 31/01/2017 12:56:56 am >>>> To: dev@river.apache.org >>>> Subject: Re: OSGi >>>> >>>> Maybe you can help me out here by explaining how it is that execution >>>> context and class visibility are both handled by OSGi bundles. For >>>> example, one of my client applications is a desktop environment. It does >>>> service look up for all services registrations providing a “serviceUI”. >>>> It then integrates all of those services into a desktop view where the UIs >>>> are running at the same time with each one imbedded in a JDesktopPane or a >>>> JTabbedPane or a JFrame or JDialog. There are callbacks from parts of >>>> that environment into my application which in turn is interacting with the >>>> ServiceUI component. You have AWT event threads which are calling out, >>>> into the ServiceUIs and lots of other threads of execution which all, >>>> ultimately, must have different class loading environments so that the >>>> ServiceUI components can know where to load code from. >>>> >>>> It’s exactly TCCL that allows them to know that based on all the other >>>> class loading standards. The ClassLoader is exactly the thing that all of >>>> them have in common if you include OSGi bundles as well. The important >>>> detail, is that if the TCCL is not used as new ClassLoaders are created, >>>> then there is no context for those new ClassLoaders to reference, >>>> universally. >>>> >>>> The important details are: >>>> >>>> 1) The desktop application has to be able to prefer certain Entry >>>> classes which define details that are presented to the user. >>>> 2) When the user double clicks on a services icon, or right clicks >>>> and selects “Open in new Frame”, an async worker thread needs a TCCL >>>> pointing at the correct parent class loader for the service’s >>>> URLClassLoader to reference so that the preferred classes work. >>>> 3) Anytime that the AWT Event thread might be active inside of the >>>> services UI implementation, it also needs to indicate the correct parent >>>> class loader if that UI component causes other class loading to occur. >>>> 4) I am speaking specifically in the context of deferred class >>>> loading which is controlled outside of the service discovery moment. >>>> >>>> >>>>> On Jan 30, 2017, at 4:04 AM, Michał Kłeczek (XPro Sp. z o. o.) >>>>> <michal.klec...@xpro.biz> wrote: >>>>> >>>>> What I think Jini designers did not realize is that class loading can >>>>> be treated exactly as any other capability provided by a (possibly >>>>> remote) service. >>>>> Once you realize that - it is possible to provide a kind of a >>>>> "universal container infrastructure" where different class loading >>>>> implementations may co-exist in a single JVM. >>>> >>>> That’s precisely what ClassLoader is for. TCCL is precisely to allow >>>> “some class” to know what context to associate newly loaded classes with, >>>> so that in such an environment, any code can load classes on behalf of >>>> some other code/context. It doesn’t matter if it is TCCL or some other >>>> class management scheme such as OSGi bundles. We are talking about the >>>> same detail, just implemented in a different way. >>>> >>>>> What's more - these class loading implementations may be dynamic >>>>> themselves - ie. it is a service that provides the client with a way to >>>>> load its own (proxy) classes. >>>>> >>>>> In other words: "there not enough Jini in Jini itself”. >>>> >>>> I am not sure I understand where the short coming is at then. Maybe you >>>> can illustrate with an example where TCCL fails to allow some piece of >>>> code to load classes on behalf of another piece of code? >>>> >>>> In my desktop application environment, there is a abstract class which is >>>> used by each serviceUI to allow the desktop to know if it provides the >>>> ability to open into one of the above mentioned JComponent subclasses.. >>>> That class is preferred and provided and resolved using the codebase of >>>> the desktop client. That class loading environment is then the place >>>> where the service is finally resolved and classes created so that the >>>> proxy can be handed to the serviceUI component which ultimately only >>>> partially resolves from the services codebase. >>>> >>>> It’s this class compatibility which needs to be lightweight. >>>> >>>>> >>>>> We have _all_ the required pieces in place: >>>>> - dynamic code loading and execution (ClassLoaders), >>>>> - security model and implementation that allows restricting rights of >>>>> the downloaded code, >>>>> - and a serialization/deserialization which allows sending arbitrary >>>>> data (and yes - code too) over the wire. >>>>> >>>>> It is just the matter of glueing the pieces together. >>>> >>>> Correct, but it’s a matter of class compatibility where a client >>>> environment has to interact with a service and the serviceUI components >>>> where TCCL excels and providing the ability to create class loaders with >>>> the correct parent context, for Java based code. OSGi introduces the >>>> opportunity for some extra bells and whistles. But I don’t see that it >>>> can completely eliminate the nature of TCCL and how it was intended to be >>>> used. >>>> >>>>> >>>>> Thanks, >>>>> Michal >>>>> >>>>> >>>>> Gregg Wonderly wrote: >>>>>> <snip> >>>>>> I am not an OSGi user. I am not trying to be an OSGi opponent. What >>>>>> I am trying to say is that I consider all the commentary in those >>>>>> articles about TCCL not working to be just inexperience and argument to >>>>>> try and justify a different position or interpretation of what the real >>>>>> problem is. >>>>>> >>>>>> The real problem is that there is not one “module” concept in Java >>>>>> (another one is almost here in JDK 9/Jigsaw). No one is working >>>>>> together on this, and OSGi is solving problems in a small part of the >>>>>> world of software. It works well for embedded, static systems. I >>>>>> think OSGi misses the mark on dynamic systems because of the piecemeal >>>>>> loading and resolving of classes. I am not sure that OSGi developers >>>>>> really understand everything that Jini can do because of the choices >>>>>> made (and not made) in the design. The people who put Jini together had >>>>>> a great deal of years of experience piecing together systems which >>>>>> needed to work well with a faster degree of variability and adaptation >>>>>> to the environment then what most people seem to experience in their >>>>>> classes and work environments which are locked down by extremely >>>>>> controlled distribution strategies which end up slowing development in >>>>>> an attempt to control everything that doesn’t actually cause quality to >>>>>> suffer. >>>>>> >>>>>> Gregg >>>>>> >>>>>> >>>>> >>>> >>>> >>> >>> >> >> >> >> >> >