Rribbit 與Weblogic集成

Rribbit不支持直接部署進Weblogic,原因在於Weblogic解析jar文件的協議是zip,而其它如tomcat,jetty是jar協議。

解決辦法如下:

import java.io.File;

import java.io.IOException;

import java.net.URL;

import java.net.URLDecoder;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Enumeration;

import java.util.jar.JarFile;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

 

import org.rribbit.creation.SpringBeanClassBasedListenerObjectCreator;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

/**

 * 

 * @author wangx

 * @date Nov 4, 2015

 * @version

 */

 

public class CustomListenerObjectCreator extends SpringBeanClassBasedListenerObjectCreator {

private static final Logger log = LoggerFactory.getLogger(SpringBeanClassBasedListenerObjectCreator.class);

 

/*

* (non-Javadoc)

* @see

* org.rribbit.creation.AbstractClassBasedListenerObjectCreator#getClasses

* (java.lang.String, boolean)

*/

@Override

protected Collection<Class<?>> getClasses(String packageName, boolean scanSubPackages) throws ClassNotFoundException, IOException {

 

String path = packageName.replace('.', '/');

Enumeration<URL> resources = getClassLoader().getResources(path);

Collection<Class<?>> classes = new ArrayList();

while (resources.hasMoreElements()) {

URL resource = (URL) resources.nextElement();

String filename = URLDecoder.decode(resource.getFile(), "UTF-8");

log.debug("Processing resource '{}' with filename '{}'", resource, filename);

 

if (resource.getProtocol().equals("jar")) {

String jarFilename = filename.substring(5, filename.indexOf("!"));

JarFile jarFile = new JarFile(jarFilename);

classes.addAll(findClassesInJarFile(jarFile, path, scanSubPackages));

} else if (resource.getProtocol().equals("zip")) {

String zipFilename = filename.substring(0, filename.indexOf("!"));

ZipFile jarFile = new ZipFile(zipFilename);

classes.addAll(findClassesInZipFile(jarFile, path, scanSubPackages));

} else {

File directory = new File(filename);

classes.addAll(findClassesInDirectory(directory, packageName, scanSubPackages));

}

}

return classes;

}

 

protected Collection<Class<?>> findClassesInZipFile(ZipFile jarFile, String path, boolean scanSubPackages) throws ClassNotFoundException {

 

log.debug("Scanning jarFile '{}' for classes in package '{}'", jarFile.getName(), path);

Collection<Class<?>> classes = new ArrayList<Class<?>>();

Enumeration<ZipEntry> jarEntries = (Enumeration<ZipEntry>) jarFile.entries();

while(jarEntries.hasMoreElements()) {

String entryName = jarEntries.nextElement().getName();

log.debug("Entry name: '{}'", entryName);

Pattern p;

if(scanSubPackages) {

p = Pattern.compile("(" + path + "/[\\w/]+)\\.class");

} else {

p = Pattern.compile("(" + path + "/\\w+)\\.class");

}

Matcher m = p.matcher(entryName);

if(m.matches()) {

String className = m.group(1).replaceAll("/", ".");

log.debug("Adding Class {}", className);

classes.add(Class.forName(className));

}

}

return classes;

}

<bean id="creator"

class="com.geone.its.CustomListenerObjectCreator">

<property name="packageNames">

<list>

<value>com</value>

</list>

</property>

<property name="scanSubpackages" value="true" />

</bean>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章