Hi Scott,

I'm using IDEA resin plugin to debug webapp in resin.
At develepment stage, IDEA starts resin for me by command

C:\jdk1.6.0\bin\java -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -DRESIN_HOME=C:\resin-pro-3.1 -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m -classpath "C:\jdk1.6.0\lib\tools.jar;C:\resin-pro-3.1\lib\activation.jar;C:\resin-pro-3.1\lib\ejb-15.jar;C:\resin-pro-3.1\lib\hessian.jar;C:\resin-pro-3.1\lib\j2ee-management-10.jar;C:\resin-pro-3.1\lib\javamail-14.jar;C:\resin-pro-3.1\lib\jaxb-api.jar;C:\resin-pro-3.1\lib\jaxrpc-15.jar;C:\resin-pro-3.1\lib\jaxws-api.jar;C:\resin-pro-3.1\lib\jca-15.jar;C:\resin-pro-3.1\lib\jms-11.jar;C:\resin-pro-3.1\lib\jpa-15.jar;C:\resin-pro-3.1\lib\jsdk-15.jar;C:\resin-pro-3.1\lib\jsr88.jar;C:\resin-pro-3.1\lib\jstl-11.jar;C:\resin-pro-3.1\lib\jta-101.jar;C:\resin-pro-3.1\lib\jws-15.jar;C:\resin-pro-3.1\lib\license.jar;C:\resin-pro-3.1\lib\portlet-10.jar;C:\resin-pro-3.1\lib\pro.jar;C:\resin-pro-3.1\lib\quercus.jar;C:\resin-pro-3.1\lib\resin-deploy.jar;C:\resin-pro-3.1\lib\resin-util.jar;C:\resin-pro-3.1\lib\resin.jar;C:\resin-pro-3.1\lib\script-10.jar;C:\resin-pro-3.1\lib\webbeans-16.jar;C:\resin-pro-3.1\lib\webutil.jar;C:\resin-pro-3.1\lib\jtds-1.2.2.jar" com.caucho.server.resin.Resin -conf myapp.conf

and it's ok.

At deployment stage I added resin to windows service by httpd.exe -install. When starting service exceptions ocurred. It did not happen before when using 3.1.5 alpha snapshot and earlier version, now I'm using the newest snapshot.
I noticed that running command

   C:\jdk1.6.0\bin\java -jar ... lib/resin.jar -conf myapp.conf

will show me the same exception stack as well as runing command

   httpd.exe -conf myapp.conf

So I believed in that there maybe a bug in resin.jar but not in httpd.exe. httpd should be only a wrapper of java -jar resin.jar, also the watchdog.

Below is my stacktrace. I'm deploying my project with struts2.1.1 snapshot and xwork snapshot version.
======================================================================================================
2008-03-07 11:33:44,765 3135 DEBUG [main] I18nInterceptor (58) - new I18nInterceptor() 2008-03-07 11:33:44,773 3143 DEBUG [main] DefaultValidatorFactory (58) - Loading validator definitions. 2008-03-07 11:33:44,773 3143 WARN [main] InterceptorBuilder (46) - Unable to load config class org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor at interceptor - jar:file:/C:/Projects/buysou_new/exploded/WEB-INF/lib/struts2-core-2.1.1-SNAPSHOT-20080306.jar!/struts-default.xml:144:127 probably due to a missing jar, which might be fine if you never plan to use the validation interceptor 2008-03-07 11:33:44,837 3207 ERROR [main] InterceptorBuilder (28) - Actual exception Caught Exception while registering Interceptor class org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor - interceptor - jar:file:/C:/Projects/buysou_new/exploded/WEB-INF/lib/struts2-core-2.1.1-SNAPSHOT-20080306.jar!/struts-default.xml:144:127 at com.opensymphony.xwork2.ObjectFactory.buildInterceptor(ObjectFactory.java:200) at com.opensymphony.xwork2.config.providers.InterceptorBuilder.constructInterceptorReference(InterceptorBuilder.java:53) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.lookupInterceptorReference(XmlConfigurationProvider.java:1081) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptorStack(XmlConfigurationProvider.java:781) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptorStacks(XmlConfigurationProvider.java:794) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptors(XmlConfigurationProvider.java:817) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:446) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:270) at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:109) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:179) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:370) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:423) at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:211) at com.caucho.server.dispatch.FilterManager.createFilter(FilterManager.java:144) at com.caucho.server.dispatch.FilterManager.init(FilterManager.java:91)
       at com.caucho.server.webapp.WebApp.start(WebApp.java:1859)
