我在使用ClassLoader#getResources(-)
访问JBoss中的VFS资源时遇到问题。
我想列出某些Web应用程序(WEB-INF/classes/*
)的所有类路径资源(*.war
),所以我可以从以下内容开始:
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Enumeration<URL> resources = cl.getResources("");
while (resources.hasMoreElements()) {
Path path = Paths.get(resources.nextElement().toURI());
InputStream is = Files.newInputStream(path);
}
如果我在JBoss AS 7.1中使用此代码,它以爆炸模式部署应用程序 - 它可以正常工作
一旦您尝试不以展开模式部署它,而是作为*.war
存档,它会开始抛出NoSuchFileException
。
我认为这是因为未展开的存档使用虚拟文件系统,所有这些加载的资源都以`vfs:
开头;在我的情况下它是例如vfs:///content/WEB-INF/classes/someResource/
。
因此,使用的Path
等于/content/WEB-INF/classes/someResource
,它被视为不存在的路径(以root-node,slash开头)并抛出异常。
暂时忘记使用HTTP,FTP或其他方式加载资源时的所有情况;我也没有兴趣在类路径中扫描jar。我只想读取类路径根目录下的所有基于文件的资源。
问题是我需要输入每个资源并查明这是否是一个文件夹 - 如果是,请列出其所有元素。这就是Path
元素在这里非常有用的原因。
问题是 - 您应该在Web应用程序中列出所有资源的正确方法是什么?
似乎带有vfs:前缀的资源是由一些特殊的JBoss类加载器加载的,对吗?
因此,我是否能够以可移植的方式访问资源(适用于JBoss,Glassfish,TomEE等的代码)?
编辑:为了说明我需要上述内容的上下文:我想扫描类路径中的所有*.properties
文件,并能够使用CDI访问它们。已经描述了here。
现在我正在从旧的File
对象切换到NIO.2路径,文件和基本上:输入流。
但是,这两种方法都与vfs:/ resources具有相同的问题。
答案 0 :(得分:2)
以下是否有效?
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Enumeration<URL> resources = cl.getResources("");
while (resources.hasMoreElements()) {
InputStream is = resources.nextElement().openStream();
}
答案 1 :(得分:0)
使用这个依赖
document.addEventListener('DOMContentLoaded', () => {
const themeSwitch = document.getElementById('themeCheckBox');
if(localStorage.darkTheme === 'true'){
document.body.classList.add('dark');
themeSwitch.checked = true;
} else{
document.body.classList.remove('dark');
themeSwitch.checked = false;
}
themeSwitch.addEventListener('change', () => {
if (themeSwitch.checked){
localStorage.darkTheme = 'true';
document.body.classList.add('dark');
} else {
localStorage.darkTheme = 'false';
document.body.classList.remove('dark');
}
});
});
导入类
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jboss-vfs</artifactId>
<version>3.2.15.Final</version>
</dependency>
从 WAR 中列出所有类的方法
import org.jboss.vfs.VFS;
import org.jboss.vfs.VirtualFile;
import org.jboss.vfs.VirtualFileFilter;
用法
public void scan(ClassLoader classLoader) throws IOException, URISyntaxException {
String optionalMainPackage="";
// Example optionalMainPackage="com.domolin.security"
Enumeration resources = classLoader.getResources(optionalMainPackage);
while (resources.hasMoreElements()) {
URL resource = (URL) resources.nextElement();
System.out.println("URL "+resource);
VirtualFile vfDir = VFS.getChild(resource.toURI());
List<VirtualFile> jsonVFs = vfDir.getChildrenRecursively(new VirtualFileFilter() {
@Override
public boolean accepts(VirtualFile file) {
return (file.isDirectory() || file.getName().endsWith(".class"));
}
});
for (int i = 0; i < jsonVFs.size(); i++) {
VirtualFile vf = jsonVFs.get(i);
File f = vf.getPhysicalFile();
System.out.println("CLASS: "+f.getName());
}
}
}