Hi,
I am using tomcat 7.0.52 and jdk 1.7.0_45. We have a web application which has
its classpath configured in its own context xml file using virtualClasspath
attribute of Loader tag. The webapp uses version 3.0 of web.xml, The classpath
contains multiple class folders in addition to jar file references. i.e
virtualClasspath is set to something as
follows
virtualClasspath="C:\Projects\ProjectA\classes;C:\Projects\ProjectB\classes;C:\Projects\ProjectC\classes;C:\Projects\Libraries\jarfile1.jar;C:\Projects\Libraries\jarfile2.jar"
C:\Projects\ProjectA\classes has classes with Servlet 3.0 annotations and I
want tomcat to look for annotated classes in this class folder. To do this I
have set the attribute scanAllDirectories=true under the JarScanner tag as
follows
<JarScanner scanAllDirectories="true"/>
Since I don't want tomcat to scan other jar files and class folders of ProjectB
and ProjectC, I have configured
the property tomcat.util.scan.DefaultJarScanner.jarsToSkip in
catalina.properties to something as follows
tomcat.util.scan.DefaultJarScanner.jarsToSkip=jarfile1.jar,jarfile2.jar,**/ProjectB/classes,**/ProjectC/classes
I was able to make tomcat skip scanning of jar files using the above
configuration but it
still scans class folders of both ProjectB and ProjectC.
So I looked at the source code of StandardJarScanner and found that it uses the
name of the last directory in the folder path as the jar name. i.e the jarName
computed for both ProjectB/classes and ProjectC/classes is 'classes'. Thus
there is no way for it to distinguish ProjectB/classes and ProjectC/classes
from ProjectA/classes.
I think StandardJarScanner should use the full folder path as the jar name
instead of just the last directory in the folder path.
This is the code I was looking at in StandardJarScanner.java
/*
* Extract the JAR name, if present, from a URL
*/
private String More ...getJarName(URL url) {
String name = null;
String path = url.getPath();
int end = path.indexOf(Constants.JAR_EXT);
if (end != -1) {
int
start = path.lastIndexOf('/', end);
name = path.substring(start + 1, end + 4);
} else if (isScanAllDirectories()){
int start = path.lastIndexOf('/');
name = path.substring(start + 1);
}
return name;
}
I think instead of computing the last name of the directory path for class
folders it should set the jarname to the full folder path
private String getJarName(URL url) { String name = null; String path =
url.getPath(); int end = path.indexOf(".jar"); if (end != -1) { int start =
path.lastIndexOf('/', end); name = path.substring(start + 1, end + 4); } else
if (isScanAllDirectories()) { name = path; } return name; }
I would like to know if there are any issues with my suggestion. I would also
like to know if there is any workaround for my
problem.
Thanks
Vimil