【问题标题】:Java Jar File As Stream Class LoaderJava Jar 文件作为流类加载器
【发布时间】:2011-09-23 11:23:45
【问题描述】:

由于 URL 类加载器只接受 URL 或文件路径,我如何从存储为 blob 的 jar 文件加载类?

【问题讨论】:

    标签: java classloader


    【解决方案1】:

    java.lang.ClassLoader 实现您自己的子类,从数据库中加载。

    也许这篇文章有助于入门:http://www.javablogging.com/java-classloader-2-write-your-own-classloader/

    【讨论】:

    • java.security.SecureClassLoader 可能是一个更好的基础。
    【解决方案2】:

    编写自己的 ClassLoader 可能会非常令人困惑,尤其是对于初学者而言。我最近需要动态加载一些 jar,发现 this answer 非常有帮助。它解释了如何使用 ResourceFinder,一个来自 Apache xbean 的类或其他东西。这是一个可以轻松放入项目的单个文件。

    最适合您的情况,尽管 ResourceFinder 通过 URL 加载,readContents 函数(用于实际加载 jar 文件)看起来像这样:

    private String readContents(URL resource) throws IOException {
        InputStream in = resource.openStream();
        BufferedInputStream reader = null;
        StringBuilder sb = new StringBuilder();
    
        try {
            reader = new BufferedInputStream(in);
    
            int b = reader.read();
            while (b != -1) {
                sb.append((char) b);
                b = reader.read();
            }
    
            return sb.toString().trim();
        } finally {
            try {
                in.close();
                reader.close();
            } catch (Exception e) {
            }
        }
    }
    

    可以很容易地修改它以在您拥有的任何 Stream/blob 上工作。 我敢肯定,对课程进行一些细微的更改可以使其完全按照您的意愿进行,或者至少为您指明正确的方向。从头开始编写 ClassLoader 并不好玩。

    编辑: 你知道,我刚刚又看了一遍,我不太确定你是否可以只对 ResourceFinder 进行细微的更改。不过,还是看看吧,看看你能从中得到什么。

    【讨论】:

      【解决方案3】:

      如果您查看JarClassLoader in the Java tutorial 的代码,您就会开始。

      如果您使用 Google 搜索 Jar 类加载器,还可以使用其他资源。
      您需要修改代码以传入您从数据库中的 BLOB 获得的 ByteStream。

      【讨论】:

        【解决方案4】:

        实现您自己的类加载器是显而易见的答案。取决于您需要如何使用可能有问题的类。另一个鲜为人知的选择是实现您自己的 url 处理程序。你可以想出一个自定义 url 方案,如 "db://<dbname>/<tablename>/<jarfile>" 或其他东西。您将实现一个自定义 URLStreamHandler,详细信息here

        【讨论】:

          【解决方案5】:
           one way to laod jar file .. it may helpful to you.
          
          
          
           public class JarLoad {
                  public static void main(String[] args) throws ZipException, IOException {
              File jarfile = new File("C\\scan.jar");
              if(! jarfile.isDirectory()){
                  ZipFile jar = new ZipFile(jarfile);
                  Enumeration enumeration = jar.entries();
                  while(enumeration.hasMoreElements()){
                      ZipEntry zipEntry = (ZipEntry)enumeration.nextElement();
                      System.out.println(zipEntry.getName());
                  }
          
              }
          
          }
          

          }

          【讨论】:

          • 不过,这并不能真正解决问题。这也不会加载一个 jar 文件——它只是查看它的条目。
          猜你喜欢
          • 2015-01-04
          • 1970-01-01
          • 2017-12-06
          • 2012-04-15
          • 2013-08-26
          • 2023-03-12
          • 2017-02-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多