xyzjr 发表于 2017-2-15 11:09:05

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>
页: [1]
查看完整版本: Rribbit 与Weblogic集成