Хорошо, мне удалось заставить это работать на Weblogic. Опять же, моей целью было получить имена пакетов java во всех приложениях, развернутых на данном сервере WebLogic. Зачем? У меня были свои причины:)
Сначала вы должны получить доступ ко всем файлам для ушей, войны или банок всех развернутых приложений. Для этого мы получаем из приложения WebLogic MBeans AppDeployment и выполняем итерацию, как показано ниже.
Set<ObjectName> set = utils.getConfigMBeansByType("AppDeployment");
for (ObjectName objectName : set) {
String name = objectName.getKeyProperty("Name");
if (!appCache.contains(name)) {
//System.out.println("Config bean: " + objectName);
Object path = utils.getPropertyValue(objectName,
"AbsoluteSourcePath");
//System.out.println("Path: " + path);
if(path != null){
PackageFinder finder = new PackageFinder();
packages.addAll(finder.findPackages(path.toString()));
}
appCache.add(name);
}
}
В приведенном выше коде мы получаем путь к папке war, ear, jar или разобранной папке и передаем ее в метод findPakages класса PackageFinder, который выполняет всю работу.
public Set<String> findPackages(String path){
File file = new File(path);
if(file.exists() && file.isFile()){
InputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(file));
if(path.toLowerCase().endsWith(".war")){
processWar(in);
}else if(path.toLowerCase().endsWith(".ear")){
processEar(in);
}/*
Rest of the method body removed, I guess you get the idea
*/
return packageNames;
}
public void processJar(InputStream in){
ZipInputStream zin = null;
try {
zin = new ZipInputStream(in);
ZipEntry entry;
while((entry = zin.getNextEntry()) != null){
if(entry.getName().endsWith(".class")){
addPackage(entry.getName());
}
}
} catch (Exception e) {
}
}