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