Hi,

> Try addURL().
> Sorry for the inconvenience.
> As I understand addURL() method is defined in WebAppClassLoaderBase. So
> should I obtain the WebAppClassLoaderBase using getClassLoader() method
and
> use reflections to call the addURL() method?

>>No need for reflection. Cast to URLClassloader.

>>Note the cast *should* always work but if someone is using a strange
>>custom class loader it will fail. Note that Tomcat 7 required the class
>>loader to be an instance of WebappClassLoader.
>Thanks for quick explanation Mark.
>But still addURL() method is defined as protected. So it is not possible
to call that method by casting right?
This is my implementation with Tomcat 7

public class CarbonWebappLoader extends WebappLoader {

@Override
protected void startInternal() throws LifecycleException {
WebappClassloadingContext webappClassloadingContext;
try {
webappClassloadingContext =
ClassloadingContextBuilder.buildClassloadingContext(getWebappFilePath());
} catch (Exception e) {
throw new LifecycleException(e.getMessage(), e);
}

for (String repository :
webappClassloadingContext.getProvidedRepositories()) {
addRepository(repository);
}
 super.startInternal();

//Adding the WebappClassloadingContext to the WebappClassloader
((CarbonWebappClassLoader)
getClassLoader()).setWebappCC(webappClassloadingContext);
}

In Tomcat 8 don't have addRepository() in the WebAppLoader. Suggestion was
to use addURL() method.
But that can be access through WebAppClassLoader. So I must get the
classloader using getClassLoader() and use reflections to call addURL
method.
That would be really costly operation since it will get call for each and
every application.

Is there a better approach than that? Or Should I move this logic to
somewhere else?

Thanks
Best Regards

2015-04-07 16:19 GMT+05:30 Thusitha Thilina Dayaratne <
thusithathil...@gmail.com>:

> Hi,
>
> > Hi Mark,
> >
> > <snipe/>
>
> :)
> I think you meant snip rather than snipe.
>
> > Try addURL().
> > Sorry for the inconvenience.
> > As I understand addURL() method is defined in WebAppClassLoaderBase. So
> > should I obtain the WebAppClassLoaderBase using getClassLoader() method
> and
> > use reflections to call the addURL() method?
>
> >>No need for reflection. Cast to URLClassloader.
>
> >>Note the cast *should* always work but if someone is using a strange
> >>custom class loader it will fail. Note that Tomcat 7 required the class
> >>loader to be an instance of WebappClassLoader.
> Thanks for quick explanation Mark.
> But still addURL() method is defined as protected. So it is not possible
> to call that method by casting right?
>
>
>
> >
> >
> > Thanks
> > Best Regards
> >
> > On Tue, Apr 7, 2015 at 1:19 PM, Mark Thomas <ma...@apache.org> wrote:
> >
> >> On 07/04/2015 07:51, Thusitha Thilina Dayaratne wrote:
> >>> Hi All,
> >>>
> >>> I'm having the same issue. We have extend the WebAppLoader as follows
> in
> >>> the Tomcat 7
> >>>
> >>> public class CarbonWebappLoader extends WebappLoader {
> >>>     @Override
> >>>     protected void startInternal() throws LifecycleException {
> >>>         WebappClassloadingContext webappClassloadingContext;
> >>>         try {
> >>>             webappClassloadingContext =
> >>> ClassloadingContextBuilder.buildClassloadingContext(
> getWebappFilePath());
> >>>         } catch (Exception e) {
> >>>             throw new LifecycleException(e.getMessage(), e);
> >>>         }
> >>>
> >>>         //Adding provided classpath entries, if any
> >>>         for (String repository :
> >>> webappClassloadingContext.getProvidedRepositories()) {
> >>>             addRepository(repository);
> >>>         }
> >>>
> >>>         super.startInternal();
> >>>
> >>>         //Adding the WebappClassloadingContext to the WebappClassloader
> >>>         ((CarbonWebappClassLoader)
> >>> getClassLoader()).setWebappCC(webappClassloadingContext);
> >>>     }
> >>> }
> >>>
> >>> Since addRepository method have been removed, what could I do?
> >>
> >> Don't top-post.
> >>
> >> Read the thread history. The answer has already been provided by Chris.
> >>
> >> Mark
> >>
> >>
> >>>
> >>>
> >>> Thanks
> >>> Best Regards
> >>> /Thusitha
> >>>
> >>> On Wed, Mar 18, 2015 at 12:25 AM, Mark Thomas <ma...@apache.org>
> wrote:
> >>>
> >>>> On 17/03/2015 18:30, Ed Rouse wrote:
> >>>>>
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>> From: Pilkington, Simon [mailto:simo...@amazon.com]
> >>>>>> Sent: Tuesday, March 17, 2015 12:45 PM
> >>>>>> To: users@tomcat.apache.org
> >>>>>> Subject: [Tomcat8] What happened to WebappLoader.addRepository()?
> >>>>>>
> >>>>>> Hey tomcat users,
> >>>>>>
> >>>>>> The javadoc for WebappLoader still tells me to use addRepository(),
> >> but
> >>>>>> that method no longer exists. My team has implemented an extension
> of
> >>>>>> WebappLoader that looked like this:
> >>>>>>
> >>>>>>
> >> http://cp.mcafee.com/d/1jWVIq3zqb2rzydPhOCYrKrhKCqenTzhOe7cCQrFCzBZUQsL
> >>>>>>
> >> 9ICQrFCzBZUQszxP1J6WpEVvd7aabPxLURrFUalAv3UYKrlAv3UYKrKXHXRTT-LPz5TCnA-
> >>>>>>
> >> LsKyev7szsQsIFICzBzBHEShhlKYPOEuvkzaT0QSyrjdTdTdAVPmEBCjGHrpZGSS9_M079R
> >>>>>>
> >> lJIOUXHBQaSPlFo01PlJIj_brfjVgT3WWxYs0nO6Hb1mKEv7wsrrFYq5U_dKc2WrWr9EVjb
> >>>>>> _6HtfelAv3UYK2FRlJI-
> >>>>>>
> >> Rrr4_U02rs7e3zpFr1dlrrdUQKCy01iuPd41flBLxW1EwDkQg0bV3lBwHnkfzSE80LRGQBe
> >>>>>> IiNEEd598S-UrI1Lf5-sL
> >>>>>>
> http://cp.mcafee.com/d/2DRPoAd3hJ5xdNN6VEVjudTdETjd7bXNEV73CjqdQPhO-
> >>>>>> YqenASjqdQPhO-
> >>>>>>
> >> YqehMVwSztcQsLCzB55VMTYqJQY5aOfxYundGOfxYundTtRZWXX_nVNyXPbOvnKnh7fzKhK
> >>>>>> qemkSjhONORQr8EGTupVkffGhBrwqrjdFCXCXCOsVHkiP9RlJI-
> >>>>>>
> >> Rrr4_U03AWGSSptXHBQaSPlFo01PlJIj_brfjVgT3WWxYs0nO6Hb1mKEv7wsrrFYq5U_dKc
> >>>>>> 2WrWr9EVjb_6HtfelAv3UYK2FRlJI-
> >>>>>>
> >> Rrr4_U02rs7e3zpFr1dlrrdUQKCy01iuPd41flBLxW1EwDkQg0bV3lBwHnkfzSE80LRGQBe
> >>>>>> IiNEEd598S-UrHrI5
> >>>>>>
> >>>>>>    @Override
> >>>>>>    protected void startInternal() throws LifecycleException {
> >>>>>>        // validate the context, which is used for debugging messages
> >>>>>>        Context context;
> >>>>>>        {
> >>>>>>            Container container = getContainer();
> >>>>>>            if (container == null) {
> >>>>>>                throw new LifecycleException("Container is null?!");
> >>>>>>            }
> >>>>>>            if (!(container instanceof Context)) {
> >>>>>>                throw new LifecycleException("Container is not an
> >>>>>> instance of Context?!");
> >>>>>>            }
> >>>>>>            context = (Context) container;
> >>>>>>        }
> >>>>>>
> >>>>>>        if (ENVIRONMENT_ROOT != null && ENVIRONMENT_ROOT.length() >
> 0)
> >> {
> >>>>>>            // validate targetPackage
> >>>>>>            if (null == targetPackage) {
> >>>>>>                throw new LifecycleException(
> >>>>>>                        "Missing required Loader attribute
> >>>>>> \"targetPackage\" in Context configuration " +
> >>>>>>                                context.getConfigFile());
> >>>>>>            }
> >>>>>>
> >>>>>>            try {
> >>>>>>                // Excluded jars are those already pulled in by
> tomcat.
> >>>>>>                Set<String> allExcludedJars = getAllExcludedJars();
> >>>>>>                Set<String> reallyExcludedJars = new
> HashSet<String>();
> >>>>>>                // add JARs from target package as "repositories"
> >>>>>>                // getPackageClasspath finds the list of jars I want
> to
> >>>>>> include for this webapp.
> >>>>>>                for (String jar : getPackageClasspath(targetPackage))
> {
> >>>>>>                    File file = new File(ENVIRONMENT_ROOT, jar);
> >>>>>>                    // skip bad and unwanted JARs
> >>>>>>                    if (allExcludedJars.contains(jar) ||
> >> isBadJar(file))
> >>>>>> {
> >>>>>>                        reallyExcludedJars.add(jar);
> >>>>>>                    } else {
> >>>>>>                        // TODO: HOW TO FIX ME??
> >>>>>>                        addRepository(file.toURI().toString());
> >>>>>>                    }
> >>>>>>                }
> >>>>>>                log.info("Context path \"" + context.getPath() + "\"
> >>>>>> excluding JARs: " + reallyExcludedJars);
> >>>>>>            } catch (IOException e) {
> >>>>>>                throw new LifecycleException(
> >>>>>>                        "Problem setting classpath for context path
> \""
> >>>>>> + context.getPath() + "\"",
> >>>>>>                        e);
> >>>>>>            }
> >>>>>>
> >>>>>>            // getRepositoriesString() has been renamed to
> >>>>>> getLoaderRepositoriesString()...
> >>>>>>            log.info("Context path \"" + context.getPath() + "\"
> using
> >>>>>> classpath: " + getRepositoriesString());
> >>>>>>        } else {
> >>>>>>            log.warning("MyWebappLoader seems to be used outside of
> my
> >>>>>> environment. Delegating to parent.");
> >>>>>>        }
> >>>>>>
> >>>>>>        super.startInternal();
> >>>>>>    }
> >>>>>>
> >>>>>> Can the community help me figure out how to upgrade this for tomcat
> 8?
> >>>>>
> >>>>> JarResourceSet jrs = new JarResourceSet(Context.getResources(), "/",
> >>>> file.getAbsolutePath(), "/");
> >>>>> Context.getResources().addPostResources(jrs);
> >>>>
> >>>> Bad idea. That will mount the contents of the JAR at the root of the
> web
> >>>> application.
> >>>>
> >>>> Mark
>
> Thanks
> Best regards
>
>
> 2015-04-07 15:46 GMT+05:30 Mark Thomas <ma...@apache.org>:
>
>> On 07/04/2015 09:27, Thusitha Thilina Dayaratne wrote:
>> > Hi Mark,
>> >
>> > <snipe/>
>>
>> :)
>> I think you meant snip rather than snipe.
>>
>> > Try addURL().
>> > Sorry for the inconvenience.
>> > As I understand addURL() method is defined in WebAppClassLoaderBase. So
>> > should I obtain the WebAppClassLoaderBase using getClassLoader() method
>> and
>> > use reflections to call the addURL() method?
>>
>> No need for reflection. Cast to URLClassloader.
>>
>> Note the cast *should* always work but if someone is using a strange
>> custom class loader it will fail. Note that Tomcat 7 required the class
>> loader to be an instance of WebappClassLoader.
>>
>> Mark
>>
>>
>> >
>> >
>> > Thanks
>> > Best Regards
>> >
>> > On Tue, Apr 7, 2015 at 1:19 PM, Mark Thomas <ma...@apache.org> wrote:
>> >
>> >> On 07/04/2015 07:51, Thusitha Thilina Dayaratne wrote:
>> >>> Hi All,
>> >>>
>> >>> I'm having the same issue. We have extend the WebAppLoader as follows
>> in
>> >>> the Tomcat 7
>> >>>
>> >>> public class CarbonWebappLoader extends WebappLoader {
>> >>>     @Override
>> >>>     protected void startInternal() throws LifecycleException {
>> >>>         WebappClassloadingContext webappClassloadingContext;
>> >>>         try {
>> >>>             webappClassloadingContext =
>> >>>
>> ClassloadingContextBuilder.buildClassloadingContext(getWebappFilePath());
>> >>>         } catch (Exception e) {
>> >>>             throw new LifecycleException(e.getMessage(), e);
>> >>>         }
>> >>>
>> >>>         //Adding provided classpath entries, if any
>> >>>         for (String repository :
>> >>> webappClassloadingContext.getProvidedRepositories()) {
>> >>>             addRepository(repository);
>> >>>         }
>> >>>
>> >>>         super.startInternal();
>> >>>
>> >>>         //Adding the WebappClassloadingContext to the
>> WebappClassloader
>> >>>         ((CarbonWebappClassLoader)
>> >>> getClassLoader()).setWebappCC(webappClassloadingContext);
>> >>>     }
>> >>> }
>> >>>
>> >>> Since addRepository method have been removed, what could I do?
>> >>
>> >> Don't top-post.
>> >>
>> >> Read the thread history. The answer has already been provided by Chris.
>> >>
>> >> Mark
>> >>
>> >>
>> >>>
>> >>>
>> >>> Thanks
>> >>> Best Regards
>> >>> /Thusitha
>> >>>
>> >>> On Wed, Mar 18, 2015 at 12:25 AM, Mark Thomas <ma...@apache.org>
>> wrote:
>> >>>
>> >>>> On 17/03/2015 18:30, Ed Rouse wrote:
>> >>>>>
>> >>>>>
>> >>>>>> -----Original Message-----
>> >>>>>> From: Pilkington, Simon [mailto:simo...@amazon.com]
>> >>>>>> Sent: Tuesday, March 17, 2015 12:45 PM
>> >>>>>> To: users@tomcat.apache.org
>> >>>>>> Subject: [Tomcat8] What happened to WebappLoader.addRepository()?
>> >>>>>>
>> >>>>>> Hey tomcat users,
>> >>>>>>
>> >>>>>> The javadoc for WebappLoader still tells me to use addRepository(),
>> >> but
>> >>>>>> that method no longer exists. My team has implemented an extension
>> of
>> >>>>>> WebappLoader that looked like this:
>> >>>>>>
>> >>>>>>
>> >>
>> http://cp.mcafee.com/d/1jWVIq3zqb2rzydPhOCYrKrhKCqenTzhOe7cCQrFCzBZUQsL
>> >>>>>>
>> >> 9ICQrFCzBZUQszxP1J6WpEVvd7aabPxLURrFUalAv3UYKrlAv3UYKrKXHXRTT-LPz5TCnA-
>> >>>>>>
>> >> LsKyev7szsQsIFICzBzBHEShhlKYPOEuvkzaT0QSyrjdTdTdAVPmEBCjGHrpZGSS9_M079R
>> >>>>>>
>> >> lJIOUXHBQaSPlFo01PlJIj_brfjVgT3WWxYs0nO6Hb1mKEv7wsrrFYq5U_dKc2WrWr9EVjb
>> >>>>>> _6HtfelAv3UYK2FRlJI-
>> >>>>>>
>> >> Rrr4_U02rs7e3zpFr1dlrrdUQKCy01iuPd41flBLxW1EwDkQg0bV3lBwHnkfzSE80LRGQBe
>> >>>>>> IiNEEd598S-UrI1Lf5-sL
>> >>>>>>
>> http://cp.mcafee.com/d/2DRPoAd3hJ5xdNN6VEVjudTdETjd7bXNEV73CjqdQPhO-
>> >>>>>> YqenASjqdQPhO-
>> >>>>>>
>> >> YqehMVwSztcQsLCzB55VMTYqJQY5aOfxYundGOfxYundTtRZWXX_nVNyXPbOvnKnh7fzKhK
>> >>>>>> qemkSjhONORQr8EGTupVkffGhBrwqrjdFCXCXCOsVHkiP9RlJI-
>> >>>>>>
>> >> Rrr4_U03AWGSSptXHBQaSPlFo01PlJIj_brfjVgT3WWxYs0nO6Hb1mKEv7wsrrFYq5U_dKc
>> >>>>>> 2WrWr9EVjb_6HtfelAv3UYK2FRlJI-
>> >>>>>>
>> >> Rrr4_U02rs7e3zpFr1dlrrdUQKCy01iuPd41flBLxW1EwDkQg0bV3lBwHnkfzSE80LRGQBe
>> >>>>>> IiNEEd598S-UrHrI5
>> >>>>>>
>> >>>>>>    @Override
>> >>>>>>    protected void startInternal() throws LifecycleException {
>> >>>>>>        // validate the context, which is used for debugging
>> messages
>> >>>>>>        Context context;
>> >>>>>>        {
>> >>>>>>            Container container = getContainer();
>> >>>>>>            if (container == null) {
>> >>>>>>                throw new LifecycleException("Container is null?!");
>> >>>>>>            }
>> >>>>>>            if (!(container instanceof Context)) {
>> >>>>>>                throw new LifecycleException("Container is not an
>> >>>>>> instance of Context?!");
>> >>>>>>            }
>> >>>>>>            context = (Context) container;
>> >>>>>>        }
>> >>>>>>
>> >>>>>>        if (ENVIRONMENT_ROOT != null && ENVIRONMENT_ROOT.length() >
>> 0)
>> >> {
>> >>>>>>            // validate targetPackage
>> >>>>>>            if (null == targetPackage) {
>> >>>>>>                throw new LifecycleException(
>> >>>>>>                        "Missing required Loader attribute
>> >>>>>> \"targetPackage\" in Context configuration " +
>> >>>>>>                                context.getConfigFile());
>> >>>>>>            }
>> >>>>>>
>> >>>>>>            try {
>> >>>>>>                // Excluded jars are those already pulled in by
>> tomcat.
>> >>>>>>                Set<String> allExcludedJars = getAllExcludedJars();
>> >>>>>>                Set<String> reallyExcludedJars = new
>> HashSet<String>();
>> >>>>>>                // add JARs from target package as "repositories"
>> >>>>>>                // getPackageClasspath finds the list of jars I
>> want to
>> >>>>>> include for this webapp.
>> >>>>>>                for (String jar :
>> getPackageClasspath(targetPackage)) {
>> >>>>>>                    File file = new File(ENVIRONMENT_ROOT, jar);
>> >>>>>>                    // skip bad and unwanted JARs
>> >>>>>>                    if (allExcludedJars.contains(jar) ||
>> >> isBadJar(file))
>> >>>>>> {
>> >>>>>>                        reallyExcludedJars.add(jar);
>> >>>>>>                    } else {
>> >>>>>>                        // TODO: HOW TO FIX ME??
>> >>>>>>                        addRepository(file.toURI().toString());
>> >>>>>>                    }
>> >>>>>>                }
>> >>>>>>                log.info("Context path \"" + context.getPath() +
>> "\"
>> >>>>>> excluding JARs: " + reallyExcludedJars);
>> >>>>>>            } catch (IOException e) {
>> >>>>>>                throw new LifecycleException(
>> >>>>>>                        "Problem setting classpath for context path
>> \""
>> >>>>>> + context.getPath() + "\"",
>> >>>>>>                        e);
>> >>>>>>            }
>> >>>>>>
>> >>>>>>            // getRepositoriesString() has been renamed to
>> >>>>>> getLoaderRepositoriesString()...
>> >>>>>>            log.info("Context path \"" + context.getPath() + "\"
>> using
>> >>>>>> classpath: " + getRepositoriesString());
>> >>>>>>        } else {
>> >>>>>>            log.warning("MyWebappLoader seems to be used outside of
>> my
>> >>>>>> environment. Delegating to parent.");
>> >>>>>>        }
>> >>>>>>
>> >>>>>>        super.startInternal();
>> >>>>>>    }
>> >>>>>>
>> >>>>>> Can the community help me figure out how to upgrade this for
>> tomcat 8?
>> >>>>>
>> >>>>> JarResourceSet jrs = new JarResourceSet(Context.getResources(), "/",
>> >>>> file.getAbsolutePath(), "/");
>> >>>>> Context.getResources().addPostResources(jrs);
>> >>>>
>> >>>> Bad idea. That will mount the contents of the JAR at the root of the
>> web
>> >>>> application.
>> >>>>
>> >>>> Mark
>> >>>>
>> >>>>
>> >>>> ---------------------------------------------------------------------
>> >>>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
>> >>>> For additional commands, e-mail: users-h...@tomcat.apache.org
>> >>>>
>> >>>>
>> >>>
>> >>>
>> >>
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
>> >> For additional commands, e-mail: users-h...@tomcat.apache.org
>> >>
>> >>
>> >
>> >
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
>> For additional commands, e-mail: users-h...@tomcat.apache.org
>>
>>
>
>
> --
>
>



--

Reply via email to