我正在尝试从jar
内的某些类和txt
文件创建jar
文件。它是一个生成客户端的简单服务器程序。
如果我使用WinRAR检查它,我想要访问的文件夹确实在我的jar
文件中。我已经制作了一个适用于IDE (Eclipse)
的方法。如果我在IDE中运行我的程序,我就能生成一个执行的jar。
我知道我无法访问jar文件中的文件作为文件。但是我的方法使用文件的路径。
此方法创建清单文件没有任何问题:
public void createClientJar(String path, String fileName, String hostAddress, String portNumber, String connectionInterval) {
try {
Manifest manifest = new Manifest();
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
manifest.getMainAttributes().put(Attributes.Name.CLASS_PATH, ".");
manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "client.utils.Client");
JarOutputStream target = new JarOutputStream(new FileOutputStream(path + "/" + fileName + ".jar"), manifest);
File serverRoot = new File(getClass().getResource("/client").getPath());
addSourceToJar(serverRoot, target, "", hostAddress, portNumber, connectionInterval);
target.close();
} catch (Exception e) {
e.printStackTrace();
}
}
这是生成jar文件的方法:
private void addSourceToJar(File source, JarOutputStream target, String folder, String hostAddress, String portNumber, String connectionInterval) {
BufferedInputStream in = null;
File entryFile = null;
JarEntry entry = null;
String path = source.getPath().replace("\\", "/");
String previousFolder = folder;
try {
if (source.isDirectory()) {
if (!path.isEmpty()) {
if (!path.endsWith("/"))
path += "/";
if (!path.endsWith("bin/")) {
entryFile = new File(path);
entry = new JarEntry(previousFolder + entryFile.getName() + "/");
previousFolder += entryFile.getName() + "/";
target.putNextEntry(entry);
target.closeEntry();
}
}
for (File nestedFile : source.listFiles()) {
addSourceToJar(nestedFile, target, previousFolder, hostAddress, portNumber, connectionInterval);
}
return;
}
entryFile = new File(path);
entry = new JarEntry(previousFolder + entryFile.getName());
entry.setTime(source.lastModified());
target.putNextEntry(entry);
if(entry.getName().contains("data")){
// Replaces connection data in data.txt
replaceData(path, hostAddress, portNumber, connectionInterval);
}
in = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) != -1) {
target.write(buffer, 0, length);
}
target.closeEntry();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null)
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
问题是我得到Nullpointer
例外:
java.lang.NullPointerException
at model.Model.createClientJar(Model.java:204)
这一行:
File serverRoot = new File(getClass().getResource("/client").getPath());
此外我认为这不是要走的路。因为我无法直接访问Jar中的文件。
我无法提出改变我的方法的逻辑,因此它在我的IDE和导出为Runnable Jar
时都有效。
我希望有人能指出我在addSourceToJar()
方法中哪些行会失败的正确方向。
提前致谢