Looks like this is due to a conflict with EE JARs added to replace those
removed when moving from Java 8 to 17.

On Wed, Dec 21, 2022 at 3:33 PM Tim N <tnti...@gmail.com> wrote:

> Sorry - more of the stack-trace:
> Caused by: java.lang.IllegalAccessError: failed to access class
> com.sun.activation.registries.LogSupport from class
> javax.activation.MimetypesFileTypeMap
> (com.sun.activation.registries.LogSupport and
> javax.activation.MimetypesFileTypeMap are in unnamed module of loader
> java.net.URLClassLoader @2328c243)
> at
> javax.activation.MimetypesFileTypeMap.<init>(MimetypesFileTypeMap.java:100)
> at
> javax.activation.MimetypesFileTypeMap.<init>(MimetypesFileTypeMap.java:271)
> at
> org.springframework.mail.javamail.ConfigurableMimeFileTypeMap.createFileTypeMap(ConfigurableMimeFileTypeMap.java:150)
>
> On Wed, Dec 21, 2022 at 3:28 PM Tim N <tnti...@gmail.com> wrote:
>
>> I tried this:
>>
>> List<ClassLoaderFactory.Repository> repositories = new ArrayList<>();
>> repositories.add(new ClassLoaderFactory.Repository(new
>> File("/dir1").getAbsolutePath(), ClassLoaderFactory.RepositoryType.DIR));
>> repositories.add(new ClassLoaderFactory.Repository(new
>> File("sub-mod1/target/classes").getAbsolutePath(),
>> ClassLoaderFactory.RepositoryType.DIR));
>> repositories.add(new ClassLoaderFactory.Repository(new
>> File("sub-mod2/target/classes").getAbsolutePath(),
>> ClassLoaderFactory.RepositoryType.DIR));
>> File[] files = new File("lib-runtime").listFiles();
>> for (File file : files) {
>>  repositories.add(new
>> ClassLoaderFactory.Repository(file.getAbsolutePath(),
>> ClassLoaderFactory.RepositoryType.JAR));
>> }
>>
>> ClassLoader myClassLoader =
>> ClassLoaderFactory.createClassLoader(repositories, null);
>>
>> Thread.currentThread().setContextClassLoader(myClassLoader);
>> SecurityClassLoad.securityClassLoad(myClassLoader);
>> ...
>> Tomcat tomcat = new Tomcat();
>> tomcat.getService().setParentClassLoader(myClassLoader);
>>
>> And am currently getting this:
>> java.util.concurrent.ExecutionException:
>> org.apache.catalina.LifecycleException: Failed to start component
>> [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
>> at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
>> at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
>> at
>> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:923)
>> at
>> org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835)
>> at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>> at
>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393)
>> at
>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383)
>> at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
>> at
>> org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
>> at
>> java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
>> at
>> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916)
>> at
>> org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:265)
>> at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>> at
>> org.apache.catalina.core.StandardService.startInternal(StandardService.java:430)
>> at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>> at
>> org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
>> at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>> at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486)
>>
>> So the code looks closer to working, but still something major wrong.
>>
>> On Wed, Dec 21, 2022 at 11:02 AM Tim N <tnti...@gmail.com> wrote:
>>
>>> > The custom class loader approach described in one of the answers is a
>>> > viable option.
>>>
>>> Thanks.
>>>
>>> > No. The same class loader hierarchy isn't constructed when running in
>>> > embedded mode.
>>>
>>> It looks like I would need to replicate all the classloading
>>> capabilities of Tomcat (e.g. loading classes from files and JARs). Any tips
>>> for implementing this?
>>>
>>> It looks like the Tomcat classloader code is available via
>>> https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina.
>>> This isn't a tomcat-embedded module, but looks like it might be compatible.
>>> Could these classes be used to achieve what I'm after? If I could get this
>>> working, I could maybe contribute back with "how-to" documentation.
>>> Thoughts?
>>>
>>> Also, how do I make embedded Tomcat use my classloader?
>>>
>>>
>>> On Wed, Dec 14, 2022 at 9:19 PM Mark Thomas <ma...@apache.org> wrote:
>>>
>>>> On 14/12/2022 03:20, Tim N wrote:
>>>> > I'm currently using embedded Tomcat 9.0.68 and have encountered the
>>>> > infamous compatibility issue with ClassLoader.getSystemClassLoader
>>>> when
>>>> > upgrading from Java 8 to Java 17.
>>>> > See
>>>> >
>>>> https://stackoverflow.com/questions/46694600/java-9-compatability-issue-with-classloader-getsystemclassloader
>>>> > for a good summary.
>>>>
>>>> The custom class loader approach described in one of the answers is a
>>>> viable option.
>>>>
>>>> > Is it possible to utilise and modify the Tomcat classloader hierarchy
>>>> for
>>>> > embedded Tomcat to add to the classpath, specifically:
>>>> >   - Add some shared libraries as done with the 'shared.loader' for
>>>> Tomcat
>>>> > for production and development environments
>>>>
>>>> No. The same class loader hierarchy isn't constructed when running in
>>>> embedded mode.
>>>>
>>>> >   - Add another module's classes to the classpath for a web-app for
>>>> > development environment only (e.g. add "../sub-module/target/classes"
>>>> to
>>>> > classpath)
>>>>
>>>> Yes. Each web application still retains its own class loader. You
>>>> configure the web application resources to map static resources, JARs
>>>> and/or directories of classes to the right place in your web app.
>>>>
>>>> For example (totally untested but should give you the idea):
>>>>
>>>> Tomcat tomcat = new Tomcat();
>>>> Context context = tomcat.addContext("", "/some/path");
>>>> WebResourceRoot root = context.getResources();
>>>> DirResourceSet extraJARs = new DirResourceSet(root,
>>>>          "/WEB-INF/lib", "/path/to/extra/jars", "");
>>>> root.addPostResources(extraJARs);
>>>>
>>>> > In Java 8 I can achieve this by calling 'addURL' on 'URLClassLoader',
>>>> but
>>>> > that is no longer possible in Java 9+.
>>>> >
>>>> > Is there any official documentation for this?
>>>>
>>>> The docs for configuring this in context.xml are here:
>>>>
>>>> https://tomcat.apache.org/tomcat-9.0-doc/config/resources.html
>>>>
>>>> Javadoc for doing it directly is here:
>>>>
>>>>
>>>> https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/webresources/package-summary.html
>>>>
>>>> HTH,
>>>>
>>>> Mark
>>>> >
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
>>>> For additional commands, e-mail: users-h...@tomcat.apache.org
>>>>
>>>>

Reply via email to