【发布时间】: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