at com.caucho.server.deploy.DeployController.startImpl(DeployController.java:667) at com.caucho.server.deploy.StartAutoRedeployAutoStrategy.startOnInit(StartAutoRedeployAutoStrategy.java:72) at com.caucho.server.deploy.DeployController.startOnInit(DeployController.java:549) at com.caucho.server.deploy.DeployContainer.start(DeployContainer.java:160) at com.caucho.server.webapp.WebAppContainer.start(WebAppContainer.java:659)
       at com.caucho.server.host.Host.start(Host.java:437)
at com.caucho.server.deploy.DeployController.startImpl(DeployController.java:667) at com.caucho.server.deploy.StartAutoRedeployAutoStrategy.startOnInit(StartAutoRedeployAutoStrategy.java:72) at com.caucho.server.deploy.DeployController.startOnInit(DeployController.java:549) at com.caucho.server.deploy.DeployContainer.start(DeployContainer.java:160) at com.caucho.server.host.HostContainer.start(HostContainer.java:484)
       at com.caucho.server.cluster.Server.start(Server.java:1217)
       at com.caucho.server.cluster.Cluster.startServer(Cluster.java:710)
at com.caucho.server.cluster.ClusterServer.startServer(ClusterServer.java:528)
       at com.caucho.server.resin.Resin.start(Resin.java:695)
       at com.caucho.server.resin.Resin.initMain(Resin.java:1139)
       at com.caucho.server.resin.Resin.main(Resin.java:1341)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:290) at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:454) at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:492) at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:490) at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:542) at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:490) at com.opensymphony.xwork2.ObjectFactory.injectInternalBeans(ObjectFactory.java:125) at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:150) at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:137) at com.opensymphony.xwork2.ObjectFactory.buildInterceptor(ObjectFactory.java:178)
       ... 33 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:137)
       at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:49)
at com.opensymphony.xwork2.inject.ContainerImpl$ParameterInjector.inject(ContainerImpl.java:431) at com.opensymphony.xwork2.inject.ContainerImpl.getParameters(ContainerImpl.java:446) at com.opensymphony.xwork2.inject.ContainerImpl.access$000(ContainerImpl.java:48) at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:288)
       ... 42 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:464) at com.opensymphony.xwork2.inject.ContainerImpl$7.call(ContainerImpl.java:501) at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:549) at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:499) at com.opensymphony.xwork2.config.impl.LocatableFactory.create(LocatableFactory.java:32) at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:135)
       ... 47 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:290) at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.construct(ContainerImpl.java:400) at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:461)
       ... 52 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:137)
       at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:49)
at com.opensymphony.xwork2.inject.ContainerImpl$ParameterInjector.inject(ContainerImpl.java:431) at com.opensymphony.xwork2.inject.ContainerImpl.getParameters(ContainerImpl.java:446) at com.opensymphony.xwork2.inject.ContainerImpl.access$000(ContainerImpl.java:48) at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:288)
       ... 54 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:464) at com.opensymphony.xwork2.inject.ContainerImpl$7.call(ContainerImpl.java:501) at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:549) at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:499) at com.opensymphony.xwork2.config.impl.LocatableFactory.create(LocatableFactory.java:32) at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:135)
       ... 59 more
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.construct(ContainerImpl.java:409) at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:461)
       ... 64 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.construct(ContainerImpl.java:388)
       ... 65 more
