java - 如何从特定的jar加载实现类

标签 java jar classloader

我有一个包含多个 jar 的 URLClassLoader。 通常,我会使用 ServiceLoader 来查找实现。

但现在我只需要在这些 jar 之一中找到实现,但我仍然想使用这个类加载器。我怎样才能做到这一点?

最佳答案

由于 ServiceLoader 不提供此功能,因此您必须手动执行此操作。

public static <S> Iterable<S> getService(
    File jar, ClassLoader loader, Class<S> service) {

  ArrayList<S> list=new ArrayList<>();
  String name=service.getName();
  try(JarFile f=new JarFile(jar)) {
    JarEntry entry = f.getJarEntry("META-INF/services/"+name);
    if(entry==null) return Collections.emptyList();
    try(BufferedReader r=new BufferedReader(new InputStreamReader(
        f.getInputStream(entry), "UTF-8"))) {
      Matcher m=Pattern.compile(
        "[ \\t]*(\\p{javaJavaIdentifierStart}[\\p{javaJavaIdentifierPart}.]*)?[ \t]*(?:#.*)?")
        .matcher("");
      for(String s=""; s != null; s=r.readLine()) {
        if(s.trim().length()==0) continue;
        if(m.reset(s).matches()) {
          String found=m.group(1);
          if(found!=null) try {
            list.add(loader.loadClass(found).asSubclass(service).newInstance());
          }
          catch(Throwable e) {
            log(Level.SEVERE, found, e);
            return null;
          }
        } else log(Level.WARNING, "malformed spi decl: {0}", s);
      }
    }
  } catch(IOException ex) {
    log(Level.SEVERE, name, ex);
    return Collections.emptyList();
  }
  return list;
}
static void log(Level level, String msg, Throwable thrown)
{
  Logger.getLogger("insert logger name here").log(level, msg, thrown);
}
static void log(Level level, String msg, Object arg)
{
  Logger.getLogger("insert logger name here").log(level, msg, arg);
}

关于java - 如何从特定的jar加载实现类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19659300/

相关文章:

java - excel java apache poi

java - URL 编码字符串不是有效的 URI

java - 了解 jar 命令行

Java Ant Job 如何将 Log4j jar 与我的 jar 一起发送

java - 清除java中通过class.forName加载的类

java - String[][] 出现越界异常错误

java - 使用 faces-config 和 PrimeFaces 4.0 时出现 NullPointerException

Groovy + Antbuilder : How to use Grape to with taskdef?

java - jar 文件中的运输库

java - 无法从tomcat中自定义类加载器加载的类中获取注释