【问题标题】:Java code equivelent of jar cfjar cf 等效的 Java 代码
【发布时间】:2016-02-15 20:13:06
【问题描述】:

我正在编写一个 java 程序,它接收我生成的 .class 文件并将它们放入罐子中,然后使用类加载器将它们加载到内存中。

我目前有一个带有代码的工作震动系统:

 public static int BUFFER_SIZE = 10240;
  protected static void createJarArchive(File archiveFile, File[] tobeJared) {
    try {
      byte buffer[] = new byte[BUFFER_SIZE];
      // Open archive file
      FileOutputStream stream = new FileOutputStream(archiveFile);
      JarOutputStream out = new JarOutputStream(stream, new Manifest());

      for (int i = 0; i < tobeJared.length; i++) {
        if (tobeJared[i] == null || !tobeJared[i].exists()
            || tobeJared[i].isDirectory())
          continue; // Just in case...
        System.out.println("Adding " + tobeJared[i].getName());

        // Add archive entry
        JarEntry jarAdd = new JarEntry(getPackageNameModified +tobeJared[i].getName());
        jarAdd.setTime(tobeJared[i].lastModified());
        out.putNextEntry(jarAdd);

        // Write file to archive
        FileInputStream in = new FileInputStream(tobeJared[i]);
        while (true) {
          int nRead = in.read(buffer, 0, buffer.length);
          if (nRead <= 0)
            break;
          out.write(buffer, 0, nRead);
        }
        in.close();
      }

      out.close();
      stream.close();
      System.out.println("Adding completed OK");
    } catch (Exception ex) {
      ex.printStackTrace();
      System.out.println("Error: " + ex.getMessage());
    }
  }

引用代码中的某些内容:

getPackageNameModified = com\Test

但是,当我将 jar 加载到内存中时,出现以下错误:

Could not load jar C:\Users\Dalton\AppData\Local\Temp\Test.jar into JVM. (Could not find class com.Test.ObjectFactory.)

我正在使用 squoop 类加载器来执行此操作。

又名:

ClassLoaderStack.addJarFile(jarFileAbsolute, absoluteClass);

使用以下命令行,类加载器代码可以正常工作,但我想避免在 java 程序中使用命令行:

jar cf C:\Users\Dalton\AppData\Local\Temp\Test.jar -C C:\Users\Dalton\AppData\Local\Temp\Test\com.Test com\Test

【问题讨论】:

  • 您确实使用了jar tf 来验证您的程序创建的.jar 文件的内容,对吧?
  • jar(和 zip)条目的名称使用 / 作为路径分隔符,并在最后一个包(名义上的目录)组件和基本名称之间包含分隔符。仅供参考:Windows 路径名可以在 java 中使用 / 或 \,只有一些程序和对话框需要 \。

标签: java classloader executable-jar .class-file


【解决方案1】:

以下解决了我的问题:

try
    {
        byte buffer[] = new byte[BUFFER_SIZE];
        // Open archive file
        FileOutputStream stream = new FileOutputStream(archiveFile);
        JarOutputStream out = new JarOutputStream(stream, new Manifest());

        for (int i = 0; i < tobeJared.length; i++)
        {
            if (tobeJared[i].toString().endsWith(CLASS))
            { 
                // the .replace \\ with / is a java JDK bug that requires all
                    // paths to use / and end in / for a jar to properly be made

                LOG.info("Adding "
                        + getPackageNameModified().replace(
                                DOUBLE_BACKSLASH, FORWARD_SLASH) + FORWARD_SLASH + tobeJared[i].getName()
                        + " to the temporary JAR.");

                // Add archive entry
                JarEntry jarAdd = new JarEntry(
                        getPackageNameModified().replace(DOUBLE_BACKSLASH,
                                FORWARD_SLASH) + FORWARD_SLASH + tobeJared[i].getName());
                jarAdd.setTime(tobeJared[i].lastModified());
                out.putNextEntry(jarAdd);

                // Write file to archive
                FileInputStream in = new FileInputStream(tobeJared[i]);
                while (true)
                {
                    int nRead = in.read(buffer, 0, buffer.length);
                    if (nRead <= 0) break;
                    out.write(buffer, 0, nRead);
                }
                in.close();
            }
        }

        out.close();
        stream.close();
        LOG.info("Adding complete --> Success");
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
        LOG.error("Error: " + ex.getMessage());
    }

问题在于 java 中的 \ 是一个错误。所有目录拆分都使用 / 代替,并以 / 结尾。我不知道为什么会出现这个问题,但是因为它生成的 JAR 可以类加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多