I didn't think it through, but this is something I have in mind. Keep
existing implementation for URLClassLoader, and use URLClassLoader for
experimental support of Java 11.

    List<URL> urls;
    if (classLoader instanceof URLClassLoader) {
      urls = Arrays.asList(((URLClassLoader) classLoader).getURLs());
    } else {
      urls = new ClassGraph()
          .addClassLoader(classLoader)
          .getClasspathURLs();
    }

On Wed, Nov 27, 2019 at 4:16 PM Łukasz Gajowy <lukasz.gaj...@gmail.com>
wrote:

> This looks promising. Do you think you could share your code as well?
>
> That part sounds very calming:
> "ClassGraph is fully compatible with the new JPMS module system (Project
> Jigsaw / JDK 9+), i.e. it can scan both the traditional classpath and the
> module path. However, the code is also fully backwards compatible with JDK
> 7 and JDK 8 (i.e. the code is compiled in Java 7 compatibility mode, and
> all interaction with the module system is implemented via reflection for
> backwards compatibility)."
>
> I'm currently working on rebuilding the classpath detection mechanism so
> that it scans java.class.path when URLClassLoader cannot be used (as Luke
> suggested) but if we decide to use classgraph it should be relatively easy
> to do that instead. Moreover, I want to enable the possibility of injecting
> any algorithm implementation through pipeline options - this will enable
> third-party vendors to inject their custom implementations if needed (SPI
> pattern that was mentioned at some point in a jira ticket). I think I'm
> pretty close to finishing that.
>
> Thanks!
>
> śr., 27 lis 2019 o 15:24 Gleb Kanterov <g...@spotify.com> napisał(a):
>
>> Today I tried using classgraph [1] library to scan classpath in Java 11
>> instead of using URLClassLoader, and after that, the job worked on
>> Dataflow. The logic of scanning classpath is pretty sophisticated [2], and
>> classgraph doesn't have any dependencies. I'm wondering if we can relocate
>> it to java-core jar and use in for non-URLClassLoaders?
>>
>> [1]: https://github.com/classgraph/classgraph
>> [2]:
>> https://github.com/classgraph/classgraph/blob/master/src/main/java/io/github/classgraph/Scanner.java
>>
>> On Fri, Nov 8, 2019 at 11:40 PM Luke Cwik <lc...@google.com> wrote:
>>
>>> I believe the closest suggestion[1] we had that worked for Java 11 and
>>> maintained backwards compatibility was to use the URLClassLoader to infer
>>> the resources and if we couldn't do that then look at the java.class.path
>>> system property to do the inference otherwise fail and force the users to
>>> tell us what. There are too many scenarios where we will do it wrong
>>> because of how people package and deploy their code whether it is an
>>> embedded application server or some other application container with a
>>> security manager that will prevent us from doing the right thing.
>>>
>>> On Fri, Nov 8, 2019 at 10:31 AM Robert Bradshaw <rober...@google.com>
>>> wrote:
>>>
>>>> Note that resources are more properly tied to specific operations and
>>>> stages, not to the entire pipeline. This is especially true in the
>>>> face of libraries (which should have the ability to declare their own
>>>> resources) and cross-language.
>>>>
>>>> On Fri, Nov 8, 2019 at 10:19 AM Łukasz Gajowy <lgaj...@apache.org>
>>>> wrote:
>>>> >
>>>> > I figured that it would be good to bump this thread for greater
>>>> visibility even though I don't have a strong opinion about this (yet -
>>>> hopefully, I will know more later to be able to share ;) ).
>>>> >
>>>> > Answering the questions Luke asked will unblock this issue:
>>>> https://issues.apache.org/jira/browse/BEAM-5495. Solving it is needed
>>>> for Java 11 migration (current detecting mechanism does not work with java
>>>> > 8).
>>>> >
>>>> >
>>>> >>
>>>> >> That said letting the user resolve the jars to stage can be saner
>>>> instead of assuming it is in the classpath/loader. I already have a few
>>>> cases where it will fail cause the transforms load the jars from outside
>>>> the app classloader (transforms are isolated).
>>>> >
>>>> >
>>>> >
>>>> > If I understand correctly, at least in Dataflow runner, if users want
>>>> to provide custom resources to stage, they can use filesToStage pipeline
>>>> option. Once the option is not null, the runner doesn't detect the
>>>> resources automatically and stages resources enlisted in the option
>>>> instead. I think this should be the approach common for all runners (if it
>>>> is not the case already).
>>>>
>>>
>>> Your understanding is correct and consistency across runners for a
>>> pipeline option is good for our users.
>>>
>>>
>>>> >
>>>> > Thanks,
>>>> > Łukasz
>>>> >
>>>> >
>>>> >
>>>>
>>>
>>> 1: https://github.com/apache/beam/pull/8775
>>>
>>

Reply via email to