Caused by: java.lang.NullPointerException
       at java.util.Arrays$ArrayList.<init>(Arrays.java:3357)
       at java.util.Arrays.asList(Arrays.java:3343)
at com.opensymphony.xwork2.validator.DefaultValidatorFactory.parseValidators(DefaultValidatorFactory.java:107) at com.opensymphony.xwork2.validator.DefaultValidatorFactory.<init>(DefaultValidatorFactory.java:43)
       ... 70 more
======================================================================================================

I paste a code snippet of com.opensymphony.xwork2.validator.DefaultValidatorFactory below. ==========================line 90~128 of DefaultValidatorFactory.java============================
   private void parseValidators() {
       if (LOG.isDebugEnabled()) {
           LOG.debug("Loading validator definitions.");
       }

       List<File> files = new ArrayList<File>();
       try {
           // Get custom validator configurations via the classpath
line 98: Iterator<URL> urls = ClassLoaderUtil.getResources("", DefaultValidatorFactory.class, false);
           while (urls.hasNext()) {
               URL u = urls.next();
File f = new File(new URI(u.toExternalForm().replaceAll(" ", "%20")));
               FilenameFilter filter = new FilenameFilter() {
                   public boolean accept(File file, String fileName) {
                       return fileName.contains("-validators.xml");
                   }
               };
line 107:       files.addAll(Arrays.asList(f.listFiles(filter)));
           }
       } catch (URISyntaxException e) {
           e.printStackTrace();
           // swallow
       } catch (IOException e) {
throw new ConfigurationException("Unable to parse validators", e);
       }

       // Parse default validator configurations
String resourceName = "com/opensymphony/xwork2/validator/validators/default.xml";
       retrieveValidatorConfiguration(resourceName);

// Overwrite and extend defaults with application specific validator configurations
       resourceName = "validators.xml";
       retrieveValidatorConfiguration(resourceName);

       // Add custom (plugin) specific validator configurations
       for (File file : files) {
           retrieveValidatorConfiguration(file.getName());
       }
   }
======================================================================================================

After some logging, I found "urls" got at line:98 were different between
"java com.caucho.server.resin.Resin" and "java -jar resin.jar".

Command "java com.caucho.server.resin.Resin":
urls (only one url):
   /C:/Projects/buysou_new/exploded/WEB-INF/classes/
It's correct.

Command "java -jar resin.jar":
urls (two urls):
   /C:/JDK1.6.0/jre/lib/ext/meta-index/
   /C:/Projects/buysou_new/exploded/WEB-INF/classes/
The first url will cause the exception.

================line 44~67of com.opensymphony.xwork2.util.ClassLoaderUtil.java========== public static Iterator<URL> getResources(String resourceName, Class callingClass, boolean aggregate) throws IOException {

        AggregateIterator<URL> iterator = new AggregateIterator<URL>();

        
iterator.addEnumeration(Thread.currentThread().getContextClassLoader().getResources(resourceName));

        if (!iterator.hasNext() || aggregate) {
            
iterator.addEnumeration(ClassLoaderUtil.class.getClassLoader().getResources(resourceName));
        }

        if (!iterator.hasNext() || aggregate) {
            ClassLoader cl = callingClass.getClassLoader();

            if (cl != null) {
                iterator.addEnumeration(cl.getResources(resourceName));
            }
        }

if (!iterator.hasNext() && (resourceName != null) && (resourceName.charAt(0) != '/')) { return getResources('/' + resourceName, callingClass, aggregate);
        }

        return iterator;    // I've found it always return normally
    }
======================================================================================================
It seems the Thread.currentThread().getContextClassLoader().getResources("") will produce the two urls,
one of which is
   "/C:/JDK1.6.0/jre/lib/ext/meta-index/"

I've written a simple test and comfired it.
Should it be a bug of Resin.jar of httpd?

Regards,

- Wesley


_______________________________________________
resin-interest mailing list
[email protected]
http://maillist.caucho.com/mailman/listinfo/resin-interest

Reply via email to