"no main manifest attribute" 在 Java 下载 .jar 文件后
"no main manifest attribute" after downloading a .jar file in Java
我对这个问题很困惑。 运行这段代码前几次都没有,但之后,我就再也无法运行ning了。它只有在使用我的 Java 代码下载后才会中断。我的代码从我的网站下载了一个 jar 文件,然后使用 ProcessBuilder 运行 它。前几次一切正常,但我 运行 再试了几次,它开始给我
no main manifest attribute, in ...\AppData\Local\GDRQ\bin\launch_gdbotbin.jar
这是我用来下载的 java 代码和 运行 jar 文件:
try {
System.out.println("starting update...");
File targetFile = new File(System.getProperty("user.home") + "\AppData\Local\GDRQ\downloading\launch_gdbotbin.jar");
URL downloadUrl = new URL("http://www.dropmoose.com/gdbotpro/launch_gdbotbin.jar");
InputStream inStream = downloadUrl.openStream();
//System.out.println(inStream.available());
BufferedInputStream bufIn = new BufferedInputStream(inStream);
OutputStream out = new FileOutputStream(targetFile);
BufferedOutputStream bufOut = new BufferedOutputStream(out);
byte[] buffer = new byte[inStream.available()];
while (true) {
int nRead = bufIn.read(buffer, 0, buffer.length);
if (nRead <= 0) {
break;
}
bufOut.write(buffer, 0, nRead);
}
bufOut.flush();
out.close();
inStream.close();
BufferedWriter bw = new BufferedWriter(new FileWriter(settingsFile));
for (int i = 0; i < settings.size(); i++) {
bw.write(settings.get(i));
bw.newLine();
}
bw.close();
System.out.println("update successful");
infoPane.dispose();
System.out.println("cleaning up...");
Files.move(targetFile.getAbsoluteFile().toPath(), new File(System.getProperty("user.home") + "\AppData\Local\GDRQ\bin\launch_gdbotbin.jar").toPath(), StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
JOptionPane.showConfirmDialog(null, "An error occured (code 14): Unable to update!");
infoPane.dispose();
}
String[] parm = {"jar", "-jar", System.getProperty("user.home") + "\AppData\Local\GDRQ\bin\launch_gdbotbin.jar"};
ProcessBuilder pb = new ProcessBuilder(parm);
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
try {
pb.start();
} catch (IOException e) {
e.printStackTrace();
}
我尝试使用 main(String[] args) 方法和 Manifest-Version: 1.0 创建一个 Class-Path 作为 class 的 MANIFEST.MF 文件,但它仍然没有工作。我做错了什么,为什么我的 manifest.mf 文件不起作用?代码下载的jar也有125KB左右,原来是2.5MB。
EDIT 如果你去下载jar文件的代码中的url然后运行它,它运行s非常好。
EDIT 2 我什至尝试使用 WinRAR 进入下载的 jar 文件并手动更改 META-INF/MANIFEST.MF 文件以具有 Main-Class设置好,设置好后还是没有运行.
编辑 3 明显的问题消失了。但是现在我在加载引用的库时遇到了问题。我正在使用 PircBotX,当你 运行 jar 文件时(使用 String[] parm = {"java", "launch_gdbotbin.jar", "gd.bot.main.BotHandler"})它抛出 ClassNotFoundException .
编辑 4 即使在我按照 Micheal Markidis 的建议进行操作后,它又开始给我提示无主要清单属性错误。
我实际上可以得到你的代码 运行:
我为环境所做的更改:
- 我把写设置文件的代码拿出来了
我把移动的代码拿出来了
Files.move(targetFile.getAbsoluteFile().toPath(), 新文件(System.getProperty("user.home") + "\AppData\Local\GDRQ\bin\launch_gdbotbin.jar"). toPath(), StandardCopyOption.REPLACE_EXISTING);
您需要
String[] parm = {"java", "-jar", System.getProperty("user.home") + "path/to/your/file/launch_gdbotbin.jar"};
我知道了
- 我会尝试复制我所做的,然后逐步放回我删除的其他代码片段。
注意:暂时每次手动删除launch_gdbotbin.jar即可。
我对这个问题很困惑。 运行这段代码前几次都没有,但之后,我就再也无法运行ning了。它只有在使用我的 Java 代码下载后才会中断。我的代码从我的网站下载了一个 jar 文件,然后使用 ProcessBuilder 运行 它。前几次一切正常,但我 运行 再试了几次,它开始给我
no main manifest attribute, in ...\AppData\Local\GDRQ\bin\launch_gdbotbin.jar
这是我用来下载的 java 代码和 运行 jar 文件:
try {
System.out.println("starting update...");
File targetFile = new File(System.getProperty("user.home") + "\AppData\Local\GDRQ\downloading\launch_gdbotbin.jar");
URL downloadUrl = new URL("http://www.dropmoose.com/gdbotpro/launch_gdbotbin.jar");
InputStream inStream = downloadUrl.openStream();
//System.out.println(inStream.available());
BufferedInputStream bufIn = new BufferedInputStream(inStream);
OutputStream out = new FileOutputStream(targetFile);
BufferedOutputStream bufOut = new BufferedOutputStream(out);
byte[] buffer = new byte[inStream.available()];
while (true) {
int nRead = bufIn.read(buffer, 0, buffer.length);
if (nRead <= 0) {
break;
}
bufOut.write(buffer, 0, nRead);
}
bufOut.flush();
out.close();
inStream.close();
BufferedWriter bw = new BufferedWriter(new FileWriter(settingsFile));
for (int i = 0; i < settings.size(); i++) {
bw.write(settings.get(i));
bw.newLine();
}
bw.close();
System.out.println("update successful");
infoPane.dispose();
System.out.println("cleaning up...");
Files.move(targetFile.getAbsoluteFile().toPath(), new File(System.getProperty("user.home") + "\AppData\Local\GDRQ\bin\launch_gdbotbin.jar").toPath(), StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
JOptionPane.showConfirmDialog(null, "An error occured (code 14): Unable to update!");
infoPane.dispose();
}
String[] parm = {"jar", "-jar", System.getProperty("user.home") + "\AppData\Local\GDRQ\bin\launch_gdbotbin.jar"};
ProcessBuilder pb = new ProcessBuilder(parm);
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
try {
pb.start();
} catch (IOException e) {
e.printStackTrace();
}
我尝试使用 main(String[] args) 方法和 Manifest-Version: 1.0 创建一个 Class-Path 作为 class 的 MANIFEST.MF 文件,但它仍然没有工作。我做错了什么,为什么我的 manifest.mf 文件不起作用?代码下载的jar也有125KB左右,原来是2.5MB。
EDIT 如果你去下载jar文件的代码中的url然后运行它,它运行s非常好。
EDIT 2 我什至尝试使用 WinRAR 进入下载的 jar 文件并手动更改 META-INF/MANIFEST.MF 文件以具有 Main-Class设置好,设置好后还是没有运行.
编辑 3 明显的问题消失了。但是现在我在加载引用的库时遇到了问题。我正在使用 PircBotX,当你 运行 jar 文件时(使用 String[] parm = {"java", "launch_gdbotbin.jar", "gd.bot.main.BotHandler"})它抛出 ClassNotFoundException .
编辑 4 即使在我按照 Micheal Markidis 的建议进行操作后,它又开始给我提示无主要清单属性错误。
我实际上可以得到你的代码 运行:
我为环境所做的更改:
- 我把写设置文件的代码拿出来了
我把移动的代码拿出来了
Files.move(targetFile.getAbsoluteFile().toPath(), 新文件(System.getProperty("user.home") + "\AppData\Local\GDRQ\bin\launch_gdbotbin.jar"). toPath(), StandardCopyOption.REPLACE_EXISTING);
您需要
String[] parm = {"java", "-jar", System.getProperty("user.home") + "path/to/your/file/launch_gdbotbin.jar"};
我知道了
- 我会尝试复制我所做的,然后逐步放回我删除的其他代码片段。
注意:暂时每次手动删除launch_gdbotbin.jar即可。