On Tue, May 26, 2015 at 6:21 AM, Aditya Chopra <adity...@turvo.com> wrote:
> The reason i am trying to reduce the war file size is because its size has > gone upto 55MB and time taken for copying it to the server for deployments > has increased. > What you're trying to do may seem like a good idea, but in practice is usually not. There are a handful of things that can go wrong with it (library version issues, classpath casting issues, etc...). You're hitting just one of those problems and as you can see it's not easy to debug (none of them are really). All for what? A marginally smaller WAR file. Unless you're on dial-up, it's likely that the time you spend debugging issues will far exceed the time you spend uploading files, and that's something that can be automated. Solutions to the problem of a larger WAR file that I would suggest (I'm sure others can add to this list): a.) just live with the upload time. 55M is not that crazy. run the upload while you're doing something else or at night. b.) get a faster Internet connection c.) build your project on a remote server, possibly a CI server, that has better bandwidth. > > Is there any best practice around this that we should be following? > Put everything into the WAR file. This is my opinion, but I find it makes life a lot easier. Dan > > Anyways, i will also check Spring usage to see why the threat context > class loader isn’t being used. > > Aditya > > > > On 26-May-2015, at 3:37 pm, Mark Thomas <ma...@apache.org> wrote: > > > > On 26/05/2015 10:53, Aditya Chopra wrote: > > > > This thread does beg the question *why* do you want to reduce the size > > of your WAR. Doing so creates problems as you have found. > > > >> In WEB-INF/lib i only have 2 JARs, which are my application JAR’s. All > other dependent JAR’s i have moved to /mylibs. > >> > >> Below mentioned com.myapp.CustomGrantedAuth class is part of my > application JAR present under WEB-INF/lib. > > > > You'll need to speak to the Spring folks to see why the thread context > > class loader isn't being used. Whether that is a Spring bug or a Spring > > usage error in your part I don't know. > > > > Mark > > > > > >> > >> Here is the stack trace: > >> > >> DEBUG [http-nio-8080-exec-3] (DefaultExceptionHandler.java:123) - error. > >> java.lang.IllegalArgumentException: java.lang.ClassNotFoundException: > com.myapp.CustomGrantedAuth > >> at > org.springframework.security.oauth2.common.util.SerializationUtils.deserialize(SerializationUtils.java:36) > >> at > com.arl.mg.services.CustomTokenStore$2.mapRow(CustomTokenStore.java:124) > >> at > com.arl.mg.services.CustomTokenStore$2.mapRow(CustomTokenStore.java:1) > >> at > org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) > >> at > org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60) > >> at > org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:708) > >> at > org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644) > >> at > org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695) > >> at > org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727) > >> at > org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737) > >> at > org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:811) > >> at > com.arl.mg.services.CustomTokenStore.readAuthentication(CustomTokenStore.java:121) > >> at > com.arl.mg.services.CustomTokenServices.loadAuthentication(CustomTokenServices.java:139) > >> at > org.springframework.security.oauth2.provider.filter.OAuth2ProtectedResourceFilter.doFilter(OAuth2ProtectedResourceFilter.java:53) > >> at > org.springframework.security.oauth2.provider.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:79) > >> at > com.arl.mg.error.CustomExceptionHandlerFilter.doFilter(CustomExceptionHandlerFilter.java:59) > >> at > org.springframework.security.oauth2.provider.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:79) > >> at > org.springframework.security.oauth2.provider.filter.CompositeFilter.doFilter(CompositeFilter.java:59) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:139) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) > >> at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) > >> at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) > >> at > org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) > >> at > org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) > >> at > org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) > >> at > org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) > >> at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) > >> at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > >> at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) > >> at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) > >> at > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) > >> at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) > >> at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) > >> at > org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617) > >> at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) > >> at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) > >> at > org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) > >> at > org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) > >> at > org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521) > >> at > org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478) > >> at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > >> at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > >> at > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > >> at java.lang.Thread.run(Thread.java:745) > >> Caused by: java.lang.ClassNotFoundException: com.myapp.CustomGrantedAuth > >> at java.net.URLClassLoader.findClass(URLClassLoader.java:381) > >> at java.lang.ClassLoader.loadClass(ClassLoader.java:424) > >> at java.lang.ClassLoader.loadClass(ClassLoader.java:357) > >> at java.lang.Class.forName0(Native Method) > >> at java.lang.Class.forName(Class.java:348) > >> at > java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626) > >> at > java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613) > >> at > java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) > >> at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) > >> at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) > >> at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) > >> at java.util.ArrayList.readObject(ArrayList.java:791) > >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > >> at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > >> at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > >> at java.lang.reflect.Method.invoke(Method.java:497) > >> at > java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) > >> at > java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896) > >> at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) > >> at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) > >> at > java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) > >> at > java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918) > >> at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) > >> at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) > >> at > java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) > >> at > java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918) > >> at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) > >> at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) > >> at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) > >> at > org.springframework.security.oauth2.common.util.SerializationUtils.deserialize(SerializationUtils.java:32) > >> ... 59 more > >> DEBUG [http-nio-8080-exec-3] (ExceptionTranslationFilter.java:115) - > Chain processed normally > >> > >> > >> > >>> On 26-May-2015, at 3:17 pm, Mark Thomas <ma...@apache.org> wrote: > >>> > >>> On 26/05/2015 10:44, Aditya Chopra wrote: > >>>> Thanks for quick response Mark. > >>>> > >>>> JARs in /mylib are not dependent on JARs in web app. In fact its the > other way round. /mylib is having all Spring, hibernate jar’s, other common > libs and WEB-INF/lib is containing jar of one of my application modules. > >>>> The class for which i am getting ClassNotFoundException exception is > part of JAR present under WEB-INF/lib. > >>>> > >>>> I enabled the class loader logs and don’t see that class getting > loaded on server startup. However, when i copy all JAR’s from /mylib to > WEB-INF/lib, that class is getting loaded and i don’t get the > ClassNotFoundException on runtime. > >>>> > >>>> Any thoughts what might be causing this? > >>> > >>> Yes. One of the JARs in /mylib depends on one of the JARs in > WEB-INF/lib > >>> and that is not permitted. > >>> > >>> The dependency may not be obvious. If you provide the full stack trace > >>> we might be able to provide you with some pointers. > >>> > >>> Mark > >>> > >>>> > >>>> Aditya > >>>> > >>>>> On 26-May-2015, at 3:04 pm, Mark Thomas <ma...@apache.org> wrote: > >>>>> > >>>>> On 26/05/2015 08:36, Aditya Chopra wrote: > >>>>>> Hi, > >>>>>> > >>>>>> To reduce the size of my war file, i am trying to put all the jar > files being used by my web app in a separate folder /mylibs. I added path > to /mylibs folder under shared.loader property in catalina.properties but > on runtime i am getting a ClassNotFoundException for one of the classes > that is present in one the project module jar under WEB-INF/lib folder. > >>>>>> > >>>>>> When i add all the libraries required by my project in WEB-INF/lib > folder my application works fine. However, when i put the libraries in a > separate /mylibs folder i get a ClassNotFoundException on runtime. > >>>>>> > >>>>>> I suspect that it could be due to order in which the classes are > being loaded, so added a Loader component in my context.xml as below, but > that too didn’t work. Can someone please help me on this? > >>>>> > >>>>> JARs in /mylibs must not depend on JARs in a web application. There > is > >>>>> no configuration option that would enable you to bypass this > restriction. > >>>>> > >>>>> 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 > >>> > >> > >> > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org <mailto: > users-unsubscr...@tomcat.apache.org> > > For additional commands, e-mail: users-h...@tomcat.apache.org <mailto: > users-h...@tomcat.apache.org> >