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>