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>

猜你喜欢

转载自wangxiang286.iteye.com/blog/2255644