我有.ear
,.jar
和.war
个套餐。我正在通过检查文件系统并注册映射来阅读我的servlet类。
事情是它适用于开发,我能够读取目录和正确的文件名确实能够创建映射。问题是,如果我打包我的耳朵它不起作用:
File( ... ).isDirectory()
File( ... ).listFiles()
null
以获取有效的目录路径。我通过检测不以扩展名结尾的结束路径解决了目录检查问题(为了我的目的,这样的验证就足够了),但我仍然无法列出给定路径中的文件。
鉴于这种情况,我有一个问题:
如何在运行时从包.war
列出文件名?
当前代码:
private void addAllFiles( File dir, ArrayList<ConventionPath> list ) {
for ( File file : dir.listFiles() ) { // dir.listFiles() comes null here =/
String absolutePath = file.getAbsolutePath();
boolean isActionDir = ConventionFiles.isActionDir( absolutePath, fileSeparator );
boolean isActionFile = ConventionFiles.isActionFile( absolutePath );
if ( isActionDir ) {
addAllFiles( file, list );
}
if ( isActionDir || isActionFile ) {
ConventionPath conventionPath =
new ConventionPath( absolutePath, fileSeparator );
list.add( conventionPath );
}
}
}
答案 0 :(得分:3)
现在我做到了。
我没有通过文件系统访问文件,而是使用了servlet上下文(我想这是正确的方法):
URL root = context.getResource( "/WEB-INF/classes/com/package/" );
// /default-host/WEB-INF/classes/
String rootPath = root.getPath();
// /WEB-INF/classes/
rootPath = rootPath.substring( rootPath.indexOf( "/WEB-INF" ), rootPath.length() );
然后递归地从资源中获取我想要的信息:
Set<String> resourcesPath = context.getResourcePaths( rootPath );