You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Vimil Saju <vi...@yahoo.com.INVALID> on 2014/06/14 15:30:51 UTC
Exclude scanning of class folders for Servlet 3.0 annotations.
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
Re: Exclude scanning of class folders for Servlet 3.0 annotations.
Posted by Konstantin Kolinko <kn...@gmail.com>.
2014-06-14 17:30 GMT+04:00 Vimil Saju <vi...@yahoo.com.invalid>:
> 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.
>
1. VirtualWebappLoader is deprecated and removed from Tomcat 8. In
Tomcat 8 you'll configure your resources by mapping those directories
into WEB-INF/classes.
As it is all the same directory (WEB-INF/classes), I see no sense in
filtering by directory name.
JarScanner operates on URLs, not on file system paths.
2. I think that I'd like to see filtering by Java package name. I
think it makes sense to implement that.
3. You may configure your own JarScanner or JarScanFilter (in Tomcat
8) implementation in your META-INF/context.xml file.
Best regards,
Konstantin Kolinko
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: Exclude scanning of class folders for Servlet 3.0 annotations.
Posted by Konstantin Kolinko <kn...@gmail.com>.
2014-06-14 17:30 GMT+04:00 Vimil Saju <vi...@yahoo.com.invalid>:
> 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.
>
1. VirtualWebappLoader is deprecated and removed from Tomcat 8. In
Tomcat 8 you'll configure your resources by mapping those directories
into WEB-INF/classes.
As it is all the same directory (WEB-INF/classes), I see no sense in
filtering by directory name.
JarScanner operates on URLs, not on file system paths.
2. I think that I'd like to see filtering by Java package name. I
think it makes sense to implement that.
3. You may configure your own JarScanner or JarScanFilter (in Tomcat
8) implementation in your META-INF/context.xml file.
Best regards,
Konstantin Kolinko
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Exclude scanning of class folders for Servlet 3.0 annotations.
Posted by Vimil Saju <vi...@yahoo.com.INVALID>.
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